/*!*************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./vendor/symfony/ux-live-component/assets/dist/live.min.css ***!
  \*************************************************************************************************************************************/
[data-loading=""],[data-loading=show],[data-loading*=\|show]{display:none}
/*!*************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./assets/styles/app.css ***!
  \*************************************************************************************************/
body {
    background-color: white;
}

/*!**********************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./assets/vue/Search.vue?vue&type=style&index=0&id=0fe08b42&scoped=true&lang=css ***!
  \**********************************************************************************************************************************************************************************************************************************************************************/

.container[data-v-0fe08b42] {
  max-width: 400px;
  margin: 0 auto;
  font-family: sans-serif;
}
.lien-search[data-v-0fe08b42] {font-size: 12px; text-decoration: none;}
input[data-v-0fe08b42] {
  padding: 5px;
  flex-grow: 1;
}
button[data-v-0fe08b42] {
  margin-top: 20px;
  padding: 10px 20px;
  cursor: pointer;
}

/*!***************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./assets/vue/TableauMap2.vue?vue&type=style&index=0&id=3ee031d1&lang=css ***!
  \***************************************************************************************************************************************************************************************************************************************************************/

:deep(tr.my-custom-highlight) {
    /*background: #fcd9a5 !important;*/
    /*font-weight: bold;*/
}
.p-datatable-thead > tr > th  {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    padding-right: 0px !important;
    padding-left: 4px !important;
}
.p-datatable-header-cell   {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    padding-right: 0px !important;
    padding-left: 4px !important;
}
.p-datatable-frozen-tbody > tr > td {
  /*background-color: #c8e3fe !important; */
  font-weight: bold;
  color: blue !important;
}
.dp__input, .dp__main{width: 250px !important;display: inline-block;}
#infosTabs {background-color: grey;padding: 5px;}
.infosTab {height:300px; overflow-y: auto;background-color: #ffffff;}
.hide-select-all th > .p-checkbox {
    display: none;
}
.p-toggleswitch-slider[data-p="checked"] {background-color: red !important;}
.dropdown-content {background-color: #fff; z-index: 1000 !important;}
select {max-width: 120px;}
button {}
.btntel {width: 150px !important; font-size:12px;height : 20px !important;padding: 2px !important;}
.btntel2 {width: 40px !important; line-height: 20px; text-align: center;font-size:12px;height : 20px !important;padding: 2px !important;}
.font-blue {font-weight: bold; color: rgb(3, 253, 74);}

/*!************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./assets/vue/Creneau2.vue?vue&type=style&index=0&id=cb3c0470&lang=css ***!
  \************************************************************************************************************************************************************************************************************************************************************/

.bloc-creneau-date {display: flex;flex-direction: column;}
.p-tab {padding-bottom: 2px !important;padding-top: 2px !important;}
.flexcolumn {display: flex !important;flex-direction: row !important;}
.creneau-ident {height: 52px;}
.agent-nom {position: sticky !important;}
.creneau-desactiver {position: absolute; top: 2px; right:2px;}
.calendar-container {
  overflow: auto;
  max-height: 80vh; /* Scroll vertical si beaucoup de dates */
  border: 1px solid #ddd;
}
table {
  border-collapse: separate; /* Important pour le sticky */
  border-spacing: 0;
  width: 100%;
}
.calendar-container th, .calendar-container td {
  border: 1px solid #eee;
  padding: 2px;
  text-align: center;
  vertical-align: top;
  min-width: 100px;
}

/* Fixer l'en-tête en haut */
.sticky-header {
  position: sticky !important;
  top: 0;
  background: #f8f9fa !important;
  z-index: 10;
  box-shadow: 0 2px 2px -1px rgba(0,0,0,0.1);
}

/* Fixer la colonne des dates à gauche */
.sticky-col {
  position: sticky;
  left: 0;
  background: #fff;
  z-index: 11;
  border-right: 2px solid #ddd;
}

/* Cellule d'angle (haut-gauche) : doit être au dessus de tout */
th.sticky-col.sticky-header {
  z-index: 20;
  background: #ececec;
}
.date-column {
  background-color: #f9f9f9;
}
.date-label {
  text-transform: capitalize;
  font-weight: bold;
  color: #666;
  font-size: 14px;
}
.date-value {
  font-weight: bold;
  color: #333;
}
/* Structure de la carte de créneau */
.slot-cell {
  position: relative; /* Nécessaire pour le z-index */
  transition: z-index 0.2s;
}
.slot-cell:hover {
  z-index: 50; /* Passe au-dessus des autres cellules et des headers sticky */
}
/* --- FIX VISIBILITÉ --- */
.slot-cell {
  position: relative; /* Nécessaire pour le z-index */
  transition: z-index 0.2s;
}
.slot-cell:hover {
  z-index: 50; /* Passe au-dessus des autres cellules et des headers sticky */
}

/* --- DESIGN DE LA CARTE --- */
.slot-badge {
  background: #ffffff;
  border: 1px solid #e5e7eb;
  border-radius: 6px;
  padding: 8px;
  margin-bottom: 6px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.5);
  min-width: 160px;
}
.slot-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 2px;
  border-bottom: 1px dotted #ccc;
  padding-bottom: 2px;
}
.time {
  font-weight: bold;
  font-size: 0.85rem;
  color: #2563eb;
}
.tranche-total {
  font-size: 0.75rem;
  background: #f3f4f6;
  padding: 0px;
  border-radius: 4px;
  color: #4b5563;
}
.slot-body {
  display: flex;
  flex-direction: column; /* Organisation verticale des stats */
  gap: 2px;
  margin-bottom: 0px;
}
.stat-item {
  display: flex;
  align-items: center;
  gap: 5px;
  font-size: 12px;
}
.icon {
  font-size: 0.9rem;
}
.value {
  font-weight: 500;
  color: #1f2937;
}
.slot-footer {
position: relative;
  display: flex;
}
.slot-date {
  font-size: 0.7rem;
  color: #9ca3af;
}

/* --- STYLE DU POPUP --- */
.info-wrapper {
  position: relative;
  display: flex;
  justify-content: space-between;
  cursor: help;
}
.info-trigger {
  font-size: 1rem;
  opacity: 0.6;
}
.info-trigger:hover {
  opacity: 1;
}
.info-popup {
  display: none;
  position: fixed !important;
  top: calc(100vh - 400px); /* S'affiche au-dessus de l'icône */
  left: 10px;
  width: 250px !important;
  height: auto;
  background: #1f2937; /* Fond sombre moderne */
  color: white;
  padding: 10px !important;
  border-radius: 8px;
  box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.3);
  z-index: 10000;
  pointer-events: none; /* Pour ne pas gêner la souris */
  font-size: 0.8rem;
  line-height: 1.4;
  text-align: left;
  vertical-align: bottom;
}
.popup-title {
  font-weight: bold;
  margin-bottom: 5px;
  color: #60a5fa;
}
.info-popup hr {
  border: 0;
  border-top: 1px solid #374151;
  margin: 5px 0;
}
.info-wrapper:hover .info-popup {
  display: block; /* Affiche la bulle au survol */
}

/* Petit triangle en bas de la bulle */
.info-popup2::after {
  content: "";
  position: absolute;
  top: 100%;
  right: 10px;
  border-width: 6px;
  border-style: solid;
  border-color: #1f2937 transparent transparent transparent;
}
.green {font-size: 14px; background-color: #fff !important;color: rgb(3, 253, 74) !important;font-weight: bold;}
.empty-cell {
  color: #ddd;
}
.creneau-complet {background-color: #d7d7d7 !important;}
.alerte-rouge {font-size: 14px !important; color: red !important;padding: 0px;}

/*!*********************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./assets/vue/Param.vue?vue&type=style&index=0&id=3e4572b4&scoped=true&lang=css ***!
  \*********************************************************************************************************************************************************************************************************************************************************************/

.container[data-v-3e4572b4] {
  max-width: 400px;
  margin: 0 auto;
  font-family: sans-serif;
}
#paramButton[data-v-3e4572b4] {display: inline-block;}
#paramButton > button[data-v-3e4572b4] {height: 30px;}
.form-group[data-v-3e4572b4] {
  display: flex;
  align-items: center;
  margin-bottom: 10px;
  gap: 10px;
}
label[data-v-3e4572b4] {
  font-weight: bold;
  width: 60px;
}
input[data-v-3e4572b4] {
  padding: 5px;
  flex-grow: 1;
}
button[data-v-3e4572b4] {
  cursor: pointer;
}

/*!************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./assets/vue/Messages.vue?vue&type=style&index=0&id=1f36d843&lang=css ***!
  \************************************************************************************************************************************************************************************************************************************************************/

:deep(tr.my-custom-highlight) {
    /*background: #fcd9a5 !important;*/
    /*font-weight: bold;*/
}
.p-datatable-thead > tr > th  {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    padding-right: 0px !important;
    padding-left: 4px !important;
}
.p-datatable-header-cell   {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    padding-right: 0px !important;
    padding-left: 4px !important;
}
select {max-width: 120px;}

/*!******************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./assets/vue/SearchStandard.vue?vue&type=style&index=0&id=9c086088&lang=css ***!
  \******************************************************************************************************************************************************************************************************************************************************************/

.suggestions {
  position: absolute;
  top: 25px;
  background: #fff;
  list-style: none;
  padding: 0;
  margin: 0;
  border: 1px solid #ccc;
  max-height: 150px;
  overflow-y: auto;
  z-index: 10;
  width: auto;
}
.suggestions li {
  padding: 8px;
  cursor: pointer;
  color:#000000;
}
.suggestions li:hover {
  background: #eee;
}
.help-text {
  font-size: 0.8em;
  color: #666;
}
FloatLabel .p-inputtext {max-width: 200px !important;width: 200px !important}


/*!*******************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./assets/vue/TableauStandard.vue?vue&type=style&index=0&id=7571d590&lang=css ***!
  \*******************************************************************************************************************************************************************************************************************************************************************/

:deep(tr.my-custom-highlight) {
    /*background: #fcd9a5 !important;*/
    /*font-weight: bold;*/
}
.p-datatable-thead > tr > th  {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    padding-right: 0px !important;
    padding-left: 4px !important;
}
.p-datatable-header-cell   {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    padding-right: 0px !important;
    padding-left: 4px !important;
}
.p-datatable-frozen-tbody > tr > td {
  /*background-color: #c8e3fe !important; */
  font-weight: bold;
  color: blue !important;
}
#header-app {z-index: 10;}
.dp__input, .dp__main{width: 250px !important;display: inline-block;}
#infosTabs {background-color: grey;padding: 5px;}
.infosTab {height:300px; overflow-y: auto;background-color: #ffffff;}
.hide-select-all th > .p-checkbox {
    display: none;
}
#panelsearch {width:100%; display: flex; justify-content:center;}
.btntel {width: 150px !important; font-size:12px;height : 20px !important;padding: 2px !important;}
.btntel2 {width: 40px !important; line-height: 20px; text-align: center;font-size:12px;height : 20px !important;padding: 2px !important;}
.link {color: blue;text-decoration: underline;}
.font-blue {font-weight: bold; color: rgb(3, 253, 74);}


/*!*******************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./assets/vue/CreneauStandard.vue?vue&type=style&index=0&id=40701d92&lang=css ***!
  \*******************************************************************************************************************************************************************************************************************************************************************/

.bloc-creneau-date {display: flex;flex-direction: column;}
.p-tab {padding-bottom: 2px !important;padding-top: 2px !important;}
.flexcolumn {display: flex !important;flex-direction: row !important;}
.creneau-ident {height: 52px;}
.agent-nom {position: sticky !important;}
.creneau-desactiver {position: absolute; top: 2px; right:2px;}
.calendar-container {
  overflow: auto;
  max-height: 80vh; /* Scroll vertical si beaucoup de dates */
  border: 1px solid #ddd;
  width: 100%;
}
table {
  border-collapse: separate; /* Important pour le sticky */
  border-spacing: 0;
  width: 100%;
}
.calendar-container th, .calendar-container td {
  border: 1px solid #eee;
  padding: 2px;
  text-align: center;
  vertical-align: top;
  min-width: 100px;
}

/* Fixer l'en-tête en haut */
.sticky-header {
  position: sticky !important;
  top: 0;
  background: #f8f9fa !important;
  z-index: 10;
  box-shadow: 0 2px 2px -1px rgba(0,0,0,0.1);
}

/* Fixer la colonne des dates à gauche */
.sticky-col {
  position: sticky;
  left: 0;
  background: #fff;
  z-index: 11;
  border-right: 2px solid #ddd;
}

/* Cellule d'angle (haut-gauche) : doit être au dessus de tout */
th.sticky-col.sticky-header {
  z-index: 20;
  background: #ececec;
}
.date-column {
  background-color: #f9f9f9;
}
.date-label {
  text-transform: capitalize;
  font-weight: bold;
  color: #666;
  font-size: 14px;
}
.date-value {
  font-weight: bold;
  color: #333;
}
/* Structure de la carte de créneau */
.slot-cell {
  position: relative; /* Nécessaire pour le z-index */
  transition: z-index 0.2s;
}
.slot-cell:hover {
  z-index: 50; /* Passe au-dessus des autres cellules et des headers sticky */
}
/* --- FIX VISIBILITÉ --- */
.slot-cell {
  position: relative; /* Nécessaire pour le z-index */
  transition: z-index 0.2s;
}
.slot-cell:hover {
  z-index: 50; /* Passe au-dessus des autres cellules et des headers sticky */
}

/* --- DESIGN DE LA CARTE --- */
.slot-badge {
  background: #ffffff;
  border: 1px solid #e5e7eb;
  border-radius: 6px;
  padding: 4px;
  margin-bottom: 6px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.5);
  min-width: 130px;
  height: 90px;
}
.slot-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 2px;
  border-bottom: 1px dotted #ccc;
  padding-bottom: 2px;
}
.time {
  font-weight: bold;
  font-size: 0.85rem;
  color: #2563eb;
}
.tranche-total {
  font-size: 0.75rem;
  background: #f3f4f6;
  padding: 0px;
  border-radius: 4px;
  color: #4b5563;
}
.slot-body {
  display: flex;
  flex-direction: column; /* Organisation verticale des stats */
  gap: 2px;
  margin-bottom: 0px;
}
.stat-item {
  display: flex;
  align-items: center;
  gap: 5px;
  font-size: 12px;
}
.icon {
  font-size: 0.9rem;
}
.value {
  font-weight: 500;
  color: #1f2937;
}
.slot-footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.slot-date {
  font-size: 0.7rem;
  color: #9ca3af;
}

/* --- STYLE DU POPUP --- */
.info-wrapper {
  position: relative;
  cursor: help;
}
.info-trigger {
  font-size: 1rem;
  opacity: 0.6;
}
.info-trigger:hover {
  opacity: 1;
}
.info-popup {
  display: none;
  position: fixed !important;
  top: calc(100vh - 400px); /* S'affiche au-dessus de l'icône */
  left: 10px;
  width: 250px !important;
  height: auto;
  background: #1f2937; /* Fond sombre moderne */
  color: white;
  padding: 10px !important;
  border-radius: 8px;
  box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.3);
  z-index: 10000;
  pointer-events: none; /* Pour ne pas gêner la souris */
  font-size: 0.8rem;
  line-height: 1.4;
  text-align: left;
  vertical-align: bottom;
}
.popup-title {
  font-weight: bold;
  margin-bottom: 5px;
  color: #60a5fa;
}
.info-popup hr {
  border: 0;
  border-top: 1px solid #374151;
  margin: 5px 0;
}
.info-wrapper:hover .info-popup {
  display: block; /* Affiche la bulle au survol */
}

/* Petit triangle en bas de la bulle */
.info-popup2::after {
  content: "";
  position: absolute;
  top: 100%;
  right: 10px;
  border-width: 6px;
  border-style: solid;
  border-color: #1f2937 transparent transparent transparent;
}
.green {font-size: 14px; background-color: #fff !important;color: rgb(3, 253, 74) !important;font-weight: bold;}
.empty-cell {
  color: #ddd;
}
.creneau-complet {background-color: #d7d7d7 !important;}
.alerte-rouge {font-size: 14px !important; color: red !important;padding: 0px;}

/*!*****************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./assets/vue/TableauPlanif.vue?vue&type=style&index=0&id=124e4e7e&lang=css ***!
  \*****************************************************************************************************************************************************************************************************************************************************************/

:deep(tr.my-custom-highlight) {
    /*background: #fcd9a5 !important;*/
    /*font-weight: bold;*/
}
.p-datatable-thead > tr > th  {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    padding-right: 0px !important;
    padding-left: 4px !important;
}
.p-datatable-header-cell   {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    padding-right: 0px !important;
    padding-left: 4px !important;
}
.p-datatable-frozen-tbody > tr > td {
  /*background-color: #c8e3fe !important; */
  font-weight: bold;
  color: blue !important;
}
.dp__input, .dp__main{width: 250px !important;display: inline-block;}
#infosTabs {background-color: grey;padding: 5px;}
.infosTab {height:300px; overflow-y: auto;background-color: #ffffff;}
.hide-select-all th > .p-checkbox {
    display: none;
}
.p-toggleswitch-slider[data-p="checked"] {background-color: red !important;}
.dropdown-content {background-color: #fff; z-index: 1000 !important;}
select {max-width: 120px;}
button {}
.btntel {width: 150px !important; font-size:12px;height : 20px !important;padding: 2px !important;}
.btntel2 {width: 40px !important; line-height: 20px; text-align: center;font-size:12px;height : 20px !important;padding: 2px !important;}
.btnsms {width: 150px !important; font-size:12px;height : 50px !important;padding: 2px !important;}
.font-blue {font-weight: bold; color: rgb(3, 253, 74);}
.p-datatable-column-header-content input[type="text"] {max-width: 100px !important;}

/*!*****************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./assets/vue/CreneauPlanif.vue?vue&type=style&index=0&id=678ea880&lang=css ***!
  \*****************************************************************************************************************************************************************************************************************************************************************/

.bloc-creneau-date {display: flex;flex-direction: column;}
.p-tab {padding-bottom: 2px !important;padding-top: 2px !important;}
.flexcolumn {display: flex !important;flex-direction: row !important;}
.creneau-ident {height: 52px;}
.agent-nom {position: sticky !important;}
.creneau-desactiver {position: absolute; top: 2px; right:2px;}
.calendar-container {
  overflow: auto;
  max-height: 80vh; /* Scroll vertical si beaucoup de dates */
  border: 1px solid #ddd;
}
table {
  border-collapse: separate; /* Important pour le sticky */
  border-spacing: 0;
  width: 100%;
}
.calendar-container th, .calendar-container td {
  border: 1px solid #eee;
  padding: 2px;
  text-align: center;
  vertical-align: top;
  min-width: 100px;
}

/* Fixer l'en-tête en haut */
.sticky-header {
  position: sticky !important;
  top: 0;
  background: #f8f9fa !important;
  z-index: 10;
  box-shadow: 0 2px 2px -1px rgba(0,0,0,0.1);
}

/* Fixer la colonne des dates à gauche */
.sticky-col {
  position: sticky;
  left: 0;
  background: #fff;
  z-index: 11;
  border-right: 2px solid #ddd;
}

/* Cellule d'angle (haut-gauche) : doit être au dessus de tout */
th.sticky-col.sticky-header {
  z-index: 20;
  background: #ececec;
}
.date-column {
  background-color: #f9f9f9;
}
.date-label {
  text-transform: capitalize;
  font-weight: bold;
  color: #666;
  font-size: 14px;
}
.date-value {
  font-weight: bold;
  color: #333;
}
/* Structure de la carte de créneau */
.slot-cell {
  position: relative; /* Nécessaire pour le z-index */
  transition: z-index 0.2s;
}
.slot-cell:hover {
  z-index: 50; /* Passe au-dessus des autres cellules et des headers sticky */
}
/* --- FIX VISIBILITÉ --- */
.slot-cell {
  position: relative; /* Nécessaire pour le z-index */
  transition: z-index 0.2s;
}
.slot-cell:hover {
  z-index: 50; /* Passe au-dessus des autres cellules et des headers sticky */
}

/* --- DESIGN DE LA CARTE --- */
.slot-badge {
  background: #ffffff;
  border: 1px solid #e5e7eb;
  border-radius: 6px;
  padding: 4px;
  margin-bottom: 6px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.5);
  min-width: 130px;
  height: 90px;
}
.slot-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 2px;
  border-bottom: 1px dotted #ccc;
  padding-bottom: 2px;
}
.time {
  font-weight: bold;
  font-size: 0.85rem;
  color: #2563eb;
}
.tranche-total {
  font-size: 0.75rem;
  background: #f3f4f6;
  padding: 0px;
  border-radius: 4px;
  color: #4b5563;
}
.slot-body {
  display: flex;
  flex-direction: column; /* Organisation verticale des stats */
  gap: 2px;
  margin-bottom: 0px;
}
.stat-item {
  display: flex;
  align-items: center;
  gap: 5px;
  font-size: 12px;
}
.icon {
  font-size: 0.9rem;
}
.value {
  font-weight: 500;
  color: #1f2937;
}
.slot-footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.slot-date {
  font-size: 0.7rem;
  color: #9ca3af;
}

/* --- STYLE DU POPUP --- */
.info-wrapper {
  position: relative;
  cursor: help;
}
.info-trigger {
  font-size: 1rem;
  opacity: 0.6;
}
.info-trigger:hover {
  opacity: 1;
}
.info-popup {
  display: none;
  position: fixed !important;
  top: calc(100vh - 400px); /* S'affiche au-dessus de l'icône */
  left: 10px;
  width: 250px !important;
  height: auto;
  background: #1f2937; /* Fond sombre moderne */
  color: white;
  padding: 10px !important;
  border-radius: 8px;
  box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.3);
  z-index: 10000;
  pointer-events: none; /* Pour ne pas gêner la souris */
  font-size: 0.8rem;
  line-height: 1.4;
  text-align: left;
  vertical-align: bottom;
}
.popup-title {
  font-weight: bold;
  margin-bottom: 5px;
  color: #60a5fa;
}
.info-popup hr {
  border: 0;
  border-top: 1px solid #374151;
  margin: 5px 0;
}
.info-wrapper:hover .info-popup {
  display: block; /* Affiche la bulle au survol */
}

/* Petit triangle en bas de la bulle */
.info-popup2::after {
  content: "";
  position: absolute;
  top: 100%;
  right: 10px;
  border-width: 6px;
  border-style: solid;
  border-color: #1f2937 transparent transparent transparent;
}
.green {font-size: 14px; background-color: #fff !important;color: rgb(3, 253, 74) !important;font-weight: bold;}
.empty-cell {
  color: #ddd;
}
.creneau-complet {background-color: #d7d7d7 !important;}
.alerte-rouge {font-size: 14px !important; color: red !important;padding: 0px;}

/*!************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./assets/vue/Planning.vue?vue&type=style&index=0&id=160a6458&lang=css ***!
  \************************************************************************************************************************************************************************************************************************************************************/

:deep(tr.my-custom-highlight) {
    /*background: #fcd9a5 !important;*/
    /*font-weight: bold;*/
}
.p-datatable-thead > tr > th  {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    padding-right: 0px !important;
    padding-left: 4px !important;
}
.p-datatable-header-cell   {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    padding-right: 0px !important;
    padding-left: 4px !important;
}
select {max-width: 120px;}

/*!*************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./assets/vue/Exclusion.vue?vue&type=style&index=0&id=2d7f7ae7&lang=css ***!
  \*************************************************************************************************************************************************************************************************************************************************************/

:deep(tr.my-custom-highlight) {
    /*background: #fcd9a5 !important;*/
    /*font-weight: bold;*/
}
.p-datatable-thead > tr > th  {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    padding-right: 0px !important;
    padding-left: 4px !important;
}
.p-datatable-header-cell   {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    padding-right: 0px !important;
    padding-left: 4px !important;
}
select {max-width: 120px;}


/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmNzcyIsIm1hcHBpbmdzIjoiOzs7QUFBQSw2REFBNkQsWUFBWSxDOzs7O0FDQXpFO0lBQ0ksdUJBQXVCO0FBQzNCOzs7Ozs7QUNpSUE7RUFDRSxnQkFBZ0I7RUFDaEIsY0FBYztFQUNkLHVCQUF1QjtBQUN6QjtBQUNBLCtCQUFjLGVBQWUsRUFBRSxxQkFBcUIsQ0FBQztBQUNyRDtFQUNFLFlBQVk7RUFDWixZQUFZO0FBQ2Q7QUFDQTtFQUNFLGdCQUFnQjtFQUNoQixrQkFBa0I7RUFDbEIsZUFBZTtBQUNqQjs7Ozs7O0FDeXZDQTtJQUNJLGtDQUFrQztJQUNsQyxxQkFBcUI7QUFDekI7QUFDQTtJQUNJLDJCQUEyQjtJQUMzQiw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtBQUNoQztBQUNBO0lBQ0ksMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5Qiw2QkFBNkI7SUFDN0IsNEJBQTRCO0FBQ2hDO0FBQ0E7RUFDRSx5Q0FBeUM7RUFDekMsaUJBQWlCO0VBQ2pCLHNCQUFzQjtBQUN4QjtBQUNBLHNCQUFzQix1QkFBdUIsQ0FBQyxxQkFBcUIsQ0FBQztBQUNwRSxZQUFZLHNCQUFzQixDQUFDLFlBQVksQ0FBQztBQUNoRCxXQUFXLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQztBQUVwRTtJQUNJLGFBQWE7QUFDakI7QUFDQSwwQ0FBMEMsZ0NBQWdDLENBQUM7QUFFM0UsbUJBQW1CLHNCQUFzQixFQUFFLHdCQUF3QixDQUFDO0FBRXBFLFFBQVEsZ0JBQWdCLENBQUM7QUFDekIsUUFBUTtBQUNSLFNBQVMsdUJBQXVCLEVBQUUsY0FBYyxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUFDO0FBQ2xHLFVBQVUsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUFDO0FBQ3hJLFlBQVksaUJBQWlCLEVBQUUsc0JBQXNCLENBQUM7Ozs7OztBQ3ZtQ3RELG9CQUFvQixhQUFhLENBQUMsc0JBQXNCLENBQUM7QUFDekQsUUFBUSw4QkFBOEIsQ0FBQywyQkFBMkIsQ0FBQztBQUNuRSxhQUFhLHdCQUF3QixDQUFDLDhCQUE4QixDQUFDO0FBQ3JFLGdCQUFnQixZQUFZLENBQUM7QUFDN0IsWUFBWSwyQkFBMkIsQ0FBQztBQUN4QyxxQkFBcUIsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQztBQUU3RDtFQUNFLGNBQWM7RUFDZCxnQkFBZ0IsRUFBRSx5Q0FBeUM7RUFDM0Qsc0JBQXNCO0FBQ3hCO0FBRUE7RUFDRSx5QkFBeUIsRUFBRSw2QkFBNkI7RUFDeEQsaUJBQWlCO0VBQ2pCLFdBQVc7QUFDYjtBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLGdCQUFnQjtBQUNsQjs7QUFFQSw0QkFBNEI7QUFDNUI7RUFDRSwyQkFBMkI7RUFDM0IsTUFBTTtFQUNOLDhCQUE4QjtFQUM5QixXQUFXO0VBQ1gsMENBQTBDO0FBQzVDOztBQUVBLHdDQUF3QztBQUN4QztFQUNFLGdCQUFnQjtFQUNoQixPQUFPO0VBQ1AsZ0JBQWdCO0VBQ2hCLFdBQVc7RUFDWCw0QkFBNEI7QUFDOUI7O0FBRUEsZ0VBQWdFO0FBQ2hFO0VBQ0UsV0FBVztFQUNYLG1CQUFtQjtBQUNyQjtBQUVBO0VBQ0UseUJBQXlCO0FBQzNCO0FBRUE7RUFDRSwwQkFBMEI7RUFDMUIsaUJBQWlCO0VBQ2pCLFdBQVc7RUFDWCxlQUFlO0FBQ2pCO0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsV0FBVztBQUNiO0FBQ0EscUNBQXFDO0FBQ3JDO0VBQ0Usa0JBQWtCLEVBQUUsK0JBQStCO0VBQ25ELHdCQUF3QjtBQUMxQjtBQUVBO0VBQ0UsV0FBVyxFQUFFLDhEQUE4RDtBQUM3RTtBQUNBLDJCQUEyQjtBQUMzQjtFQUNFLGtCQUFrQixFQUFFLCtCQUErQjtFQUNuRCx3QkFBd0I7QUFDMUI7QUFFQTtFQUNFLFdBQVcsRUFBRSw4REFBOEQ7QUFDN0U7O0FBRUEsK0JBQStCO0FBQy9CO0VBQ0UsbUJBQW1CO0VBQ25CLHlCQUF5QjtFQUN6QixrQkFBa0I7RUFDbEIsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixxQ0FBcUM7RUFDckMsZ0JBQWdCO0FBQ2xCO0FBRUE7RUFDRSxhQUFhO0VBQ2IsOEJBQThCO0VBQzlCLG1CQUFtQjtFQUNuQixrQkFBa0I7RUFDbEIsOEJBQThCO0VBQzlCLG1CQUFtQjtBQUNyQjtBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGtCQUFrQjtFQUNsQixjQUFjO0FBQ2hCO0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsY0FBYztBQUNoQjtBQUVBO0VBQ0UsYUFBYTtFQUNiLHNCQUFzQixFQUFFLHFDQUFxQztFQUM3RCxRQUFRO0VBQ1Isa0JBQWtCO0FBQ3BCO0FBRUE7RUFDRSxhQUFhO0VBQ2IsbUJBQW1CO0VBQ25CLFFBQVE7RUFDUixlQUFlO0FBQ2pCO0FBRUE7RUFDRSxpQkFBaUI7QUFDbkI7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixjQUFjO0FBQ2hCO0FBRUE7QUFDQSxrQkFBa0I7RUFDaEIsYUFBYTtBQUNmO0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsY0FBYztBQUNoQjs7QUFFQSwyQkFBMkI7QUFDM0I7RUFDRSxrQkFBa0I7RUFDbEIsYUFBYTtFQUNiLDhCQUE4QjtFQUM5QixZQUFZO0FBQ2Q7QUFFQTtFQUNFLGVBQWU7RUFDZixZQUFZO0FBQ2Q7QUFFQTtFQUNFLFVBQVU7QUFDWjtBQUVBO0VBQ0UsYUFBYTtFQUNiLDBCQUEwQjtFQUMxQix3QkFBd0IsRUFBRSxtQ0FBbUM7RUFDN0QsVUFBVTtFQUNWLHVCQUF1QjtFQUN2QixZQUFZO0VBQ1osbUJBQW1CLEVBQUUsd0JBQXdCO0VBQzdDLFlBQVk7RUFDWix3QkFBd0I7RUFDeEIsa0JBQWtCO0VBQ2xCLCtDQUErQztFQUMvQyxjQUFjO0VBQ2Qsb0JBQW9CLEVBQUUsZ0NBQWdDO0VBQ3RELGlCQUFpQjtFQUNqQixnQkFBZ0I7RUFDaEIsZ0JBQWdCO0VBQ2hCLHNCQUFzQjtBQUN4QjtBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGtCQUFrQjtFQUNsQixjQUFjO0FBQ2hCO0FBRUE7RUFDRSxTQUFTO0VBQ1QsNkJBQTZCO0VBQzdCLGFBQWE7QUFDZjtBQUVBO0VBQ0UsY0FBYyxFQUFFLCtCQUErQjtBQUNqRDs7QUFFQSxzQ0FBc0M7QUFDdEM7RUFDRSxXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLFNBQVM7RUFDVCxXQUFXO0VBQ1gsaUJBQWlCO0VBQ2pCLG1CQUFtQjtFQUNuQix5REFBeUQ7QUFDM0Q7QUFDQSxRQUFRLGVBQWUsRUFBRSxpQ0FBaUMsQ0FBQyxpQ0FBaUMsQ0FBQyxpQkFBaUIsQ0FBQztBQUMvRztFQUNFLFdBQVc7QUFDYjtBQUNBLGtCQUFrQixvQ0FBb0MsQ0FBQztBQUN2RCxlQUFlLDBCQUEwQixFQUFFLHFCQUFxQixDQUFDLFlBQVksQ0FBQzs7Ozs7O0FDamE5RTtFQUNFLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2QsdUJBQXVCO0FBQ3pCO0FBQ0EsK0JBQWMscUJBQXFCLENBQUM7QUFDcEMsd0NBQXVCLFlBQVksQ0FBQztBQUNwQztFQUNFLGFBQWE7RUFDYixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLFNBQVM7QUFDWDtBQUNBO0VBQ0UsaUJBQWlCO0VBQ2pCLFdBQVc7QUFDYjtBQUNBO0VBQ0UsWUFBWTtFQUNaLFlBQVk7QUFDZDtBQUNBO0VBQ0UsZUFBZTtBQUNqQjs7Ozs7O0FDNnpCQTtJQUNJLGtDQUFrQztJQUNsQyxxQkFBcUI7QUFDekI7QUFDQTtJQUNJLDJCQUEyQjtJQUMzQiw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtBQUNoQztBQUNBO0lBQ0ksMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5Qiw2QkFBNkI7SUFDN0IsNEJBQTRCO0FBQ2hDO0FBQ0EsUUFBUSxnQkFBZ0IsQ0FBQzs7Ozs7O0FDcHBCekI7RUFDRSxrQkFBa0I7RUFDbEIsU0FBUztFQUNULGdCQUFnQjtFQUNoQixnQkFBZ0I7RUFDaEIsVUFBVTtFQUNWLFNBQVM7RUFDVCxzQkFBc0I7RUFDdEIsaUJBQWlCO0VBQ2pCLGdCQUFnQjtFQUNoQixXQUFXO0VBQ1gsV0FBVztBQUNiO0FBQ0E7RUFDRSxZQUFZO0VBQ1osZUFBZTtFQUNmLGFBQWE7QUFDZjtBQUNBO0VBQ0UsZ0JBQWdCO0FBQ2xCO0FBQ0E7RUFDRSxnQkFBZ0I7RUFDaEIsV0FBVztBQUNiO0FBQ0EseUJBQXlCLDJCQUEyQixDQUFDLHVCQUF1Qjs7Ozs7OztBQ3dtQjVFO0lBQ0ksa0NBQWtDO0lBQ2xDLHFCQUFxQjtBQUN6QjtBQUNBO0lBQ0ksMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5Qiw2QkFBNkI7SUFDN0IsNEJBQTRCO0FBQ2hDO0FBQ0E7SUFDSSwyQkFBMkI7SUFDM0IsOEJBQThCO0lBQzlCLDZCQUE2QjtJQUM3Qiw0QkFBNEI7QUFDaEM7QUFDQTtFQUNFLHlDQUF5QztFQUN6QyxpQkFBaUI7RUFDakIsc0JBQXNCO0FBQ3hCO0FBQ0EsYUFBYSxXQUFXLENBQUM7QUFDekIsc0JBQXNCLHVCQUF1QixDQUFDLHFCQUFxQixDQUFDO0FBRXBFLFlBQVksc0JBQXNCLENBQUMsWUFBWSxDQUFDO0FBQ2hELFdBQVcsWUFBWSxFQUFFLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDO0FBRXBFO0lBQ0ksYUFBYTtBQUNqQjtBQUNBLGNBQWMsVUFBVSxFQUFFLGFBQWEsRUFBRSxzQkFBc0IsQ0FBQztBQUNoRSxTQUFTLHVCQUF1QixFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQztBQUNsRyxVQUFVLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQztBQUN4SSxPQUFPLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQztBQUM5QyxZQUFZLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDOzs7Ozs7O0FDaHJCdEQsb0JBQW9CLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztBQUN6RCxRQUFRLDhCQUE4QixDQUFDLDJCQUEyQixDQUFDO0FBQ25FLGFBQWEsd0JBQXdCLENBQUMsOEJBQThCLENBQUM7QUFDckUsZ0JBQWdCLFlBQVksQ0FBQztBQUM3QixZQUFZLDJCQUEyQixDQUFDO0FBQ3hDLHFCQUFxQixrQkFBa0IsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDO0FBRTdEO0VBQ0UsY0FBYztFQUNkLGdCQUFnQixFQUFFLHlDQUF5QztFQUMzRCxzQkFBc0I7RUFDdEIsV0FBVztBQUNiO0FBRUE7RUFDRSx5QkFBeUIsRUFBRSw2QkFBNkI7RUFDeEQsaUJBQWlCO0VBQ2pCLFdBQVc7QUFDYjtBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLGdCQUFnQjtBQUNsQjs7QUFFQSw0QkFBNEI7QUFDNUI7RUFDRSwyQkFBMkI7RUFDM0IsTUFBTTtFQUNOLDhCQUE4QjtFQUM5QixXQUFXO0VBQ1gsMENBQTBDO0FBQzVDOztBQUVBLHdDQUF3QztBQUN4QztFQUNFLGdCQUFnQjtFQUNoQixPQUFPO0VBQ1AsZ0JBQWdCO0VBQ2hCLFdBQVc7RUFDWCw0QkFBNEI7QUFDOUI7O0FBRUEsZ0VBQWdFO0FBQ2hFO0VBQ0UsV0FBVztFQUNYLG1CQUFtQjtBQUNyQjtBQUVBO0VBQ0UseUJBQXlCO0FBQzNCO0FBRUE7RUFDRSwwQkFBMEI7RUFDMUIsaUJBQWlCO0VBQ2pCLFdBQVc7RUFDWCxlQUFlO0FBQ2pCO0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsV0FBVztBQUNiO0FBQ0EscUNBQXFDO0FBQ3JDO0VBQ0Usa0JBQWtCLEVBQUUsK0JBQStCO0VBQ25ELHdCQUF3QjtBQUMxQjtBQUVBO0VBQ0UsV0FBVyxFQUFFLDhEQUE4RDtBQUM3RTtBQUNBLDJCQUEyQjtBQUMzQjtFQUNFLGtCQUFrQixFQUFFLCtCQUErQjtFQUNuRCx3QkFBd0I7QUFDMUI7QUFFQTtFQUNFLFdBQVcsRUFBRSw4REFBOEQ7QUFDN0U7O0FBRUEsK0JBQStCO0FBQy9CO0VBQ0UsbUJBQW1CO0VBQ25CLHlCQUF5QjtFQUN6QixrQkFBa0I7RUFDbEIsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixxQ0FBcUM7RUFDckMsZ0JBQWdCO0VBQ2hCLFlBQVk7QUFDZDtBQUVBO0VBQ0UsYUFBYTtFQUNiLDhCQUE4QjtFQUM5QixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLDhCQUE4QjtFQUM5QixtQkFBbUI7QUFDckI7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixrQkFBa0I7RUFDbEIsY0FBYztBQUNoQjtBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQixZQUFZO0VBQ1osa0JBQWtCO0VBQ2xCLGNBQWM7QUFDaEI7QUFFQTtFQUNFLGFBQWE7RUFDYixzQkFBc0IsRUFBRSxxQ0FBcUM7RUFDN0QsUUFBUTtFQUNSLGtCQUFrQjtBQUNwQjtBQUVBO0VBQ0UsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQixRQUFRO0VBQ1IsZUFBZTtBQUNqQjtBQUVBO0VBQ0UsaUJBQWlCO0FBQ25CO0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsY0FBYztBQUNoQjtBQUVBO0VBQ0UsYUFBYTtFQUNiLDhCQUE4QjtFQUM5QixtQkFBbUI7QUFDckI7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixjQUFjO0FBQ2hCOztBQUVBLDJCQUEyQjtBQUMzQjtFQUNFLGtCQUFrQjtFQUNsQixZQUFZO0FBQ2Q7QUFFQTtFQUNFLGVBQWU7RUFDZixZQUFZO0FBQ2Q7QUFFQTtFQUNFLFVBQVU7QUFDWjtBQUVBO0VBQ0UsYUFBYTtFQUNiLDBCQUEwQjtFQUMxQix3QkFBd0IsRUFBRSxtQ0FBbUM7RUFDN0QsVUFBVTtFQUNWLHVCQUF1QjtFQUN2QixZQUFZO0VBQ1osbUJBQW1CLEVBQUUsd0JBQXdCO0VBQzdDLFlBQVk7RUFDWix3QkFBd0I7RUFDeEIsa0JBQWtCO0VBQ2xCLCtDQUErQztFQUMvQyxjQUFjO0VBQ2Qsb0JBQW9CLEVBQUUsZ0NBQWdDO0VBQ3RELGlCQUFpQjtFQUNqQixnQkFBZ0I7RUFDaEIsZ0JBQWdCO0VBQ2hCLHNCQUFzQjtBQUN4QjtBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGtCQUFrQjtFQUNsQixjQUFjO0FBQ2hCO0FBRUE7RUFDRSxTQUFTO0VBQ1QsNkJBQTZCO0VBQzdCLGFBQWE7QUFDZjtBQUVBO0VBQ0UsY0FBYyxFQUFFLCtCQUErQjtBQUNqRDs7QUFFQSxzQ0FBc0M7QUFDdEM7RUFDRSxXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLFNBQVM7RUFDVCxXQUFXO0VBQ1gsaUJBQWlCO0VBQ2pCLG1CQUFtQjtFQUNuQix5REFBeUQ7QUFDM0Q7QUFDQSxRQUFRLGVBQWUsRUFBRSxpQ0FBaUMsQ0FBQyxpQ0FBaUMsQ0FBQyxpQkFBaUIsQ0FBQztBQUMvRztFQUNFLFdBQVc7QUFDYjtBQUNBLGtCQUFrQixvQ0FBb0MsQ0FBQztBQUV2RCxlQUFlLDBCQUEwQixFQUFFLHFCQUFxQixDQUFDLFlBQVksQ0FBQzs7Ozs7O0FDZzZCOUU7SUFDSSxrQ0FBa0M7SUFDbEMscUJBQXFCO0FBQ3pCO0FBQ0E7SUFDSSwyQkFBMkI7SUFDM0IsOEJBQThCO0lBQzlCLDZCQUE2QjtJQUM3Qiw0QkFBNEI7QUFDaEM7QUFDQTtJQUNJLDJCQUEyQjtJQUMzQiw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtBQUNoQztBQUNBO0VBQ0UseUNBQXlDO0VBQ3pDLGlCQUFpQjtFQUNqQixzQkFBc0I7QUFDeEI7QUFDQSxzQkFBc0IsdUJBQXVCLENBQUMscUJBQXFCLENBQUM7QUFDcEUsWUFBWSxzQkFBc0IsQ0FBQyxZQUFZLENBQUM7QUFDaEQsV0FBVyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMseUJBQXlCLENBQUM7QUFFcEU7SUFDSSxhQUFhO0FBQ2pCO0FBQ0EsMENBQTBDLGdDQUFnQyxDQUFDO0FBRTNFLG1CQUFtQixzQkFBc0IsRUFBRSx3QkFBd0IsQ0FBQztBQUVwRSxRQUFRLGdCQUFnQixDQUFDO0FBQ3pCLFFBQVE7QUFDUixTQUFTLHVCQUF1QixFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQztBQUNsRyxVQUFVLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQztBQUN4SSxTQUFTLHVCQUF1QixFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQztBQUNsRyxZQUFZLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDO0FBQ3RELHVEQUF1RCwyQkFBMkIsQ0FBQzs7Ozs7O0FDbHJDbkYsb0JBQW9CLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztBQUN6RCxRQUFRLDhCQUE4QixDQUFDLDJCQUEyQixDQUFDO0FBQ25FLGFBQWEsd0JBQXdCLENBQUMsOEJBQThCLENBQUM7QUFDckUsZ0JBQWdCLFlBQVksQ0FBQztBQUM3QixZQUFZLDJCQUEyQixDQUFDO0FBQ3hDLHFCQUFxQixrQkFBa0IsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDO0FBRTdEO0VBQ0UsY0FBYztFQUNkLGdCQUFnQixFQUFFLHlDQUF5QztFQUMzRCxzQkFBc0I7QUFDeEI7QUFFQTtFQUNFLHlCQUF5QixFQUFFLDZCQUE2QjtFQUN4RCxpQkFBaUI7RUFDakIsV0FBVztBQUNiO0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsZ0JBQWdCO0FBQ2xCOztBQUVBLDRCQUE0QjtBQUM1QjtFQUNFLDJCQUEyQjtFQUMzQixNQUFNO0VBQ04sOEJBQThCO0VBQzlCLFdBQVc7RUFDWCwwQ0FBMEM7QUFDNUM7O0FBRUEsd0NBQXdDO0FBQ3hDO0VBQ0UsZ0JBQWdCO0VBQ2hCLE9BQU87RUFDUCxnQkFBZ0I7RUFDaEIsV0FBVztFQUNYLDRCQUE0QjtBQUM5Qjs7QUFFQSxnRUFBZ0U7QUFDaEU7RUFDRSxXQUFXO0VBQ1gsbUJBQW1CO0FBQ3JCO0FBRUE7RUFDRSx5QkFBeUI7QUFDM0I7QUFFQTtFQUNFLDBCQUEwQjtFQUMxQixpQkFBaUI7RUFDakIsV0FBVztFQUNYLGVBQWU7QUFDakI7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixXQUFXO0FBQ2I7QUFDQSxxQ0FBcUM7QUFDckM7RUFDRSxrQkFBa0IsRUFBRSwrQkFBK0I7RUFDbkQsd0JBQXdCO0FBQzFCO0FBRUE7RUFDRSxXQUFXLEVBQUUsOERBQThEO0FBQzdFO0FBQ0EsMkJBQTJCO0FBQzNCO0VBQ0Usa0JBQWtCLEVBQUUsK0JBQStCO0VBQ25ELHdCQUF3QjtBQUMxQjtBQUVBO0VBQ0UsV0FBVyxFQUFFLDhEQUE4RDtBQUM3RTs7QUFFQSwrQkFBK0I7QUFDL0I7RUFDRSxtQkFBbUI7RUFDbkIseUJBQXlCO0VBQ3pCLGtCQUFrQjtFQUNsQixZQUFZO0VBQ1osa0JBQWtCO0VBQ2xCLHFDQUFxQztFQUNyQyxnQkFBZ0I7RUFDaEIsWUFBWTtBQUNkO0FBRUE7RUFDRSxhQUFhO0VBQ2IsOEJBQThCO0VBQzlCLG1CQUFtQjtFQUNuQixrQkFBa0I7RUFDbEIsOEJBQThCO0VBQzlCLG1CQUFtQjtBQUNyQjtBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGtCQUFrQjtFQUNsQixjQUFjO0FBQ2hCO0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsY0FBYztBQUNoQjtBQUVBO0VBQ0UsYUFBYTtFQUNiLHNCQUFzQixFQUFFLHFDQUFxQztFQUM3RCxRQUFRO0VBQ1Isa0JBQWtCO0FBQ3BCO0FBRUE7RUFDRSxhQUFhO0VBQ2IsbUJBQW1CO0VBQ25CLFFBQVE7RUFDUixlQUFlO0FBQ2pCO0FBRUE7RUFDRSxpQkFBaUI7QUFDbkI7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixjQUFjO0FBQ2hCO0FBRUE7RUFDRSxhQUFhO0VBQ2IsOEJBQThCO0VBQzlCLG1CQUFtQjtBQUNyQjtBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGNBQWM7QUFDaEI7O0FBRUEsMkJBQTJCO0FBQzNCO0VBQ0Usa0JBQWtCO0VBQ2xCLFlBQVk7QUFDZDtBQUVBO0VBQ0UsZUFBZTtFQUNmLFlBQVk7QUFDZDtBQUVBO0VBQ0UsVUFBVTtBQUNaO0FBRUE7RUFDRSxhQUFhO0VBQ2IsMEJBQTBCO0VBQzFCLHdCQUF3QixFQUFFLG1DQUFtQztFQUM3RCxVQUFVO0VBQ1YsdUJBQXVCO0VBQ3ZCLFlBQVk7RUFDWixtQkFBbUIsRUFBRSx3QkFBd0I7RUFDN0MsWUFBWTtFQUNaLHdCQUF3QjtFQUN4QixrQkFBa0I7RUFDbEIsK0NBQStDO0VBQy9DLGNBQWM7RUFDZCxvQkFBb0IsRUFBRSxnQ0FBZ0M7RUFDdEQsaUJBQWlCO0VBQ2pCLGdCQUFnQjtFQUNoQixnQkFBZ0I7RUFDaEIsc0JBQXNCO0FBQ3hCO0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsa0JBQWtCO0VBQ2xCLGNBQWM7QUFDaEI7QUFFQTtFQUNFLFNBQVM7RUFDVCw2QkFBNkI7RUFDN0IsYUFBYTtBQUNmO0FBRUE7RUFDRSxjQUFjLEVBQUUsK0JBQStCO0FBQ2pEOztBQUVBLHNDQUFzQztBQUN0QztFQUNFLFdBQVc7RUFDWCxrQkFBa0I7RUFDbEIsU0FBUztFQUNULFdBQVc7RUFDWCxpQkFBaUI7RUFDakIsbUJBQW1CO0VBQ25CLHlEQUF5RDtBQUMzRDtBQUNBLFFBQVEsZUFBZSxFQUFFLGlDQUFpQyxDQUFDLGlDQUFpQyxDQUFDLGlCQUFpQixDQUFDO0FBQy9HO0VBQ0UsV0FBVztBQUNiO0FBQ0Esa0JBQWtCLG9DQUFvQyxDQUFDO0FBRXZELGVBQWUsMEJBQTBCLEVBQUUscUJBQXFCLENBQUMsWUFBWSxDQUFDOzs7Ozs7QUM2YzlFO0lBQ0ksa0NBQWtDO0lBQ2xDLHFCQUFxQjtBQUN6QjtBQUNBO0lBQ0ksMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5Qiw2QkFBNkI7SUFDN0IsNEJBQTRCO0FBQ2hDO0FBQ0E7SUFDSSwyQkFBMkI7SUFDM0IsOEJBQThCO0lBQzlCLDZCQUE2QjtJQUM3Qiw0QkFBNEI7QUFDaEM7QUFDQSxRQUFRLGdCQUFnQixDQUFDOzs7Ozs7QUN6RXpCO0lBQ0ksa0NBQWtDO0lBQ2xDLHFCQUFxQjtBQUN6QjtBQUNBO0lBQ0ksMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5Qiw2QkFBNkI7SUFDN0IsNEJBQTRCO0FBQ2hDO0FBQ0E7SUFDSSwyQkFBMkI7SUFDM0IsOEJBQThCO0lBQzlCLDZCQUE2QjtJQUM3Qiw0QkFBNEI7QUFDaEM7QUFDQSxRQUFRLGdCQUFnQixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vdmVuZG9yL3N5bWZvbnkvdXgtbGl2ZS1jb21wb25lbnQvYXNzZXRzL2Rpc3QvbGl2ZS5taW4uY3NzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zdHlsZXMvYXBwLmNzcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvdnVlL1NlYXJjaC52dWUiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3Z1ZS9UYWJsZWF1TWFwMi52dWUiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3Z1ZS9DcmVuZWF1Mi52dWUiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3Z1ZS9QYXJhbS52dWUiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3Z1ZS9NZXNzYWdlcy52dWUiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3Z1ZS9TZWFyY2hTdGFuZGFyZC52dWUiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3Z1ZS9UYWJsZWF1U3RhbmRhcmQudnVlIiwid2VicGFjazovLy8uL2Fzc2V0cy92dWUvQ3JlbmVhdVN0YW5kYXJkLnZ1ZSIsIndlYnBhY2s6Ly8vLi9hc3NldHMvdnVlL1RhYmxlYXVQbGFuaWYudnVlIiwid2VicGFjazovLy8uL2Fzc2V0cy92dWUvQ3JlbmVhdVBsYW5pZi52dWUiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3Z1ZS9QbGFubmluZy52dWUiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3Z1ZS9FeGNsdXNpb24udnVlIl0sInNvdXJjZXNDb250ZW50IjpbIltkYXRhLWxvYWRpbmc9XCJcIl0sW2RhdGEtbG9hZGluZz1zaG93XSxbZGF0YS1sb2FkaW5nKj1cXHxzaG93XXtkaXNwbGF5Om5vbmV9IiwiYm9keSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG4iLCI8c2NyaXB0IHNldHVwPlxuXG5pbXBvcnQgeyBjcmVhdGVBcHAsIHJlZiwgb25Nb3VudGVkLCBvbkJlZm9yZVVubW91bnQsIG9uVW5tb3VudGVkLCBnZXRDdXJyZW50SW5zdGFuY2UsIGNvbXB1dGVkfSAgZnJvbSAndnVlJztcbmltcG9ydCB7IGJ1cyB9IGZyb20gJy4uL2J1cy5qcyc7IFxuXG5pbXBvcnQgVG9vbGJhciBmcm9tICdwcmltZXZ1ZS90b29sYmFyJztcbmltcG9ydCBJbnB1dFRleHQgZnJvbSAncHJpbWV2dWUvaW5wdXR0ZXh0JztcbmltcG9ydCBCdXR0b24gZnJvbSAncHJpbWV2dWUvYnV0dG9uJztcbmltcG9ydCBEaWFsb2cgZnJvbSAncHJpbWV2dWUvZGlhbG9nJztcblxuaW1wb3J0IEljb25GaWVsZCBmcm9tICdwcmltZXZ1ZS9pY29uZmllbGQnO1xuaW1wb3J0IElucHV0SWNvbiBmcm9tICdwcmltZXZ1ZS9pbnB1dGljb24nO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaERpYWxvZyA9IHJlZigpO1xuICAgICAgICBjb25zdCBzdWJtaXR0ZWQgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXVyID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHBhcmFtID0gcmVmKG51bGwpO1xuICAgICAgICBjb25zdCBzZWFyY2hpbmcgPSByZWYoKTtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdGF0cyA9IHJlZihbXSk7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJTZWFyY2ggPSByZWYobnVsbCk7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBwYXJhbTogIHtcbiAgICB0eXBlOiBPYmplY3QsIFxuICAgIHJlcXVpcmVkOiB0cnVlIFxuICB9XG59KTtcblxuLy9DRU5UUkFMRSBERSBDT01NVU5JQ0FUSU9OXG4gICAgICAgIGNvbnN0IHNvdW1ldHRyZUZvcm11bGFpcmUgPSBhc3luYygpID0+IHtcbiAgICAgICAgICAvL2NvbnRyb2xlclxuICAgICAgICAgIGlmICghZm9ybXVsYWlyZUVzdFZhbGlkZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdMZXMgZG9ubsOpZXMgbmUgcGV1dmVudCBwYXMgw6p0cmUgdmlkZXMnO1xuICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3NlYXJjaCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IHNlYXJjaGluZy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdGF0cy52YWx1ZSA9IGRhdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7bWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgc2F1dmVnYXJkZVwiO31cbiAgICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gcmVzdWx0YXRzLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50ID09IDApe21lc3NhZ2V1ci52YWx1ZSA9IFwiQXVjdW4gcsOpc3VsdGF0XCI7fVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXttZXNzYWdldXIudmFsdWUgPSBjb3VudCArIFwiIHLDqXN1bHRhdChzKVwiO31cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciByw6lzZWF1XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGZvcm11bGFpcmVFc3RWYWxpZGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHNlYXJjaGluZy52YWx1ZS50cmltKCkgIT09ICcnO1xuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiByZWRpcmlnZShpZCwgdHlwZSkge1xuICAgICAgICAgICAgIGNsdXN0ZXJTZWFyY2gudmFsdWUgPSBpZDtcbiAgICAgICAgICAgICBjbHVzdGVyU2VhcmNoLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgIGJ1cy5lbWl0KCdjbHVzdGVyLXNlbGVjdGVkJywgY2x1c3RlclNlYXJjaCk7XG4gICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgfVxuXG5cbi8vRVZFTlQgSU5URVJGQUNFICBcbiAgICAgICAgY29uc3QgZWRpdERpYWxvZz0gKCkgPT4ge1xuICAgICAgICAgICAgc2VhcmNoRGlhbG9nLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGlkZURpYWxvZyA9ICgpID0+IHtcbiAgICAgICAgICAgIHNlYXJjaERpYWxvZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgLy9zdWJtaXR0ZWQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfTtcblxuLy9ERU1BUlJBR0VcbiAgICAgICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLnZhbHVlID0gcHJvcHMucGFyYW0ub3BlcmF0aW9uO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJNZXJjdXJlIEV2ZW50U291cmNlIGNsb3NlZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbjwvc2NyaXB0PlxuPHRlbXBsYXRlPlxuICAgICAgICA8ZGl2IGlkPVwicGFyYW1CdXR0b25cIj5cbiAgICAgICAgICAgICA8QnV0dG9uIGljb249XCJwaSBwaS1zZWFyY2hcIiAgQGNsaWNrPVwiZWRpdERpYWxvZygpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxEaWFsb2cgdi1tb2RlbDp2aXNpYmxlPVwic2VhcmNoRGlhbG9nXCIgOnN0eWxlPVwieyB3aWR0aDogJzQ1MHB4JyB9XCIgaGVhZGVyPVwiUmVjaGVyY2hlIHBhciBub20gb3UgdMOpbMOpcGhvbmVcIiA6bW9kYWw9XCJ0cnVlXCI+XG4gICAgICAgIDxkaXY+e3sgbWVzc2FnZXVyIH19PC9kaXY+XG4gICAgICAgICAgICA8Zm9ybSBAc3VibWl0LnByZXZlbnQ9XCJzb3VtZXR0cmVGb3JtdWxhaXJlXCI+XG4gICAgICAgICAgICAgIDxkaXYgIGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXG4gICAgICAgICAgICAgICAgICB2LW1vZGVsPVwic2VhcmNoaW5nXCIgXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlJlY2hlcmNoZXJcIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCI+UmVjaGVyY2hlcjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPGJyPlxuICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCJyZXN1bHRhdCBpbiByZXN1bHRhdHNcIiA6a2V5PVwicmVzdWx0YXQuaWRcIj5cbiAgICAgICAgICAgICAgICA8cD48YSBjbGFzcz1cImxpZW4tc2VhcmNoXCIgQGNsaWNrPVwicmVkaXJpZ2UocmVzdWx0YXQuY2x1c3RlciwgcmVzdWx0YXQudHlwZSlcIj57eyByZXN1bHRhdC5ub20gfX0gOiB7eyByZXN1bHRhdC50ZWwxIH19L3t7IHJlc3VsdGF0LnRlbDIgfX08L2E+PC9wPlxuICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L0RpYWxvZz5cbjwvdGVtcGxhdGU+XG48c3R5bGUgc2NvcGVkPlxuLmNvbnRhaW5lciB7XG4gIG1heC13aWR0aDogNDAwcHg7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcbn1cbi5saWVuLXNlYXJjaCB7Zm9udC1zaXplOiAxMnB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7fVxuaW5wdXQge1xuICBwYWRkaW5nOiA1cHg7XG4gIGZsZXgtZ3JvdzogMTtcbn1cbmJ1dHRvbiB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG4gIHBhZGRpbmc6IDEwcHggMjBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuPC9zdHlsZT4iLCI8c2NyaXB0IHNldHVwPlxuXG5pbXBvcnQgeyBjcmVhdGVBcHAsIHJlZiwgb25Nb3VudGVkLCBvbkJlZm9yZVVubW91bnQsIG9uVW5tb3VudGVkLCBnZXRDdXJyZW50SW5zdGFuY2UsIGNvbXB1dGVkfSAgZnJvbSAndnVlJztcbmltcG9ydCB7IEZpbHRlck1hdGNoTW9kZSwgRmlsdGVyT3BlcmF0b3IgfSBmcm9tICdAcHJpbWV2dWUvY29yZS9hcGknO1xuXG5pbXBvcnQgeyBidXMgfSBmcm9tICcuLi9idXMuanMnOyBcbmltcG9ydCB7IEZ1bmN0aW9ucyB9IGZyb20gJy4vc2VydmljZS9GdW5jdGlvbnMnO1xuXG5pbXBvcnQgeyBWdWVEYXRlUGlja2VyIH0gZnJvbSAnQHZ1ZXBpYy92dWUtZGF0ZXBpY2tlcic7XG5pbXBvcnQgJ0B2dWVwaWMvdnVlLWRhdGVwaWNrZXIvZGlzdC9tYWluLmNzcydcblxuaW1wb3J0IFNlYXJjaCBmcm9tICcuL1NlYXJjaC52dWUnO1xuXG5pbXBvcnQgUHJvZ3Jlc3NCYXIgZnJvbSAncHJpbWV2dWUvcHJvZ3Jlc3NiYXInO1xuaW1wb3J0IERhdGFUYWJsZSBmcm9tICdwcmltZXZ1ZS9kYXRhdGFibGUnO1xuaW1wb3J0IENvbHVtbiBmcm9tICdwcmltZXZ1ZS9jb2x1bW4nO1xuaW1wb3J0IENvbHVtbkdyb3VwIGZyb20gJ3ByaW1ldnVlL2NvbHVtbmdyb3VwJzsgICBcbmltcG9ydCBSb3cgZnJvbSAncHJpbWV2dWUvcm93JzsgICAgIFxuaW1wb3J0IFRvZ2dsZVN3aXRjaCBmcm9tICdwcmltZXZ1ZS90b2dnbGVzd2l0Y2gnO1xuXG5cbmltcG9ydCBUb29sYmFyIGZyb20gJ3ByaW1ldnVlL3Rvb2xiYXInO1xuaW1wb3J0IHsgdXNlVG9hc3QgfSBmcm9tICdwcmltZXZ1ZS91c2V0b2FzdCc7XG5cbmltcG9ydCBJbnB1dFRleHQgZnJvbSAncHJpbWV2dWUvaW5wdXR0ZXh0JztcbmltcG9ydCBTZWxlY3QgZnJvbSAncHJpbWV2dWUvc2VsZWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAncHJpbWV2dWUvYnV0dG9uJztcbmltcG9ydCBUZXh0YXJlYSBmcm9tICdwcmltZXZ1ZS90ZXh0YXJlYSc7XG5pbXBvcnQgQ2hlY2tib3ggZnJvbSAncHJpbWV2dWUvY2hlY2tib3gnO1xuaW1wb3J0IENoZWNrYm94R3JvdXAgZnJvbSAncHJpbWV2dWUvY2hlY2tib3hncm91cCc7XG5cbmltcG9ydCBEaWFsb2cgZnJvbSAncHJpbWV2dWUvZGlhbG9nJztcblxuaW1wb3J0IEljb25GaWVsZCBmcm9tICdwcmltZXZ1ZS9pY29uZmllbGQnO1xuaW1wb3J0IElucHV0SWNvbiBmcm9tICdwcmltZXZ1ZS9pbnB1dGljb24nO1xuXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcbiAgcGFyYW06ICB7XG4gICAgdHlwZTogT2JqZWN0LCBcbiAgICByZXF1aXJlZDogdHJ1ZSBcbiAgfVxufSk7XG5cbiAgICAgICAgY29uc3QgZXRhdHMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbGlzdGVhZ2VudHMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSByZWYoMzAwKTtcbiAgICAgICAgY29uc3QgbWlzc2lvbklEID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklEID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXRlbXAgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXNfdHlwZXMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXNUeXBlID0gcmVmKFtdKTsgXG5cbiAgICAgICAgY29uc3QgcG9pbnRzID0gcmVmKFtdKTsgLy8gTGEgbGlzdGUgc2VyYSBjaGFyZ8OpZSBldCBtaXNlIMOgIGpvdXIgdmlhIE1lcmN1cmUvQVBJXG4gICAgICAgIGNvbnN0IG1lc3NhZ2V1ciA9IHJlZignJyk7XG4gICAgICAgIGNvbnN0IG5vbWJyZSA9IHJlZigpO1xuICAgICAgICBjb25zdCB0b3RhbCA9IHJlZigpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZigpO1xuICAgICAgICBjb25zdCBwb3VyY2VudCA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlU01TPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZUV4Y2VsPSByZWYoKTtcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gcmVmKFtdKTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IDA7XG4gICAgICAgIGxldCBzZWwgPSAwO1xuICAgICAgICBsZXQgc2VhcmNoID0gMDtcbiAgICAgICAgY29uc3QgbWFWYWxldXIgPSByZWYoMClcbiAgICAgICAgY29uc3Qgc2hvd1dpdGhSViA9IHJlZih0cnVlKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkID0gJyc7XG4gICAgICAgIGNvbnN0IG1vaXMgPSByZWYoKTtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IGRhdGUgPSByZWYobmV3IERhdGUoKSk7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJJRCA9IHJlZigpO1xuICAgICAgICBjb25zdCBsb2FkaW5nID1yZWYoKTtcbiAgICAgICAgbG9hZGluZy52YWx1ZSA9IHRydWU7XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoTm9tID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU3RhdHVzID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNlYXJjaE51bWVyb1BoeXNpcXVlID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaE51bWVyb0NsaWVudCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hOb21SdWUgPSByZWYoJ1RvdXRlcycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoRGF0ZVJWID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFBsYW5pZlJWID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFF1YXJ0aWVyID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNlYXJjaFZpbGxlID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaEV0YXQgPSByZWYoJ1RvdXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFRlbCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMiA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMyA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyNCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyNSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hFbXBsYWNlbWVudCA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoQWxlcnRlID0gcmVmKCdUb3VzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hBZ2VudCA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoTWlzc2lvbiA9IHJlZigpO1xuICAgICAgICBjb25zdCBsaXN0ZW1pc3Npb25zID0gcmVmKFtdKTtcbiAgICAgICAgY29uc3Qgc2xvdFByb3BzID0gcmVmKCk7IFxuXG4gICAgICAgIGNvbnN0IGNsaWNrZWRSb3dJZCA9IHJlZihudWxsKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWJsZVBvaW50cyA9IHJlZihbXSk7IFxuICAgICAgICBjb25zdCBzZWxlY3RlZFRhYiA9IHJlZihbXSk7XG4gICAgICAgIGNvbnN0IENvbG9ycyA9IHJlZihbXSk7IFxuXG4gICAgICAgIGNvbnN0IGV4cGFuZGVkUm93cyA9IHJlZihbXSk7XG4gICAgICAgIGNvbnN0IHRvYXN0ID0gdXNlVG9hc3QoKTtcbiAgICAgICAgY29uc3QgcHJvZHVjdERpYWxvZyA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IGV4Y2VsRGlhbG9nID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgcHJvZHVjdCA9IHJlZih7fSk7XG4gICAgICAgIGNvbnN0IHN1Ym1pdHRlZCA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVmKDApO1xuICAgICAgICBjb25zdCBkYXRhQ3JlbmVhdSA9IHt9O1xuICAgICAgICBjb25zdCBkYXRlRXhjZWwgPSB7fTtcbiAgICAgICAgY29uc3QgZGF0YUNhcnRlID0ge307XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCkrMTtcbiAgICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIHJldHVybiBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUHJvZHVjdHMgPSByZWYoe30pO1xuICAgICAgICBjb25zdCBtZXRhS2V5ID0gcmVmKHRydWUpO1xuXG4vL0NFTlRSQUxFIERFIENPTU1VTklDQVRJT05cbiAgICAgICAgLy8gRm9uY3Rpb24gcG91ciByw6ljdXDDqXJlciBsZXMgaW5pdGlhdXggZGVwdWlzIGwnQVBJIFN5bWZvbnlcblxuICAgICAgICBmdW5jdGlvbiBmZXRjaFBvaW50cyhjbHVzdGVyX2lkKXsgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLy8geW91ciBvcHRpb25zLi4uIG1ldGhvZDogUE9TVCwgaGVhZGVycywgY29ycywgZXRjLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRlLnZhbHVlPScnXG4gICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy9jbHVzdGVyLycrY2x1c3Rlcl9pZCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhdGEuc3RhdHVzJytkYXRhLnN0YXR1cykgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkaXJlY3Rpb24gZm9yY8OpZSB2ZXJzIGxhIHBhZ2UgZGUgbG9naW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjaGFyZ2VtZW50IHBvaW50cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZSA9IGRhdGEucmVzcG9uc2UubWFwKHAgPT4gKHsgLi4ucCwgaXNFZGl0aW5nOiBmYWxzZSwgb3JpZ2luYWw6IHt9LCBzZWxlY3RlZDogZmFsc2UgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RJdGVtID0gcG9pbnRzLnZhbHVlLmZpbmQoeD0+eCE9PXVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlYXJjaCA+IDApe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IHNlYXJjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5maXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRQb2ludChwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5sb2coZXJyb3IpKSAvLyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggZXJyb3JcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBmZXRjaFBvaW50c01pc3Npb24obWlzc2lvbl9pZCl7ICAgICAgXG4gICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0NoYXJnZW1lbnQgZW4gY291cnMnO1xuICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7ICBcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC8vIHlvdXIgb3B0aW9ucy4uLiBtZXRob2Q6IFBPU1QsIGhlYWRlcnMsIGNvcnMsIGV0Yy5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0ZS52YWx1ZT0nJ1xuICAgICAgICAgICAgICAgIEZ1bmN0aW9ucy5tYWtlUmVxdWVzdCgnL2FwaS9wb2ludHMvb3BlcmF0aW9uLycrb3BlcmF0aW9uSUQudmFsdWUrJy8nK21pc3Npb25faWQsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZGF0YSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkYXRhLnN0YXR1cycrZGF0YS5zdGF0dXMpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZGlyZWN0aW9uIGZvcmPDqWUgdmVycyBsYSBwYWdlIGRlIGxvZ2luXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY2hhcmdlbWVudCBwb2ludHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWUgPSBkYXRhLnJlc3BvbnNlLm1hcChwID0+ICh7IC4uLnAsIGlzRWRpdGluZzogZmFsc2UsIG9yaWdpbmFsOiB7fSwgc2VsZWN0ZWQ6IGZhbHNlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0SXRlbSA9IHBvaW50cy52YWx1ZS5maW5kKHg9PnghPT11bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZWFyY2ggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBzZWFyY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0UG9pbnQocG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IGNvbnNvbGUubG9nKGVycm9yKSkgLy8gZG8gc29tZXRoaW5nIHVzZWZ1bCB3aXRoIGVycm9yXG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gY2hhbmdlX2FsZXJ0ZShwb2ludCl7ICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC8vIHlvdXIgb3B0aW9ucy4uLiBtZXRob2Q6IFBPU1QsIGhlYWRlcnMsIGNvcnMsIGV0Yy5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL2FsZXJ0ZS8nK3BvaW50LmlkKycvJytwb2ludC5hbGVydGUsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5sb2coZXJyb3IpKSAvLyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggZXJyb3JcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBnZXRJbmZvcyhkYXRhKXsgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkcG9pbnRzOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGUudmFsdWU9JydcbiAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL2dldFYyLycsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0YS5zdGF0dXMnK2RhdGEuc3RhdHVzKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzcG9uc2UuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleDIgPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gZWxlbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2ludEluZGV4MiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4Ml0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4MyA9IGZpbHRlcmVkUG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2ludEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFBvaW50cy52YWx1ZVtwb2ludEluZGV4M10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5lbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IGZyb3plblBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBlbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQ2FydGUuY2x1c3RlcklkID0gZWxlbWVudC5jbHVzdGVyNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQ2FydGUubWlzc2lvbiA9IGVsZW1lbnQubWlzc2lvbi5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMuZW1pdCgnY2FydGUtcmVmcmVzaCcsIGRhdGFDYXJ0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BvaW50cy52YWx1ZVtwb2ludEluZGV4XSA9IHByb2R1Y3QudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ1VuZSBlcnJldXIgc1xcJ2VzdCBwcm9kdWl0ZSBvdSB2b3VzIMOqdGVzIGTDqWNvbm5lY3TDqScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVNZXJjdXJlTWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7IFxuICAgICAgICAgICAgZGF0YS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGVsZW1lbnQuYWN0aW9uO1xuICAgICAgICAgICAgICAgIHZhciByZWZyZXNoX2NyZW5lYXUgPSAwO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIC8vbWlzZSDDoCBqb3VyIGRlcyBjbHVzdGVycyBjb21wbGV0XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NsdXN0ZXJfY29tcGxldGVkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdjbHVzdGVyc2NvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGVsZW1lbnQsIC8vIFBhc3MgeW91ciBkYXRhIGluIHRoZSAnZGV0YWlsJyBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwcm9kdWN0X3VwZGF0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmZvcyhlbGVtZW50LnBvaW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfY3JlbmVhdSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjcmVuZWF1X3VwZGF0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlbmVhdV91cGRhdGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfY3JlbmVhdSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFVwZGF0ZShlbGVtZW50LmRvbm5lZXMubm9tYnJlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHJlZnJlc2hfY3JlbmVhdSA9PSAxKXtcbiAgICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS11cGRhdGVkJywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbi8vIElOVEVSRkFDRVxuICAgICAgICAgICAgY29uc3QgZ2V0TGFzdFBsYW5pZmllZERhdGUgPSAocG9pbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFwb2ludC5sb2dldGF0cyB8fCBwb2ludC5sb2dldGF0cy5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuXG4gICAgICAgICAgICAgIC8vIDEuIEZpbHRyZXIgbGVzIGxvZ3MgcGFyIGlkIGQnw6l0YXQgNVxuICAgICAgICAgICAgICBjb25zdCBwbGFuaWZpZXMgPSBwb2ludC5sb2dldGF0cy5maWx0ZXIobG9nID0+IGxvZy5ldGF0LmlkID09PSA1KTtcblxuICAgICAgICAgICAgICAvLyAyLiBWw6lyaWZpZXIgcydpbCB5IGVuIGEgYXUgbW9pbnMgdW5cbiAgICAgICAgICAgICAgaWYgKHBsYW5pZmllcy5sZW5ndGggPT09IDApIHJldHVybiBcIkphbWFpcyBwbGFuaWZpw6lcIjtcblxuICAgICAgICAgICAgICAvLyAzLiBSw6ljdXDDqXJlciBsZSBkZXJuaWVyIChlbiBzdXBwb3NhbnQgcXVlIGxlIEpTT04gZXN0IHRyacOpIHBhciBkYXRlL0lEIGNyb2lzc2FudClcbiAgICAgICAgICAgICAgLy8gU2kgdm91cyBuJ8OqdGVzIHBhcyBzw7tyIGR1IHRyaSwgdm91cyBwb3V2ZXogYWpvdXRlciAuc29ydCgoYSwgYikgPT4gYi5pZCAtIGEuaWQpIGF2YW50IGxlIFswXVxuICAgICAgICAgICAgICBjb25zdCBkZXJuaWVyTG9nID0gcGxhbmlmaWVzW3BsYW5pZmllcy5sZW5ndGggLSAxXTtcblxuICAgICAgICAgICAgICByZXR1cm4gZGVybmllckxvZy5kYXRlY3JlYTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYWdlbnRzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxBZ2VudHNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gKHBvaW50LmFnZW50Lm5vbSsnICcrKHBvaW50LmFnZW50LnByZW5vbT8/JycpKSlcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUFnZW50U2V0ID0gbmV3IFNldChhbGxBZ2VudHNXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVBZ2VudFNldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB2aWxsZXMgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbENpdGllc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC52aWxsZSk7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVDaXR5U2V0ID0gbmV3IFNldChhbGxDaXRpZXNXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVDaXR5U2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHF1YXJ0aWVycyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsUXVhcnRpZXJzV2l0aER1cGxpY2F0ZXMgPSBwb2ludHMudmFsdWUubWFwKHBvaW50ID0+IHBvaW50LnF1YXJ0aWVyKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVF1YXJ0aWVyU2V0ID0gbmV3IFNldChhbGxRdWFydGllcnNXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVRdWFydGllclNldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBydWVzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxSdWVzV2l0aER1cGxpY2F0ZXMgPSBwb2ludHMudmFsdWUubWFwKHBvaW50ID0+IHBvaW50Lm5vbVJ1ZSk7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVSdWVTZXQgPSBuZXcgU2V0KGFsbFJ1ZXNXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVSdWVTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZW1wbGFjZW1lbnRzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxMaWJlbGxlc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC5lbXBsYWNlbWVudENvbXB0ZXVyKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUxpYmVsbGVzU2V0ID0gbmV3IFNldChhbGxMaWJlbGxlc1dpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZUxpYmVsbGVzU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRhdGVzUlYgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbERhdGVzUlZXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnRfUlYocG9pbnQpKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZWFsbERhdGVzUlZTZXQgPSBuZXcgU2V0KGFsbERhdGVzUlZXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVhbGxEYXRlc1JWU2V0KS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZUEgPSBhLnNwbGl0KCctJykucmV2ZXJzZSgpLmpvaW4oJycpOyAvLyBcIjA5LTAyLTIwMjZcIiAtPiBcIjIwMjYwMjA5XCJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlQiA9IGIuc3BsaXQoJy0nKS5yZXZlcnNlKCkuam9pbignJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGVBLmxvY2FsZUNvbXBhcmUoZGF0ZUIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVhbGxEYXRlc1JWU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBsYW5pZlJWID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcG9pbnRzVGVtcCA9IFtdXG4gICAgICAgICAgICBwb2ludHNUZW1wLnZhbHVlID0gcG9pbnRzLnZhbHVlLmZpbHRlcihwb2ludCA9PiBwb2ludC5ldGF0LmlkID09PSA1KVxuICAgICAgICAgICAgY29uc3QgbGFzdERhdGVzUGVyUG9pbnQgPSBwb2ludHNUZW1wLnZhbHVlLm1hcChwb2ludCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nc1BsYW5pZmllcyA9IChwb2ludC5sb2dldGF0cyB8fCBbXSkuZmlsdGVyKGxvZyA9PiBsb2cuZXRhdC5pZCA9PT0gNSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobG9nc1BsYW5pZmllcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgLy8gMi4gT24gcsOpY3Vww6hyZSBVTklRVUVNRU5UIGxlIGRlcm5pZXIgbG9nIGRlIGxhIGxpc3RlIChsZSBwbHVzIHLDqWNlbnQpXG4gICAgICAgICAgICAgICAgY29uc3QgZGVybmllckxvZyA9IGxvZ3NQbGFuaWZpZXNbbG9nc1BsYW5pZmllcy5sZW5ndGggLSAxXTtcblxuICAgICAgICAgICAgICAgIC8vIDMuIE9uIGV4dHJhaXQgbGEgZGF0ZSBkdSBjb21tZW50YWlyZSAoZXg6IFwiMDktMDItMjAyNlwiKVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gZGVybmllckxvZy5kYXRlY3JlYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaCA6IG51bGw7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gNC4gT24gbmV0dG9pZSA6IG9uIGVubMOodmUgbGVzIG51bGwgKHBvaW50cyBzYW5zIFJWKSBldCBvbiBkw6lkb3VibG9ubmUgYXZlYyBTZXRcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZURhdGVzID0gQXJyYXkuZnJvbShuZXcgU2V0KGxhc3REYXRlc1BlclBvaW50LmZpbHRlcihkID0+IGQgIT09IG51bGwpKSk7XG5cbiAgICAgICAgICAgIC8vIDUuIE9uIHRyaWUgcGFyIG9yZHJlIGNocm9ub2xvZ2lxdWUgKFlZWVktTU0tREQpXG4gICAgICAgICAgICByZXR1cm4gdW5pcXVlRGF0ZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVBID0gYS5zcGxpdCgnLScpLnJldmVyc2UoKS5qb2luKCcnKTsgLy8gXCIwOS0wMi0yMDI2XCIgLT4gXCIyMDI2MDIwOVwiXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZUIgPSBiLnNwbGl0KCctJykucmV2ZXJzZSgpLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlQS5sb2NhbGVDb21wYXJlKGRhdGVCKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBwb2ludF9SVihwb2ludCl7XG4gICAgICAgICAgaWYocG9pbnQuY3JlbmVhdSl7IFxuICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSl7cmV0dXJuIHBvaW50LmNyZW5lYXUuZGF0ZTt9ZWxzZXtyZXR1cm4gJ1NhbnMgUlYnO31cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZXtyZXR1cm4gJ1NhbnMgUlYnO31cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb3ByacOpdMOpIGNhbGN1bMOpZSBxdWkgcmVudmVycmEgbGEgbGlzdGUgZmlsdHLDqWUgw6AgbGEgRGF0YVRhYmxlXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkUG9pbnRzID0gY29tcHV0ZWQoKCkgPT4ge1xuXG4gICAgICAgICAgICAvLyBTaSBvbiBuJ2EgcGFzIGVuY29yZSBkZSBkb25uw6llcywgb24gcmVudm9pZSB1biB0YWJsZWF1IHZpZGVcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbiBjb21tZW5jZSBhdmVjIHVuZSBjb3BpZSBkZSB0b3V0ZXMgbGVzIGRvbm7DqWVzXG4gICAgICAgICAgICBsZXQgcG9pbnRzVG9GaWx0ZXIgPSBbLi4ucG9pbnRzLnZhbHVlXTtcblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBub21cbiAgICAgICAgICAgIGlmIChzZWFyY2hOb20udmFsdWUgJiYgc2VhcmNoTm9tLnZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOb20udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgLy8gQWpvdXRleiBpY2kgdG91IGxlcyBjaGFtcHMgZGFucyBsZXNxdWVscyB2b3VzIHZvdWxleiBjaGVyY2hlclxuICAgICAgICAgICAgICAgICAgICBwb2ludC5ub20udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlckNhc2VTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBOdW1lcm9QaHlzaXF1ZVxuICAgICAgICAgICAgaWYgKHNlYXJjaE51bWVyb1BoeXNpcXVlLnZhbHVlICYmIHNlYXJjaE51bWVyb1BoeXNpcXVlLnZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5udW1lcm9QaHlzaXF1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyQ2FzZVNlYXJjaClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaWx0cmUgcGFyIE51bWVyb0NsaWVudFxuICAgICAgICAgICAgaWYgKHNlYXJjaE51bWVyb0NsaWVudC52YWx1ZSAmJiBzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyQ2FzZVNlYXJjaCA9IHNlYXJjaE51bWVyb0NsaWVudC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5udW1lcm9DbGllbnQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlckNhc2VTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBOb21SdWVcbiAgICAgICAgICAgIGlmIChzZWFyY2hOb21SdWUudmFsdWUgJiYgc2VhcmNoTm9tUnVlLnZhbHVlLnRyaW0oKSAhPT0gJ1RvdXRlcycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOb21SdWUudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubm9tUnVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBWaWxsZVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygndmlsbGUnK3NlYXJjaFZpbGxlLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaFZpbGxlLnZhbHVlICYmIHNlYXJjaFZpbGxlLnZhbHVlICE9PSAnVG91dGVzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC52aWxsZSA9PT0gc2VhcmNoVmlsbGUudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgVGVsXG4gICAgICAgICAgICBpZiAoc2VhcmNoVGVsLnZhbHVlICYmIHNlYXJjaFRlbC52YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQudGVsMS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlbC52YWx1ZSl8fHBvaW50LnRlbDIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZWwudmFsdWUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIFF1YXJ0aWVyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWFydGllcicrc2VhcmNoUXVhcnRpZXIudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoUXVhcnRpZXIudmFsdWUgJiYgc2VhcmNoUXVhcnRpZXIudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5xdWFydGllciA9PT0gc2VhcmNoUXVhcnRpZXIudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIEFnZW50XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWFydGllcicrc2VhcmNoUXVhcnRpZXIudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoQWdlbnQudmFsdWUgJiYgc2VhcmNoQWdlbnQudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICAocG9pbnQuYWdlbnQubm9tKycgJysocG9pbnQuYWdlbnQucHJlbm9tPz8nJykpID09PSBzZWFyY2hBZ2VudC52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgRW1wbGFjZW1lbnRcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3F1YXJ0aWVyJytzZWFyY2hRdWFydGllci52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hFbXBsYWNlbWVudC52YWx1ZSAmJiBzZWFyY2hFbXBsYWNlbWVudC52YWx1ZSAhPT0gJ1RvdXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmVtcGxhY2VtZW50Q29tcHRldXIgPT09IHNlYXJjaEVtcGxhY2VtZW50LnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIERhdGVSVlxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncXVhcnRpZXInK3NlYXJjaFF1YXJ0aWVyLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaERhdGVSVi52YWx1ZSAmJiBzZWFyY2hEYXRlUlYudmFsdWUgIT09ICdUb3V0ZXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9wb2ludF9SVihwb2ludCwgc2VhcmNoRGF0ZVJWLnZhbHVlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWFyY2hQbGFuaWZSVi52YWx1ZSAmJiBzZWFyY2hQbGFuaWZSVi52YWx1ZSAhPT0gJ1RvdXRlcycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uX3BvaW50X1BsYW5pZihwb2ludCwgc2VhcmNoUGxhbmlmUlYudmFsdWUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiBjb25kaXRpb25fcG9pbnRfUlYocG9pbnQsIGRhdGVSVil7XG4gICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUpeyBcbiAgICAgICAgICAgICAgICAgaWYocG9pbnQuY3JlbmVhdS5kYXRlKXtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSA9PSBkYXRlUlYpe3JldHVybiB0cnVlO31cbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgaWYoZGF0ZVJWID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBpZihkYXRlUlYgPT0gJ1NhbnMgUlYnKXtyZXR1cm4gdHJ1ZTt9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBjb25kaXRpb25fcG9pbnRfUGxhbmlmKHBvaW50LCBkYXRlUlYpe1xuICAgICAgICAgICAgICBpZihwb2ludC5sb2dldGF0cyl7IFxuICAgICAgICAgICAgICAgIGZvcihjb25zdCBsb2dldGF0IG9mIHBvaW50LmxvZ2V0YXRzKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2V0YXQuZGF0ZWNyZWEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGxvZ2V0YXQuZGF0ZWNyZWEgPT0gZGF0ZVJWKSAmJiAocG9pbnQuZXRhdC5pZCA9PSA1KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0ZVJWJytsb2dldGF0LmRhdGVjcmVhKycgJytkYXRlUlYpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dldGF0LmRhdGVjcmVhID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgaWYoZGF0ZVJWID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIEV0YXRcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2V0YXQnK3NlYXJjaEV0YXQudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoRXRhdC52YWx1ZSAmJiBzZWFyY2hFdGF0LnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQuZXRhdC5pZCA9PT0gc2VhcmNoRXRhdC52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgQ2x1c3RlciAxXG4gICAgICAgICAgICBpZiAoc2VhcmNoQ2x1c3RlcjEudmFsdWUgJiYgc2VhcmNoQ2x1c3RlcjEudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNsdXN0ZXIxID09PSBzZWFyY2hDbHVzdGVyMS52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgQ2x1c3RlciAyXG4gICAgICAgICAgICBpZiAoc2VhcmNoQ2x1c3RlcjIudmFsdWUgJiYgc2VhcmNoQ2x1c3RlcjIudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNsdXN0ZXIyID09PSBzZWFyY2hDbHVzdGVyMi52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgQ2x1c3RlciAzXG4gICAgICAgICAgICBpZiAoc2VhcmNoQ2x1c3RlcjMudmFsdWUgJiYgc2VhcmNoQ2x1c3RlcjMudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNsdXN0ZXIzID09PSBzZWFyY2hDbHVzdGVyMy52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgQ2x1c3RlciA0XG4gICAgICAgICAgICBpZiAoc2VhcmNoQ2x1c3RlcjQudmFsdWUgJiYgc2VhcmNoQ2x1c3RlcjQudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNsdXN0ZXI0ID09PSBzZWFyY2hDbHVzdGVyNC52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgQ2x1c3RlciA1XG4gICAgICAgICAgICBpZiAoc2VhcmNoQ2x1c3RlcjUudmFsdWUgJiYgc2VhcmNoQ2x1c3RlcjUudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNsdXN0ZXI1ID09PSBzZWFyY2hDbHVzdGVyNS52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBEYXRlUlZcbiAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25fc2VsZWN0ZWQocG9pbnQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbmRpdGlvbl9zZWxlY3RlZChwb2ludCl7XG4gICAgICAgICAgICAgICAgIGlmKHBvaW50LmZyb3plbil7XG4gICAgICAgICAgICAgICAgICAgICAgaWYocG9pbnQuZnJvemVuID09IHRydWUpe3JldHVybiBmYWxzZTt9XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBBbGVydGVcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHNlYXJjaEFsZXJ0ZS52YWx1ZSAhPT0gJ1RvdXMnKSB7XG4gICAgICAgICAgICAgICAgaWYoc2VhcmNoQWxlcnRlLnZhbHVlID09ICd0cnVlJyl7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQuYWxlcnRlID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoc2VhcmNoQWxlcnRlLnZhbHVlID09ICdmYWxzZScpe1xuICAgICAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LmFsZXJ0ZSA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb3VudC52YWx1ZSA9IHBvaW50c1RvRmlsdGVyLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBwb2ludHNUb0ZpbHRlcjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2xlYXJGaWx0ZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBzZWFyY2hOb20udmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaEV0YXQudmFsdWUgPSAnVG91cyc7XG4gICAgICAgICAgICBzZWFyY2hRdWFydGllci52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaEVtcGxhY2VtZW50LnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgc2VhcmNoVGVsLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hWaWxsZS52YWx1ZSA9ICdUb3V0ZXMnO1xuICAgICAgICAgICAgc2VhcmNoTm9tUnVlLnZhbHVlID0gJ1RvdXRlcyc7XG4gICAgICAgICAgICBzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUgID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZSAgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaENsdXN0ZXIxLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hDbHVzdGVyMi52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoQ2x1c3RlcjMudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaENsdXN0ZXI0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hDbHVzdGVyNS52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoRGF0ZVJWLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hQbGFuaWZSVi52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoQWxlcnRlLnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgc2VhcmNoQWdlbnQudmFsdWUgPSAnVG91cyc7XG4gICAgICAgIH1cblxuICAgICAgICAvL29uIHJlY29pdCB1biBtZXNzYWdlIGRlIGxlYWZsZXRcbiAgICAgICAgY29uc3QgdXBkYXRlQ2x1c3RlciA9IChjbHVzdGVyU2VhcmNoKSA9PiB7XG4gICAgICAgICAgICBjbGVhckZpbHRlcigpO1xuICAgICAgICAgICAgZXZhbCgnc2VhcmNoQ2x1c3RlcicrY2x1c3RlclNlYXJjaC50eXBlKycudmFsdWUgPSAnK2NsdXN0ZXJTZWFyY2gudmFsdWUpO1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY2xpYyByZWNpZXZlZCcgKyBjbHVzdGVyU2VhcmNoLnR5cGUgKydpZCcrICsgY2x1c3RlclNlYXJjaC52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL29uIHLDqWluaXRhbGlzZSBsJ2FmZmljaGFnZSwgb24gbMOodmUgbGUgbG9ja1xuICAgICAgICBjb25zdCBnbG9iYWxFeHRlcm5hbENhbGwgPSAoY2x1c3Rlcl9pZCwgc2VsKSA9PiB7XG4gICAgICAgICAgICAvL3NlbmRMb2NrKG51bGwsIDIpO1xuICAgICAgICAgICAgc2VhcmNoID0gc2VsO1xuICAgICAgICAgICAgZmV0Y2hQb2ludHMoY2x1c3Rlcl9pZCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZWRpdFBvaW50ID0gKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50cy52YWx1ZS5maW5kKHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKHBvaW50KSB7XG4gICAgICAgICAgICAgICAgcG9pbnQub3JpZ2luYWwgPSB7IC4uLnBvaW50IH07XG4gICAgICAgICAgICAgICAgcG9pbnQuaXNFZGl0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdwb2ludEMnK3BvaW50LmlkKTtcbiAgICAgICAgICAgICAgICBpZiAocG9pbnQuY3JlbmVhdSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwb2ludC5jcmVuZWF1ID0ge307XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNyZW5lYXUuaWQgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9zZW5kTG9jayhwb2ludCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2FuY2VsRWRpdCA9IChpZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAocG9pbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSB7IC4uLnBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5vcmlnaW5hbCwgaXNFZGl0aW5nOiBmYWxzZSwgb3JpZ2luYWw6IHt9IH07XG4gICAgICAgICAgICAgICAgLy9zZW5kTG9jayhwb2ludHMudmFsdWVbcG9pbnRJbmRleF0sIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHNlbmRJbmZvcyA9IGFzeW5jKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9pbnRzL3VwZGF0ZVYyLycraWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBwcm9kdWN0LnZhbHVlLmNvbW1lbnRhaXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2libGU6IHByb2R1Y3QudmFsdWUuY29tcHRldXJBY2Nlc3NpYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpdmlsaXRlOiBwcm9kdWN0LnZhbHVlLmNpdmlsaXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbTogcHJvZHVjdC52YWx1ZS5ub20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJvQ2xpZW50OiBwcm9kdWN0LnZhbHVlLm51bWVyb0NsaWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWwxOiBwcm9kdWN0LnZhbHVlLnRlbDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsMjogcHJvZHVjdC52YWx1ZS50ZWwyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiBwcm9kdWN0LnZhbHVlLmVtYWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YXQ6IHByb2R1Y3QudmFsdWUuZXRhdC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VudDogcHJvZHVjdC52YWx1ZS5hZ2VudC5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnRmljaGUgbWlzZSDDoCBqb3VyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LmlzRWRpdGluZyA9IGZhbHNlOyAvLyBTb3J0aXIgZHUgbW9kZSDDqWRpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSBwcm9kdWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkdSBwcm9kdWl0OlwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0VycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZGUgbGEgZmljaGUgOiAnK2F3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgcsOpc2VhdSBsb3JzIGRlIGxhIHNhdXZlZ2FyZGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2VuZEV4Y2VsKCl7XG4gICAgICAgICAgICBoaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICBsZXQgY2hhaW5lID0gJyc7XG4gICAgICAgICAgICBmcm96ZW5Qb2ludHMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoYWluZSA9IGNoYWluZSArIGVsZW1lbnQuaWQgKyAnLCc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZmlsdGVyZWRQb2ludHMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoYWluZSA9IGNoYWluZSArIGVsZW1lbnQuaWQgKyAnLCc7XG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjaGFpbmUuc2xpY2UoMCwgLTEpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmZXRjaCgnL2FkbWluL2V4Y2VsL2V4cG9ydC8nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluZTogY2hhaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbl9pZDogb3BlcmF0aW9uSUQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYmxvYigpKS50aGVuKGRhdGEgPT4gd2luZG93Lm9wZW4oVVJMLmNyZWF0ZU9iamVjdFVSTChkYXRhKSkpXG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGV4Y2VsXCIpO1xuICAgICAgICAgICAgIH0gICBcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHNlbmRFeGNlbENyb24oKXtcbiAgICAgICAgICAgIGhpZGVEaWFsb2coKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZldGNoKCcvYWRtaW4vZXhjZWwvZXhwb3J0Q3Jvbi8nK3Byb3BzLnBhcmFtLm9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYmxvYigpKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0V4cG9ydCBlbiBjb3Vycyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGV4Y2VsXCIpO1xuICAgICAgICAgICAgIH0gICBcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRMb2NrID0gYXN5bmMocG9pbnQsIGxvY2tpbmcpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbnZveWVyIGxlcyBtb2RpZmljYXRpb25zIMOgIGwnQVBJIFN5bWZvbnlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS9wb2ludHMvbG9ja2luZy9gK3BvaW50LmlkKycvJytsb2NraW5nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7fSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZHUgcHJvZHVpdDpcIiwgYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgcsOpc2VhdSBsb3JzIGRlIGxhIHNhdXZlZ2FyZGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlzdGFuY2VVcGRhdGUgPSAocG9pbnQsIGRpc3RhbmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBwb2ludCk7XG4gICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5vcGVyYXRpb24gPSBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0ub3BlcnRhaW9uLmlkO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LnBvaW50ID0gcG9pbnQ7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUuZGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5kYXRlID0gMDtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5hZ2VudCA9IHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5hZ2VudC5pZDs7XG4gICAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NyZW5lYXUtdG9VcGRhdGUnLCBkYXRhQ3JlbmVhdSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYXJ0ZVVwZGF0ZSA9IChwb2ludCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gcG9pbnQpO1xuICAgICAgICAgICAgICAgIGRhdGFDYXJ0ZS5jbHVzdGVySWQgPSBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uY2x1c3RlcjU7XG4gICAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NhcnRlLXRvVXBkYXRlJywgZGF0YUNhcnRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsVXBkYXRlID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3JlY3Vub21icmUnK2RhdGEpO1xuICAgICAgICAgICAgICAgdmFsdWUudmFsdWUgPSBNYXRoLnJvdW5kKGRhdGEqMTAwIC8gdG90YWwudmFsdWUpO1xuICAgICAgICAgICAgICAgbm9tYnJlLnZhbHVlID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZnVuY3Rpb24gc2VsZWN0ZWRQb2ludHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHBvaW50cy52YWx1ZS5maWx0ZXIocG9pbnQgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhwb2ludC5zZWxlY3RlZCk7XG4gICAgICAgICAgICByZXR1cm4gKHBvaW50LnNlbGVjdGVkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBzZWFyY2hEYXRlQ3JlbmVhdShpZCkge1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LnBvaW50ID0gaWQ7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUuZGlzdGFuY2UgPSAncmVzZXQnO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LmRhdGUgPSBmb3JtYXREYXRlKGRhdGUudmFsdWUpO1xuICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS10b1VwZGF0ZScsIGRhdGFDcmVuZWF1KTtcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkxhIGRhdGUgYSDDqXTDqSBzw6lsZWN0aW9ubsOpZSA6XCIsIGZvcm1hdERhdGUoZGF0ZS52YWx1ZSkpO1xuXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGVUb0Zvcm1hdCl7XG4gICAgICAgICAgaWYgKCFkYXRlVG9Gb3JtYXQpIHJldHVybiAnJztcbiAgICAgICAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZVRvRm9ybWF0LmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlVG9Gb3JtYXQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7IC8vIExlcyBtb2lzIHNvbnQgaW5kZXjDqXMgw6AgcGFydGlyIGRlIDBcbiAgICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZVRvRm9ybWF0LmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvbkNoYW5nZU1pc3Npb24oKXtcbiAgICAgICAgICAgIGlmIChzZWFyY2hNaXNzaW9uLnZhbHVlICYmIHNlYXJjaE1pc3Npb24udmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICBtaXNzaW9uSUQudmFsdWUgPSBzZWFyY2hNaXNzaW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgZmV0Y2hQb2ludHNNaXNzaW9uKG1pc3Npb25JRC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbkRyb3AgPSBhc3luYyhldnQsIGxpc3QpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtSUQgPSBldnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ2l0ZW1JRCcpXG4gICAgICAgICAgY29uc3QgYWdlbnRJRCA9IGV2dC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgnYWdlbnRJRCcpXG4gICAgICAgICAgY29uc3QgdG90YWxDcmVuZWF1ID0gZXZ0LmRhdGFUcmFuc2Zlci5nZXREYXRhKCd0b3RhbENyZW5lYXUnKVxuICAgICAgICAgIGlmKHRvdGFsQ3JlbmVhdSA+PTMwKXtcbiAgICAgICAgICAgIGlmICghd2luZG93LmNvbmZpcm0oXCJBdHRlbnRpb24sIG1heCAzMCBwYXIgY3LDqW5lYXUgaG9yYWlyZSA6IHNvdWhhaXRleiB2b3VzIGNvbmZpcm1lciA/XCIpKXtyZXR1cm47fVxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgY29uZmlybSA9IDA7XG4gICAgICAgICAgc2VsZWN0ZWQgPSAnXCJzZWxlY3RlZFwiIDogWyc7XG4gICAgICAgICAgaWYoZnJvemVuUG9pbnRzLnZhbHVlLmxlbmd0aCA9PSAwKXthbGVydCgnTWVyY2kgZGUgc8OpbGVjdGlvbm5lciBhdSBtb2lucyB1biBwb2ludCcpO3JldHVybjt9XG4gICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWQgKyBlbGVtZW50LmlkICsgXCIsXCI7XG4gICAgICAgICAgICBpZihlbGVtZW50LmFnZW50LmlkICE9IGFnZW50SUQpe2NvbmZpcm0gPSAxO31cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkLnNsaWNlKDAsIC0xKSArICddJztcbiAgICAgICAgICBzZWxlY3RlZCA9ICd7XCJpZFwiOicrIGl0ZW1JRCArICcsJyArIHNlbGVjdGVkICsnfSc7XG4gICAgICAgICAgaWYoY29uZmlybSA9PSAxKXtcbiAgICAgICAgICAgIGlmICghd2luZG93LmNvbmZpcm0oXCJBdHRlbnRpb24sIGFnZW50cyBkaWZmw6lyZW50cyA6IHNvdWhhaXRleiB2b3VzIGNvbmZpcm1lciA/XCIpKXtyZXR1cm47fVxuICAgICAgICAgIH1cbiAgICAgICAgICAvL2NvbnNvbGUubG9nKCdzZWxlY3RlZCcgKyBzZWxlY3RlZCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW52b3llciBsZXMgbW9kaWZpY2F0aW9ucyDDoCBsJ0FQSSBTeW1mb255XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvcG9pbnRzL2NyZW5lYXUvdXBkYXRlL2AsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgcsOpc2VhdSB1cGRhdGUgY2VyZW5hdSA6XCIsIGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgcsOpc2VhdSB1cGRhdGUgY2VyZW5hdVwiKTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9yZXNldCBkZXMgZnJvemVuXG4gICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlPVtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VuZFRlbCA9IGFzeW5jKHBvaW50LCB0ZWwpID0+IHtcbiAgICAgICAgICAgICAgICBpZih0ZWwubGVuZ3RoID09IDkpe3RlbCA9ICcwJyArIHRlbDt9XG4gICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oJ3RlbDonK3RlbCwgJ19ibGFuaycpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS90ZWwvJytwb2ludC5pZCsnL3NlbmQnLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJhbnRUZWwgPSBhc3luYyhwb2ludCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdGVsLycrcG9pbnQuaWQrJy9lbnRyYW50Jywge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnVGVsIGVudHJhbnQgZW5yZWdpc3Ryw6knO1xuICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VuZFNNUyA9IGFzeW5jKHBvaW50LCB0ZWwsIG1lc3NhZ2VJRCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKHRlbC5sZW5ndGggPT0gOSl7dGVsID0gJzAnICsgdGVsO31cbiAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZSA9IG1lc3NhZ2VzLnZhbHVlLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQuaWQgPT09IG1lc3NhZ2VJRFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBtZXNzYWdldGVtcC52YWx1ZSA9IG1lc3NhZ2UudmFsdWVbMF0udGV4dGUucmVwbGFjZShcIk5PTVwiLCBwb2ludC5jaXZpbGl0ZSsnICcrcG9pbnQubm9tKTtcbiAgICAgICAgICAgICAgICBtZXNzYWdldGVtcC52YWx1ZSA9IG1lc3NhZ2V0ZW1wLnZhbHVlLnJlcGxhY2UoXCJBRFJFU1NFXCIsIHBvaW50Lm51bWVyb1J1ZSsnICcrIHBvaW50LnRpdHJlUnVlKycgJytwb2ludC5ub21SdWUrJyAnK3BvaW50LmNvZGVQb3N0YWwrJyAnK3BvaW50LnZpbGxlKTtcbiAgICAgICAgICAgICAgICBsZXQgbGllbiA9ICAnaHR0cHM6Ly8nK3dpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSsnL2VhZS9jb25uZWN0Lycrb3BlcmF0aW9uSUQudmFsdWUrJy8nK3BvaW50LmlkO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2V0ZW1wLnZhbHVlID0gbWVzc2FnZXRlbXAudmFsdWUucmVwbGFjZShcIkxJRU5cIiwgbGllbik7XG4gICAgICAgICAgICAgICAgaWYocG9pbnQuY3JlbmVhdSl7XG4gICAgICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldGVtcC52YWx1ZSA9IG1lc3NhZ2V0ZW1wLnZhbHVlLnJlcGxhY2UoXCJEQVRFXCIsIHBvaW50LmNyZW5lYXUuZGF0ZSsnICcrIHBvaW50LmNyZW5lYXUuY3JlbmVhdUhvcmFpcmUubm9tICsnIEFnZW50IDogJytwb2ludC5jcmVuZWF1LmFnZW50Lm5vbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGVuY29kZWRUZXh0ID0gZW5jb2RlVVJJQ29tcG9uZW50KG1lc3NhZ2V0ZW1wLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBc3R1Y2UgcG91ciBjb21wYXRpYmlsaXTDqSBpT1MgdnMgQW5kcm9pZFxuICAgICAgICAgICAgICAgIHZhciB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB2YXIgaXNpT1MgPSAvaXBob25lfGlwYWR8aXBvZC8udGVzdCh1YSk7XG4gICAgICAgICAgICAgICAgdmFyIHNlcGFyYXRvciA9IGlzaU9TID8gJyYnIDogJz8nO1xuXG4gICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oJ3NtczonICsgdGVsICsgc2VwYXJhdG9yICsgJ2JvZHk9JyArIGVuY29kZWRUZXh0LCAnX2JsYW5rJykuZm9jdXMoKTtcblxuICAgICAgICAgICAgICAgIC8qKi9cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Ntcy8nK3BvaW50LmlkKycvJyttZXNzYWdlLnZhbHVlWzBdLmlkKycvc2VuZCcsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAvLyBtZXNzYWdldXI9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRFbWFpbCA9IGFzeW5jKGlkLCBtZXNzYWdlX0lEKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFpbC8nK2lkKycvJyttZXNzYWdlX0lEKycvbWFpbHNlbmQnLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge21lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIGVudm9pIG1haWxcIjt9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IGRhdGEuZGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciByw6lzZWF1XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVsZXRlX2xvZz0gYXN5bmMoaWQpID0+IHtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2xvZy9kZWxldGUvJytpZCwge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHttZXNzYWdldXIudmFsdWUgPSBcIkVycmV1ciBlbnZvaSBkZWxldGVcIjt9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdkZWxldGUgb2snXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSBcIkVycmV1ciByw6lzZWF1XCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyZXVyIHLDqXNlYXVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3dDbGFzcyA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgJ2N1c3RvbS1mcm96ZW4tcm93JzogZGF0YS5mcm96ZW4gfTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjaGVja1RlbCA9ICh0ZWwpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0ZWwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSAvXig2fDA2fDd8MDcpLzsgXG4gICAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KFN0cmluZyh0ZWwpKTtcbiAgICAgICAgfVxuXG4vL2xlcyBwb2ludHMgc8OpbGVjdGlvbm7DqXNcblxuLy9FVkVOVCBJTlRFUkZBQ0UgIFxuXG4gICAgICAgIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyZWRQb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvLyBPbiB2w6lyaWZpZSBzaSBjaGFxdWUgcHJvZHVpdCBkZSBsYSBsaXN0ZSBhIHNhIGNsw6kgw6AgJ3RydWUnIGRhbnMgbCdvYmpldCBkZSBzw6lsZWN0aW9uXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRQb2ludHMudmFsdWUuZXZlcnkocCA9PiBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlW3AuaWRdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdG9nZ2xlQWxsID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbHRlcmVkUG9pbnRzLnZhbHVlLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgYWxlcnQoXCJJbXBvc3NpYmxlIGRlIHRvdXQgc8OpbGVjdGlvbm5lciA6IHRyb3AgZGUgcsOpc3VsdGF0cyAoPjEwKS5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzQWxsU2VsZWN0ZWQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlID0ge307XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNpbm9uIC0+IG9uIGNvbnN0cnVpdCB1biBvYmpldCBhdmVjIHRvdXMgbGVzIElEcyAoU8OpbGVjdGlvbiB0b3RhbGUpXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0ge307XG4gICAgICAgICAgICAgICAgZmlsdGVyZWRQb2ludHMudmFsdWUuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbmV3U2VsZWN0aW9uW3AuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlID0gbmV3U2VsZWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRvZ2dsZVJvdyA9IChwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHByb2R1Y3QuaWQ7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gISFzZWxlY3RlZFByb2R1Y3RzLnZhbHVlW2lkXTtcblxuICAgICAgICAgICAgLy8gQ3LDqWF0aW9uIGQndW5lIGNvcGllIHBvdXIgbGEgcsOpYWN0aXZpdMOpXG4gICAgICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB7IC4uLnNlbGVjdGVkUHJvZHVjdHMudmFsdWUgfTtcblxuICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV3U2VsZWN0aW9uW2lkXTsgLy8gT24gcmV0aXJlIGxhIGNsw6lcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3U2VsZWN0aW9uW2lkXSA9IHRydWU7IC8vIE9uIGFqb3V0ZSBsYSBjbMOpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGVjdGVkUHJvZHVjdHMudmFsdWUgPSBuZXdTZWxlY3Rpb247XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gMS4gTGVzIMOpbMOpbWVudHMgZmlnw6lzIChjZXV4IHPDqWxlY3Rpb25uw6lzKVxuICAgICAgICBjb25zdCBmcm96ZW5Qb2ludHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRQb2ludHMudmFsdWUuZmlsdGVyKHAgPT4gc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZVtwLmlkXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDIuIExlcyDDqWzDqW1lbnRzIHJlc3RhbnRzIChjZXV4IE5PTiBzw6lsZWN0aW9ubsOpcylcbiAgICAgICAgY29uc3QgdW5zZWxlY3RlZFBvaW50cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFBvaW50cy52YWx1ZS5maWx0ZXIocCA9PiAhc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZVtwLmlkXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG9uUm93RXhwYW5kID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBleHBhbmRlZFJvd3MudmFsdWUgPSB7IFtldmVudC5kYXRhLmlkXTogdHJ1ZSB9O1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGVwbG95IGlkJyArIGV2ZW50LmRhdGEuaWQpXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZWRpdFByb2R1Y3QgPSAocHJvZCkgPT4ge1xuICAgICAgICAgICAgcHJvZHVjdC52YWx1ZSA9IHsuLi5wcm9kfTtcbiAgICAgICAgICAgIHByb2R1Y3REaWFsb2cudmFsdWUgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBleHBvcnRFeGNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgIGV4Y2VsRGlhbG9nLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGlkZURpYWxvZyA9ICgpID0+IHtcbiAgICAgICAgICAgIGV4Y2VsRGlhbG9nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICBwcm9kdWN0RGlhbG9nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICBzdWJtaXR0ZWQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfTtcblxuLy9ERU1BUlJBR0VcbiAgICAgICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChcImh0dHBzOi8vYWQxMWM2MDAtZWY0YS00ODE1LWEzZGMtYTMyNjgyNzQ1YTE0Lm1lcmN1cmUucm9ja3MvLndlbGwta25vd24vbWVyY3VyZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcInRvcGljXCIsIFwiL2NhcnRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gaGFuZGxlTWVyY3VyZU1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignY2FydGUnLCBoYW5kbGVNZXJjdXJlTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgRXZlbnRTb3VyY2U6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1vaXMudmFsdWUgPSBwcm9wcy5wYXJhbS5tb2lzO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbC52YWx1ZSA9IHByb3BzLnBhcmFtLnRvdGFsO1xuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGUudmFsdWUgPSBwcm9wcy5wYXJhbS5zdGFydERhdGU7XG4gICAgICAgICAgICAgICAgICAgIG5vbWJyZS52YWx1ZSA9IHByb3BzLnBhcmFtLm5vbWJyZTtcbiAgICAgICAgICAgICAgICAgICAgdG90YWwudmFsdWUgPSBwcm9wcy5wYXJhbS50b3RhbDtcbiAgICAgICAgICAgICAgICAgICAgcG91cmNlbnQudmFsdWUgPSBNYXRoLnJvdW5kKHByb3BzLnBhcmFtLm5vbWJyZSoxMDAgLyBwcm9wcy5wYXJhbS50b3RhbCk7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbklELnZhbHVlID0gcHJvcHMucGFyYW0ub3BlcmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW9uSUQudmFsdWUgPSBwcm9wcy5wYXJhbS5taXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hNaXNzaW9uLnZhbHVlID0gbWlzc2lvbklELnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVySUQudmFsdWUgPSBwcm9wcy5wYXJhbS5jbHVzdGVySWQ7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VTTVMudmFsdWUgPSBwcm9wcy5wYXJhbS5tZXNzYWdlU01TO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZWFnZW50cy52YWx1ZSA9IHByb3BzLnBhcmFtLmFnZW50cztcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVtaXNzaW9ucy52YWx1ZSA9IHByb3BzLnBhcmFtLm1pc3Npb25zO1xuICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZS52YWx1ZSA9IHByb3BzLnBhcmFtLmRpc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICBldGF0cy52YWx1ZSA9IHByb3BzLnBhcmFtLmV0YXRzO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy52YWx1ZSA9IHByb3BzLnBhcmFtLm1lc3NhZ2VzO1xuICAgICAgICAgICAgICAgICAgICBidXMub24oJ2NsdXN0ZXItc2VsZWN0ZWQnLCB1cGRhdGVDbHVzdGVyKTtcblxuICAgICAgICAgICAgICAgICAgICBmZXRjaFBvaW50c01pc3Npb24obWlzc2lvbklELnZhbHVlKTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcblxuICAgICAgICAgICAgYnVzLm9mZignY2x1c3Rlci1zZWxlY3RlZCcsIHVwZGF0ZUNsdXN0ZXIpO1xuICAgICAgICAgICAgcG9pbnRzLnZhbHVlID0gW11cbiAgICAgICAgICAgIGZpbHRlcmVkUG9pbnRzID0gW11cbiAgICAgICAgICAgIGlmIChvYnNlcnZlcikgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiTWVyY3VyZSBFdmVudFNvdXJjZSBjbG9zZWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8vIG9uQmVmb3JlVW5tb3VudCBlc3QgYXBwZWzDqSBqdXN0ZSBhdmFudCBxdWUgbGUgY29tcG9zYW50IG5lIHNvaXQgcmV0aXLDqSBkdSBET00uXG4gICAgICAgIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgICAgICAgYnVzLm9mZignY2x1c3Rlci1zZWxlY3RlZCcpO1xuICAgICAgICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuLy88U2VhcmNoIHYtaWY9XCJwYXJhbVwiIDpwYXJhbT1cInBhcmFtXCIvPlxuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG4gICAgICAgIDxkaXYgaWQ9XCJwb2ludHNcIiBAZHJvcD1cIm9uRHJvcCgkZXZlbnQsIDEpXCIgQGRyYWdvdmVyLnByZXZlbnQgQGRyYWdlbnRlci5wcmV2ZW50IHN0eWxlPVwiaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNTAwcHgpO1wiPlxuICAgICAgICAgICAgPERhdGFUYWJsZSBcbiAgICAgICAgICAgIDp2YWx1ZT1cImZpbHRlcmVkUG9pbnRzXCIgXG4gICAgICAgICAgICB2LW1vZGVsOmV4cGFuZGVkUm93cz1cImV4cGFuZGVkUm93c1wiIFxuICAgICAgICAgICAgQHJvd0V4cGFuZD1cIm9uUm93RXhwYW5kXCJcbiAgICAgICAgICAgIHNjcm9sbGFibGUgXG4gICAgICAgICAgICBzY3JvbGxIZWlnaHQ9XCJmbGV4XCJcbiAgICAgICAgICAgIHBhZ2luYXRvciA6cm93cz1cIjEwMFwiIFxuICAgICAgICAgICAgZGF0YUtleT1cImlkXCIgXG4gICAgICAgICAgICBmaWx0ZXJEaXNwbGF5PVwicm93XCIgXG4gICAgICAgICAgICA6bG9hZGluZz1cImxvYWRpbmdcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIDpyb3ctY2xhc3M9XCJyb3dDbGFzc1wiIFxuICAgICAgICAgICAgOmNsYXNzPVwieyAnaGlkZS1zZWxlY3QtYWxsJzogZmlsdGVyZWRQb2ludHMubGVuZ3RoID4gMTAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWZpbHRlci1zbGFzaFwiIGxhYmVsPVwiQ2xlYXIgRmlsdHJlXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgQGNsaWNrPVwiY2xlYXJGaWx0ZXIoKVwiIHN0eWxlPVwiaGVpZ2h0OjQwcHg7XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cIm1pc3Npb24tZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaE1pc3Npb25cIiBAY2hhbmdlPVwib25DaGFuZ2VNaXNzaW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwibWlzc2lvbiBpbiBsaXN0ZW1pc3Npb25zXCIgOmtleT1cIm1pc3Npb24uaWRcIiA6dmFsdWU9XCJtaXNzaW9uLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1pc3Npb24ubm9tIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJoZWFkZXItYXBwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDogNjIwcHg7Y29sb3I6IzAwMDtcIj48dGJvZHk+PHRyPjx0ZCBzdHlsZT1cIndpZHRoOiAxNTBweDtcIj57eyBub21icmUgfX0gLyB7eyB0b3RhbCB9fSBwb2ludHMmbmJzcDsmbmJzcDs8L3RkPjx0ZCBzdHlsZT1cIndpZHRoOiA0MDBweDtcIj48UHJvZ3Jlc3NCYXIgOnZhbHVlPVwicG91cmNlbnRcIj57e3BvdXJjZW50fX0lPC9Qcm9ncmVzc0Jhcj48L3RkPjx0ZCBzdHlsZT1cIndpZHRoOiAxMjBweDt0ZXh0LWFsaWduOnJpZ2h0XCI+Jm5ic3A7e3sgY291bnQgfX0gcsOpc3VsdGF0czwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+IFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZW5kIHBiLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIGljb249XCJwaSBwaS1leHRlcm5hbC1saW5rXCIgbGFiZWw9XCJFeHBvcnRcIiBAY2xpY2s9XCJleHBvcnRFeGNlbCgpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjZW1wdHk+IFBhcyBkZSBwb2ludCB0cm91dsOpIG91IGF1dHJlIG1pc3Npb24uIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNsb2FkaW5nPiBMb2FkaW5nIC4gPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiaWRcIiBoZWFkZXI9XCJJRFwiIC8+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBleHBhbmRlciBzdHlsZT1cIndpZHRoOiAyMHB4XCIgLz5cbiAgICAgICAgICAgICAgICA8Q29sdW1uPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrLnN0b3A9XCJ0b2dnbGVBbGxcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzcz1cInsgJ2Rpc2FibGVkLXdyYXBwZXInOiBmaWx0ZXJlZFBvaW50cy5sZW5ndGggPiAxMCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvdXQgc8OpbGVjdGlvbm5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bW9kZWxWYWx1ZT1cImlzQWxsU2VsZWN0ZWRcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJpbmFyeT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZmlsdGVyZWRQb2ludHMubGVuZ3RoID4gMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lO1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrLnN0b3A9XCJ0b2dnbGVSb3coZGF0YSlcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LXdyYXBwZXJcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bW9kZWxWYWx1ZT1cIiEhc2VsZWN0ZWRQcm9kdWN0c1tkYXRhLmlkXVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6YmluYXJ5PVwidHJ1ZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lO1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwibm9tXCIgc3R5bGU9XCJtaW4td2lkdGg6IDEycmVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XCJ7ICdmb250LWJsdWUnOiBzZWxlY3RlZFRhYltkYXRhLmlkXSA9PSB0cnVlIH1cIj57eyBkYXRhLmNpdmlsaXRlIH19IHt7IGRhdGEubm9tIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgdi1tb2RlbD1cInNlYXJjaE5vbVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJOb21cIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiAgICAgIFxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbHM9XCJhbGVydGVcIiBzdHlsZT1cIm1pbi13aWR0aDogM3JlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRvZ2dsZVN3aXRjaCB2LW1vZGVsPVwiZGF0YS5hbGVydGVcIiBAY2hhbmdlPVwiY2hhbmdlX2FsZXJ0ZShkYXRhKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJldGF0LWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hBbGVydGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91c1wiPlRvdXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidHJ1ZVwiPk91aTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYWxzZVwiPk5vbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+ICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJudW1lcm9DbGllbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLm51bWVyb0NsaWVudCB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgdi1tb2RlbD1cInNlYXJjaE51bWVyb0NsaWVudFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJOwrAgY2xpZW50XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gICBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibnVtZXJvUGh5c2lxdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLm51bWVyb1BoeXNpcXVlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCB2LW1vZGVsPVwic2VhcmNoTnVtZXJvUGh5c2lxdWVcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiTsKwIHBoeXNcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwidGVsMFwiIHN0eWxlPVwibWluLXdpZHRoOiA4MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bnRlbDJcIiBAY2xpY2s9XCJlbnRyYW50VGVsKGRhdGEpXCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1waG9uZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPjwvYnV0dG9uPjxicj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIEVudHJhbnRcbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwidGVsXCIgc3R5bGU9XCJtaW4td2lkdGg6IDgwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLnRlbDFcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvIGJ0bnRlbFwiIEBjbGljaz1cInNlbmRUZWwoZGF0YSxkYXRhLnRlbDEpXCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1waG9uZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwO1RFTCB7eyBkYXRhLnRlbDEgfX08L2J1dHRvbj48L3NwYW4+PGJyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS50ZWwyXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mbyBidG50ZWxcIiBAY2xpY2s9XCJzZW5kVGVsKGRhdGEsZGF0YS50ZWwyKVwiPjxzcGFuIGNsYXNzPVwicGkgcGktcGhvbmVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj4mbmJzcDtURUwge3sgZGF0YS50ZWwyIH19PC9idXR0b24+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgdi1tb2RlbD1cInNlYXJjaFRlbFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJUZWxcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gIGZpZWxkPVwiZXRhdFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5ldGF0ICYmIGRhdGEuZXRhdC5pZFwiIDpzdHlsZT1cInsgXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcycHggOHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjY2NjJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzE2MHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZicsIC8qIENvdWxldXIgZGUgdGV4dGUgYmxhbmNoZSBwb3VyIHVuIG1laWxsZXVyIGNvbnRyYXN0ZSAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBkYXRhLmV0YXQuY291bGV1clxuICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuZXRhdC5ub20gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV0YXQtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaEV0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91c1wiPlRvdXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwiZXRhdCBpbiBldGF0c1wiIDprZXk9XCJldGF0XCIgOnZhbHVlPVwiZXRhdC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBldGF0Lm5vbSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImVtcGxhY2VtZW50Q29tcHRldXJcIiBzdHlsZT1cIm1pbi13aWR0aDogMTAwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5lbXBsYWNlbWVudENvbXB0ZXVyIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwibGliZWxsZS1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoRW1wbGFjZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3VzXCI+VG91cyBsZXMgZW1wbGFjLjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cImVtcGxhY2VtZW50IGluIGVtcGxhY2VtZW50c1wiIDprZXk9XCJlbXBsYWNlbWVudFwiIDp2YWx1ZT1cImVtcGxhY2VtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZW1wbGFjZW1lbnQgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm1vZHVsZVNldWxcIiBzdHlsZT1cIm1pbi13aWR0aDogMTAwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEubW9kdWxlU2V1bFwiPk1vZHVsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCIhZGF0YS5tb2R1bGVTZXVsXCI+Q29tcHQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gc3R5bGU9XCJ3aWR0aDogNDBweFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJzbG90UHJvcHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWNvbj1cInBpIHBpLXBlbmNpbFwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHJvdW5kZWQgY2xhc3M9XCJtci0yXCIgQGNsaWNrPVwiZGlzdGFuY2VVcGRhdGUoc2xvdFByb3BzLmRhdGEuaWQsIGRpc3RhbmNlKVwiPnt7ZGlzdGFuY2V9fW08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibm9tUnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5udW1lcm9SdWUgfX0ge3sgZGF0YS50aXRyZVJ1ZSAgfX0ge3sgZGF0YS5ub21SdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJub21SdWUtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaE5vbVJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXRlc1wiPlRvdXRlcyBsZXMgcnVlczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cInJ1ZSBpbiBydWVzXCIgOmtleT1cInJ1ZVwiIDp2YWx1ZT1cInJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJ1ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJ2aWxsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuY29kZVBvc3RhbCB9fSB7eyBkYXRhLnZpbGxlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInZpbGxlLWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hWaWxsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3V0ZXNcIj5Ub3V0ZXMgdmlsbGVzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cInZpbGxlIGluIHZpbGxlc1wiIDprZXk9XCJ2aWxsZVwiIDp2YWx1ZT1cInZpbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHZpbGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiYWdlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5hZ2VudFwiPnt7IGRhdGEuYWdlbnQubm9tIH19IDxzcGFuIHYtaWY9XCJkYXRhLmFnZW50LnByZW5vbVwiPnt7IGRhdGEuYWdlbnQucHJlbm9tIH19PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiYWdlbnQtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaEFnZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXNcIj5Ub3VzIGFnZW50czwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJhZ2VudCBpbiBhZ2VudHNcIiA6a2V5PVwiYWdlbnRcIiA6dmFsdWU9XCJhZ2VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhZ2VudCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIlBsYW5pZlwiIHN0eWxlPVwibWluLXdpZHRoOiA1MHB4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5jcmVuZWF1XCI+e3sgZ2V0TGFzdFBsYW5pZmllZERhdGUoZGF0YSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJkYXRlUGxhbmlmLWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hQbGFuaWZSVlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3V0ZXNcIj5QbGFuaWY8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwicGxhblJWIGluIHBsYW5pZlJWXCIgOmtleT1cInBsYW5SVlwiIDp2YWx1ZT1cInBsYW5SVlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwbGFuUlYgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJkYXRlUlZcIiBzdHlsZT1cIm1pbi13aWR0aDogMTUwcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmNyZW5lYXVcIj57eyBkYXRhLmNyZW5lYXUuZGF0ZSB9fSB7eyBkYXRhLmNyZW5lYXUuY3JlbmVhdUhvcmFpcmUubm9tIH19PGJyPkFnZW50IDoge3sgZGF0YS5jcmVuZWF1LmFnZW50Lm5vbSB9fSA8c3BhbiB2LWlmPVwiZGF0YS5jcmVuZWF1LmFnZW50LnByZW5vbVwiPnt7IGRhdGEuY3JlbmVhdS5hZ2VudC5wcmVub20gfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJkYXRlUlYtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaERhdGVSVlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3V0ZXNcIj5SVjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJkYXRlUlYgaW4gZGF0ZXNSVlwiIDprZXk9XCJkYXRlUlZcIiA6dmFsdWU9XCJkYXRlUlZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZVJWIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICAgPENvbHVtbiBoZWFkZXI9XCJFZGl0XCIgc3R5bGU9XCJ3aWR0aDogNTBweFwiPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInNsb3RQcm9wc1wiPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gaWNvbj1cInBpIHBpLXBlbmNpbFwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHJvdW5kZWQgY2xhc3M9XCJtci0yXCIgQGNsaWNrPVwiZWRpdFByb2R1Y3Qoc2xvdFByb3BzLmRhdGEpXCI+RWRpdDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNleHBhbnNpb249XCJzbG90UHJvcHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogODAwcHg7XCI+Q3LDqW5lYXV4IDogPGJ1dHRvbiBAY2xpY2s9XCJkaXN0YW5jZVVwZGF0ZShzbG90UHJvcHMuZGF0YS5pZCwgNTApXCIgY2xhc3M9XCJtYi0xMFwiPjUwIG08L2J1dHRvbj4mbmJzcDsmbmJzcDs8YnV0dG9uIEBjbGljaz1cImRpc3RhbmNlVXBkYXRlKHNsb3RQcm9wcy5kYXRhLmlkLCAyMDApXCIgY2xhc3M9XCJtYi0xMFwiPjIwMCBtPC9idXR0b24+Jm5ic3A7Jm5ic3A7PGJ1dHRvbiBAY2xpY2s9XCJkaXN0YW5jZVVwZGF0ZShzbG90UHJvcHMuZGF0YS5pZCwgNTAwKVwiIGNsYXNzPVwibWItMTBcIj41MDAgbTwvYnV0dG9uPiZuYnNwOyZuYnNwOzxidXR0b24gQGNsaWNrPVwiZGlzdGFuY2VVcGRhdGUoc2xvdFByb3BzLmRhdGEuaWQgLCAncmVzZXQnKVwiIGNsYXNzPVwibWItMTBcIj5Ub3VzPC9idXR0b24+Jm5ic3A7Jm5ic3A7PHZ1ZS1kYXRlLXBpY2tlciB2LW1vZGVsPVwiZGF0ZVwiICBwbGFjZWhvbGRlcj1cIkRhdGVcIiA6dGVsZXBvcnQ9XCJ0cnVlXCIgOnN0YXJ0LWRhdGU9XCJzdGFydERhdGVcIiBhdXRvLWFwcGx5IEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJzZWFyY2hEYXRlQ3JlbmVhdShzbG90UHJvcHMuZGF0YS5pZClcIj48L3Z1ZS1kYXRlLXBpY2tlcj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJpbmZvc1RhYnNcIj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvc1RhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5NZXNzYWdlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICB2LWZvcj1cIm1lc3NhZ2UgaW4gbWVzc2FnZXNcIiA6a2V5PVwibWVzc2FnZS5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cInNsb3RQcm9wcy5kYXRhLmVtYWlsLmxlbmd0aCA+IDYgJiYgbWVzc2FnZS50eXBlID09IDFcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvXCIgQGNsaWNrPVwic2VuZEVtYWlsKHNsb3RQcm9wcy5kYXRhLmlkLG1lc3NhZ2UuaWQpXCIgc3R5bGU9XCJ3aWR0aDogMjUwcHggIWltcG9ydGFudFwiPnt7IG1lc3NhZ2Uubm9tIH19L3t7IG1lc3NhZ2Uuc3VqZXQgfX08YnI+e3sgc2xvdFByb3BzLmRhdGEuZW1haWwgfX08L2J1dHRvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwic2xvdFByb3BzLmRhdGEudGVsMSAmJiBjaGVja1RlbChzbG90UHJvcHMuZGF0YS50ZWwxKSAmJiBtZXNzYWdlLnR5cGUgPT0gMlwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm9cIiBAY2xpY2s9XCJzZW5kU01TKHNsb3RQcm9wcy5kYXRhLHNsb3RQcm9wcy5kYXRhLnRlbDEsbWVzc2FnZS5pZClcIiBzdHlsZT1cIndpZHRoOiAyNTBweCAhaW1wb3J0YW50XCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1tb2JpbGVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj4mbmJzcDsmbmJzcDt7eyBtZXNzYWdlLm5vbSB9fS97eyBtZXNzYWdlLnN1amV0IH19PGJyPnt7IHNsb3RQcm9wcy5kYXRhLnRlbDEgfX08L2J1dHRvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwic2xvdFByb3BzLmRhdGEudGVsMiAmJiBjaGVja1RlbChzbG90UHJvcHMuZGF0YS50ZWwyKSAmJiBtZXNzYWdlLnR5cGUgPT0gMlwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm9cIiBAY2xpY2s9XCJzZW5kU01TKHNsb3RQcm9wcy5kYXRhLHNsb3RQcm9wcy5kYXRhLnRlbDIsbWVzc2FnZS5pZClcIiBzdHlsZT1cIndpZHRoOiAyNTBweCAhaW1wb3J0YW50XCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1tb2JpbGVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj4mbmJzcDsmbmJzcDt7eyBtZXNzYWdlLm5vbSB9fS97eyBtZXNzYWdlLnN1amV0IH19PGJyPnt7IHNsb3RQcm9wcy5kYXRhLnRlbDIgfX08L2J1dHRvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwic2xvdFByb3BzLmRhdGEuZW1haWwubGVuZ3RoID4gNiAmJiBtZXNzYWdlLnR5cGUgPT0gNVwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm9cIiBAY2xpY2s9XCJzZW5kRW1haWwoc2xvdFByb3BzLmRhdGEuaWQsbWVzc2FnZS5pZClcIiBzdHlsZT1cIndpZHRoOiAyNTBweCAhaW1wb3J0YW50XCI+e3sgbWVzc2FnZS5ub20gfX0ve3sgbWVzc2FnZS5zdWpldCB9fTxicj57eyBzbG90UHJvcHMuZGF0YS5lbWFpbCB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJzbG90UHJvcHMuZGF0YS50ZWwxICYmIGNoZWNrVGVsKHNsb3RQcm9wcy5kYXRhLnRlbDEpICYmIG1lc3NhZ2UudHlwZSA9PSA1XCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mb1wiIEBjbGljaz1cInNlbmRTTVMoc2xvdFByb3BzLmRhdGEsc2xvdFByb3BzLmRhdGEudGVsMSxtZXNzYWdlLmlkKVwiIHN0eWxlPVwid2lkdGg6IDI1MHB4ICFpbXBvcnRhbnRcIj48c3BhbiBjbGFzcz1cInBpIHBpLW1vYmlsZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwOyZuYnNwO3t7IG1lc3NhZ2Uubm9tIH19L3t7IG1lc3NhZ2Uuc3VqZXQgfX08YnI+e3sgc2xvdFByb3BzLmRhdGEudGVsMSB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJzbG90UHJvcHMuZGF0YS50ZWwyICYmIGNoZWNrVGVsKHNsb3RQcm9wcy5kYXRhLnRlbDIpICYmIG1lc3NhZ2UudHlwZSA9PSA1XCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mb1wiIEBjbGljaz1cInNlbmRTTVMoc2xvdFByb3BzLmRhdGEsc2xvdFByb3BzLmRhdGEudGVsMixtZXNzYWdlLmlkKVwiIHN0eWxlPVwid2lkdGg6IDI1MHB4ICFpbXBvcnRhbnRcIj48c3BhbiBjbGFzcz1cInBpIHBpLW1vYmlsZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwOyZuYnNwO3t7IG1lc3NhZ2Uubm9tIH19L3t7IG1lc3NhZ2Uuc3VqZXQgfX08YnI+e3sgc2xvdFByb3BzLmRhdGEudGVsMiB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm9zVGFiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNvbW1lbnRhaXJlPC9wPjxCdXR0b24gaWNvbj1cInBpIHBpLXBlbmNpbFwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHJvdW5kZWQgY2xhc3M9XCJtci0yIHRvcC1yaWdodFwiIEBjbGljaz1cImVkaXRQcm9kdWN0KHNsb3RQcm9wcy5kYXRhKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAgc2xvdFByb3BzLmRhdGEuY29tbWVudGFpcmUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mb3NUYWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SGlzdG9yaXF1ZTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTttYXgtd2lkdGg6IDQwMHB4O3BhZGRpbmc6IDJweCAhaW1wb3J0YW50O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHYtZm9yPVwibG9nIGluIHNsb3RQcm9wcy5kYXRhLmxvZ3BvaW50c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBsb2cuZGF0ZWNyZWEgfX08L3RkPjx0ZD57eyBsb2cuYWN0aW9uLm5vbSB9fTwvdGQ+PHRkPnt7IGxvZy5jb21tZW50YWlyZSB9fTwvdGQ+PHRkPjxzcGFuIGNsYXNzPVwicC1idXR0b24taWNvbiBwaSBwaS10cmFzaFwiIGRhdGEtcD1cImxlZnRcIiBkYXRhLXBjLXNlY3Rpb249XCJpY29uXCIgQGNsaWNrPVwiZGVsZXRlX2xvZyhsb2cuaWQpXCI+PC9zcGFuPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mb3NUYWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+RXRhdHM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7bWF4LXdpZHRoOiA0MDBweDtwYWRkaW5nOiAycHggIWltcG9ydGFudDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2LWZvcj1cImxvZyBpbiBzbG90UHJvcHMuZGF0YS5sb2dldGF0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBsb2cuZGF0ZWNyZWEgfX08L3RkPjx0ZD57eyBsb2cuZXRhdC5ub20gfX08L3RkPjx0ZD57eyBsb2cuY29tbWVudGFpcmUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICA8L0RhdGFUYWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPERpYWxvZyB2LW1vZGVsOnZpc2libGU9XCJwcm9kdWN0RGlhbG9nXCIgOnN0eWxlPVwieyB3aWR0aDogJzQ1MHB4JyB9XCIgaGVhZGVyPVwiRMOpdGFpbHMgZHUgcG9pbnRcIiA6bW9kYWw9XCJ0cnVlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNlwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJudW1lcm9DbGllbnRcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+TnVtw6lybyBDbGllbnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwibnVtZXJvQ2xpZW50XCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5udW1lcm9DbGllbnRcIiByZXF1aXJlZD1cInRydWVcIiBhdXRvZm9jdXMgOmludmFsaWQ9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QubnVtZXJvQ2xpZW50XCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHYtaWY9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QubnVtZXJvQ2xpZW50XCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDBcIj5OdW3DqXJvIENsaWVudCByZXF1aXMuPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY29tcHRldXJBY2Nlc3NpYmxlXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkFjY2Vzc2libGU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImNvbXB0ZXVyQWNjZXNzaWJsZVwiIHYtbW9kZWw9XCJwcm9kdWN0LmNvbXB0ZXVyQWNjZXNzaWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gOnZhbHVlPVwidHJ1ZVwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogZ3JlZW5cIj5PdWk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIDp2YWx1ZT1cImZhbHNlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiByZWRcIj5Ob248L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PiBcbiAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV0YXRcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+RXRhdDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3Qgdi1tb2RlbD1cInByb2R1Y3QuZXRhdFwiIDpvcHRpb25zPVwiZXRhdHNcIiBvcHRpb25MYWJlbD1cIm5vbVwiICA6aW5pdGlhbFZhbHVlcz1cInByb2R1Y3QuZXRhdC5pZFwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0aW9ubmVyIHVuIMOpdGF0XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gXG4gICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWdlbnRcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+QWdlbnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0IHYtbW9kZWw9XCJwcm9kdWN0LmFnZW50XCIgOm9wdGlvbnM9XCJsaXN0ZWFnZW50c1wiIG9wdGlvbkxhYmVsPVwibm9tXCIgIDppbml0aWFsVmFsdWVzPVwicHJvZHVjdC5hZ2VudC5pZFwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0aW9ubmVyIHVuIGFnZW50XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNpdmlsaXRlXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkNpdmlsaXTDqTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJjaXZpbGl0ZVwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QuY2l2aWxpdGVcIiByZXF1aXJlZD1cInRydWVcIiBhdXRvZm9jdXMgOmludmFsaWQ9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QuY2l2aWxpdGVcIiBmbHVpZCAvPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgdi1pZj1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5jaXZpbGl0ZVwiIGNsYXNzPVwidGV4dC1yZWQtNTAwXCI+Q2l2aWxpdMOpIHJlcXVpc2UuPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5Ob208L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwibmFtZVwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3Qubm9tXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgYXV0b2ZvY3VzIDppbnZhbGlkPVwic3VibWl0dGVkICYmICFwcm9kdWN0Lm5vbVwiIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCB2LWlmPVwic3VibWl0dGVkICYmICFwcm9kdWN0Lm5vbVwiIGNsYXNzPVwidGV4dC1yZWQtNTAwXCI+Tm9tIHJlcXVpcy48L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0ZWwxXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPlRlbCAxPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cInRlbDFcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0LnRlbDFcIiByZXF1aXJlZD1cImZhbHNlXCIgYXV0b2ZvY3VzIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRlbDJcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+VGVsIDI8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwidGVsMlwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QudGVsMlwiIHJlcXVpcmVkPVwiZmFsc2VcIiBhdXRvZm9jdXMgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZW1haWxcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+RW1haWw8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwiZW1haWxcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0LmVtYWlsXCIgcmVxdWlyZWQ9XCJmYWxzZVwiIGF1dG9mb2N1cyBmbHVpZCAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb21tZW50YWlyZVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5Db21tZW50YWlyZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxUZXh0YXJlYSBpZD1cImNvbW1lbnRhaXJlXCIgdi1tb2RlbD1cInByb2R1Y3QuY29tbWVudGFpcmVcIiByZXF1aXJlZD1cImZhbHNlXCIgcm93cz1cIjNcIiBjb2xzPVwiMjBcIiBmbHVpZCAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8dGVtcGxhdGUgI2Zvb3Rlcj5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiQW5udWxlclwiIGljb249XCJwaSBwaS10aW1lc1wiIHRleHQgQGNsaWNrPVwiaGlkZURpYWxvZ1wiIC8+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIlNhdXZlclwiIGljb249XCJwaSBwaS1jaGVja1wiIEBjbGljaz1cInNlbmRJbmZvcyhwcm9kdWN0LmlkKVwiIC8+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L0RpYWxvZz5cbiAgICAgICAgPERpYWxvZyB2LW1vZGVsOnZpc2libGU9XCJleGNlbERpYWxvZ1wiIDpzdHlsZT1cInsgd2lkdGg6ICc0NTBweCcgfVwiIGhlYWRlcj1cIkV4cG9ydCBFeGNlbFwiIDptb2RhbD1cInRydWVcIj5cbiAgICAgICAgICAgIDxwPlZvdXMgcG91dmV6IGNyw6llciB1biByYXBwb3J0IHBhcnRpZWwgbGltaXTDqSDDoCA1MDAgbGlnbmVzIMOgIHBhcnRpciBkZSB2b3MgY3JpdMOocmVzLjwvcD5cbiAgICAgICAgICAgIDxwPk91IGxhbmNlciB1biBleHBvcnQgY29tcGxldCBkZSBsYSBtaXNzaW9uIChlbnZvaSBwYXIgbWFpbCk8L3A+XG4gICAgICAgICAgICA8dGVtcGxhdGUgI2Zvb3Rlcj5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiQW5udWxlclwiIGljb249XCJwaSBwaS10aW1lc1wiIHRleHQgQGNsaWNrPVwiaGlkZURpYWxvZ1wiIC8+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIkV4cG9ydCBjb21wbGV0XCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgQGNsaWNrPVwic2VuZEV4Y2VsQ3JvbigpXCIgLz5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiRXhwb3J0ZXIgbWEgc8OpbGVjdGlvblwiIGljb249XCJwaSBwaS1jaGVja1wiIEBjbGljaz1cInNlbmRFeGNlbCgpXCIgLz5cbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvRGlhbG9nPlxuPC90ZW1wbGF0ZT5cbjxzdHlsZT5cbjpkZWVwKHRyLm15LWN1c3RvbS1oaWdobGlnaHQpIHtcbiAgICAvKmJhY2tncm91bmQ6ICNmY2Q5YTUgIWltcG9ydGFudDsqL1xuICAgIC8qZm9udC13ZWlnaHQ6IGJvbGQ7Ki9cbn1cbi5wLWRhdGF0YWJsZS10aGVhZCA+IHRyID4gdGggIHtcbiAgICBwYWRkaW5nLXRvcDogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctbGVmdDogNHB4ICFpbXBvcnRhbnQ7XG59XG4ucC1kYXRhdGFibGUtaGVhZGVyLWNlbGwgICB7XG4gICAgcGFkZGluZy10b3A6IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctYm90dG9tOiA0cHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWxlZnQ6IDRweCAhaW1wb3J0YW50O1xufVxuLnAtZGF0YXRhYmxlLWZyb3plbi10Ym9keSA+IHRyID4gdGQge1xuICAvKmJhY2tncm91bmQtY29sb3I6ICNjOGUzZmUgIWltcG9ydGFudDsgKi9cbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiBibHVlICFpbXBvcnRhbnQ7XG59XG4uZHBfX2lucHV0LCAuZHBfX21haW57d2lkdGg6IDI1MHB4ICFpbXBvcnRhbnQ7ZGlzcGxheTogaW5saW5lLWJsb2NrO31cbiNpbmZvc1RhYnMge2JhY2tncm91bmQtY29sb3I6IGdyZXk7cGFkZGluZzogNXB4O31cbi5pbmZvc1RhYiB7aGVpZ2h0OjMwMHB4OyBvdmVyZmxvdy15OiBhdXRvO2JhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7fVxuXG4uaGlkZS1zZWxlY3QtYWxsIHRoID4gLnAtY2hlY2tib3gge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG4ucC10b2dnbGVzd2l0Y2gtc2xpZGVyW2RhdGEtcD1cImNoZWNrZWRcIl0ge2JhY2tncm91bmQtY29sb3I6IHJlZCAhaW1wb3J0YW50O31cblxuLmRyb3Bkb3duLWNvbnRlbnQge2JhY2tncm91bmQtY29sb3I6ICNmZmY7IHotaW5kZXg6IDEwMDAgIWltcG9ydGFudDt9XG5cbnNlbGVjdCB7bWF4LXdpZHRoOiAxMjBweDt9XG5idXR0b24ge31cbi5idG50ZWwge3dpZHRoOiAxNTBweCAhaW1wb3J0YW50OyBmb250LXNpemU6MTJweDtoZWlnaHQgOiAyMHB4ICFpbXBvcnRhbnQ7cGFkZGluZzogMnB4ICFpbXBvcnRhbnQ7fVxuLmJ0bnRlbDIge3dpZHRoOiA0MHB4ICFpbXBvcnRhbnQ7IGxpbmUtaGVpZ2h0OiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Zm9udC1zaXplOjEycHg7aGVpZ2h0IDogMjBweCAhaW1wb3J0YW50O3BhZGRpbmc6IDJweCAhaW1wb3J0YW50O31cbi5mb250LWJsdWUge2ZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogcmdiKDMsIDI1MywgNzQpO31cbjwvc3R5bGU+IiwiPHNjcmlwdCBzZXR1cD5cblxuaW1wb3J0IHsgY3JlYXRlQXBwLCByZWYsIG9uTW91bnRlZCwgb25Vbm1vdW50ZWQsIGdldEN1cnJlbnRJbnN0YW5jZSwgY29tcHV0ZWQsIHdhdGNofSAgZnJvbSAndnVlJztcbmltcG9ydCB7IGJ1cyB9IGZyb20gJy4uL2J1cy5qcyc7IFxuaW1wb3J0IExlYWZsZXQgZnJvbSAnLi9MZWFmbGV0LnZ1ZSc7XG5pbXBvcnQgVGFicyBmcm9tICdwcmltZXZ1ZS90YWJzJztcbmltcG9ydCBUYWJMaXN0IGZyb20gJ3ByaW1ldnVlL3RhYmxpc3QnO1xuaW1wb3J0IFRhYiBmcm9tICdwcmltZXZ1ZS90YWInO1xuaW1wb3J0IFRhYlBhbmVscyBmcm9tICdwcmltZXZ1ZS90YWJwYW5lbHMnO1xuaW1wb3J0IFRhYlBhbmVsIGZyb20gJ3ByaW1ldnVlL3RhYnBhbmVsJztcbmltcG9ydCBUb2dnbGVTd2l0Y2ggZnJvbSAncHJpbWV2dWUvdG9nZ2xlc3dpdGNoJztcblxuICAgICAgICBjb25zdCBhZ2VudHMgPSByZWYoW10pOyAvLyBMYSBsaXN0ZSBzZXJhIGNoYXJnw6llIGV0IG1pc2Ugw6Agam91ciB2aWEgTWVyY3VyZS9BUElcbiAgICAgICAgdmFyIGFnZW50czIgPSByZWYoW10pO1xuICAgICAgICBjb25zdCBkb25uZWVzID0gW107XG4gICAgICAgIGNvbnN0IGFnZW50c19tYWogPSBbXTtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICAgICAgY29uc3QgaW5pdGlhbEFnZW50cyA9IFtdO1xuICAgICAgICBjb25zdCBkYXRlc1VuaXF1ZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc2VhcmNoQWdlbnQgPSByZWYoJ1RvdXMnKTtcbiAgICAgICAgY29uc3Qgc2hvd0NvbXBsZXRlZCA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IGxvYWRpbmcgPSByZWYodHJ1ZSk7XG4gICAgICAgIGNvbnN0IHBhcmFtID0gcmVmKG51bGwpO1xuICAgICAgICBjb25zdCBwYXJhbUxlYWZsZXQgPSByZWYobnVsbCk7XG4gICAgICAgIGNvbnN0IGFnZW50U2VsID0gcmVmKG51bGwpO1xuICAgICAgICB2YXIgcG9pbnQgPSAwO1xuICAgICAgICB2YXIgZGlzdGFuY2UgPSAncmVzZXQnO1xuICAgICAgICB2YXIgZGF0ZSAgPSAnJztcbiAgICAgICAgY29uc3QgdGFidmFsdWUgPSByZWYoJzAnKTtcbiAgICAgICAgY29uc3QgY2hlY2tlZCA9IHJlZih0cnVlKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCByZWNoRGlzdGFuY2UgPSByZWYoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJhd0RhdGEgPSByZWYoW10pO1xuXG4gICAgICAgIGNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICAgICAgICAgIHBhcmFtOiAge1xuICAgICAgICAgICAgdHlwZTogT2JqZWN0LCBcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlIFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBwYXJhbUxlYWZsZXQudmFsdWUgPSBwcm9wcy5wYXJhbTtcblxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVDcmVuZWF1cyhkYXRhQ3JlbmVhdSl7XG4gICAgICAgICAgICBwb2ludCA9IGRhdGFDcmVuZWF1LnBvaW50O1xuICAgICAgICAgICAgZGlzdGFuY2UgPSBkYXRhQ3JlbmVhdS5kaXN0YW5jZTtcbiAgICAgICAgICAgIGRhdGUgID0gZGF0YUNyZW5lYXUuZGF0ZTtcbiAgICAgICAgICAgIGlmKGRhdGFDcmVuZWF1LmFnZW50KXthZ2VudFNlbC52YWx1ZSA9IGRhdGFDcmVuZWF1LmFnZW50O31cbiAgICAgICAgICAgIHRhYnZhbHVlLnZhbHVlID0gJzEnO1xuICAgICAgICAgICAgZmV0Y2hDcmVuZWF1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmV0Y2hDcmVuZWF1cyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHNlYXJjaEFnZW50LnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgaWYoIXByb3BzLnBhcmFtLm9wZXJhdGlvbil7cmV0dXJuO31cbiAgICAgICAgICAgIGlmKGRpc3RhbmNlID09ICdyZXNldCcpe3JlY2hEaXN0YW5jZS52YWx1ZSA9IGZhbHNlO31cbiAgICAgICAgICAgIGVsc2V7cmVjaERpc3RhbmNlLnZhbHVlID0gdHJ1ZTt9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCB1cmwgPSAnJztcbiAgICAgICAgICAgICAgICBpZihkYXRlLmxlbmd0aCA+IDIpe1xuICAgICAgICAgICAgICAgIHVybCA9ICcvYXBpL2NyZW5lYXVzLycrcHJvcHMucGFyYW0ub3BlcmF0aW9uKycvMC8nICsgcG9pbnQgKyAnLycgKyBkaXN0YW5jZSArICcvJyArIGRhdGUgKyAnLzAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIGlmKGRpc3RhbmNlID4wKXtyZWNoRGlzdGFuY2UudmFsdWUgPSB0cnVlO31cbiAgICAgICAgICAgICAgICB1cmwgPSAnL2FwaS9jcmVuZWF1cy8nK3Byb3BzLnBhcmFtLm9wZXJhdGlvbisnLzAvJyArIHBvaW50ICsgJy8nICsgZGlzdGFuY2UgKyAnLzAvMCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOyAgICBcbiAgICAgICAgICAgICAgICByYXdEYXRhLnZhbHVlID0gZGF0YTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZWRpcmVjdGlvbiBmb3Jjw6llIHZlcnMgbGEgcGFnZSBkZSBsb2dpblxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGlmKGRhdGEubGVuZ3RoID4gMyl7Y291bnQudmFsdWUgPSBmYWxzZTt9XG4gICAgICAgICAgICAgICBlbHNle2NvdW50LnZhbHVlID0gdHJ1ZTt9XG5cbiAgICAgICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICBjaGVja2VkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgnVW5lIGVycmV1ciBzXFwnZXN0IHByb2R1aXRlIG91IHZvdXMgw6p0ZXMgZMOpY29ubmVjdMOpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRhYnZhbHVlLnZhbHVlID0gJzEnO1xuICAgICAgICAgICAgY2hlY2tlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmZXRjaENyZW5lYXUgPSBhc3luYyAoZGF0YTIpID0+IHtcbiAgICAgICAgICAgIHNlYXJjaEFnZW50LnZhbHVlICA9ICdUb3VzJztcbiAgICAgICAgICAgIGxldCBhZ2VudF9pZCA9IGRhdGEyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkYXRlLnZhbHVlPScnO1xuICAgICAgICAgICAgICAgIHNob3dDb21wbGV0ZWQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZWNoRGlzdGFuY2UudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2NyZW5lYXVzLycrcHJvcHMucGFyYW0ub3BlcmF0aW9uKycvJythZ2VudF9pZCsnLzAvcmVzZXQvMC8wJyk7IC8vIFZvdHJlIGVuZHBvaW50IEFQSSBTeW1mb255XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICByYXdEYXRhLnZhbHVlID0gZGF0YTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVkaXJlY3Rpb24gZm9yY8OpZSB2ZXJzIGxhIHBhZ2UgZGUgbG9naW5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KCdVbmUgZXJyZXVyIHNcXCdlc3QgcHJvZHVpdGUgb3Ugdm91cyDDqnRlcyBkw6ljb25uZWN0w6knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGFidmFsdWUudmFsdWUgPSAnMSc7XG4gICAgICAgICAgICBjaGVja2VkLnZhbHVlID0gdHJ1ZTtcblxuICAgICAgICB9O1xuXG4vLyAxLiBMaXN0ZSBkZSB0b3VzIGxlcyBhZ2VudHMgKENvbG9ubmVzKVxuY29uc3QgdG91c0xlc0FnZW50cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIHJhd0RhdGEudmFsdWUubWFwKGEgPT4gKHtcbiAgICBpZDogYS5pZCxcbiAgICBub206IGEubm9tLFxuICAgIHByZW5vbTogYS5wcmVub20sXG4gICAgdG90YWxDcmVuZWF1SG9yYWlyZTogYS50b3RhbENyZW5lYXVIb3JhaXJlXG4gIH0pKTtcbn0pO1xuXG4vLyAyLiBMaXN0ZSBkZSB0b3V0ZXMgbGVzIGRhdGVzIHVuaXF1ZXMgdHJpw6llcyAoTGlnbmVzKVxuY29uc3QgdG91dGVzTGVzRGF0ZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGNvbnN0IGRhdGVzID0gbmV3IFNldCgpO1xuICByYXdEYXRhLnZhbHVlLmZvckVhY2goYWdlbnQgPT4ge1xuICAgIGFnZW50LmNyZW5lYXVzLmZvckVhY2goYyA9PiBkYXRlcy5hZGQoYy5kYXRlKSk7XG4gIH0pO1xuICBcbiAgcmV0dXJuIEFycmF5LmZyb20oZGF0ZXMpLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBkMSA9IG5ldyBEYXRlKGEuc3BsaXQoJy0nKS5yZXZlcnNlKCkuam9pbignLScpKTtcbiAgICBjb25zdCBkMiA9IG5ldyBEYXRlKGIuc3BsaXQoJy0nKS5yZXZlcnNlKCkuam9pbignLScpKTtcbiAgICByZXR1cm4gZDEgLSBkMjtcbiAgfSk7XG59KTtcblxuLy8gMy4gSGVscGVyIHBvdXIgcsOpY3Vww6lyZXIgbGVzIGNyw6luZWF1eCBkJ3VuIGFnZW50IHByw6ljaXMgw6AgdW5lIGRhdGUgcHLDqWNpc2VcbmNvbnN0IGdldFNsb3RzRm9yQWdlbnRBbmREYXRlID0gKGFnZW50SWQsIGRhdGUpID0+IHtcbiAgY29uc3QgYWdlbnQgPSByYXdEYXRhLnZhbHVlLmZpbmQoYSA9PiBhLmlkID09PSBhZ2VudElkKTtcbiAgaWYgKCFhZ2VudCkgcmV0dXJuIFtdO1xuICByZXR1cm4gYWdlbnQuY3JlbmVhdXMuZmlsdGVyKGMgPT4gYy5kYXRlID09PSBkYXRlKTtcbn07XG5cbi8vIDQuIEhlbHBlciBwb3VyIGFmZmljaGVyIGxlIGpvdXIgZGUgbGEgc2VtYWluZSAoZXg6IEx1bmRpKVxuY29uc3QgZ2V0Sm91clNlbWFpbmUgPSAoZGF0ZVN0cikgPT4ge1xuICAvLyBPbiByw6ljdXDDqHJlIGxlIG5vbSBkdSBqb3VyIGRlcHVpcyBsZSBwcmVtaWVyIGNyw6luZWF1IHRyb3V2w6kgcG91ciBjZXR0ZSBkYXRlXG4gIGZvciAobGV0IGFnZW50IG9mIHJhd0RhdGEudmFsdWUpIHtcbiAgICBjb25zdCBtYXRjaCA9IGFnZW50LmNyZW5lYXVzLmZpbmQoYyA9PiBjLmRhdGUgPT09IGRhdGVTdHIpO1xuICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLmpvdXJTZW1haW5lRnI7XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59O1xuXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUNhcnRlKCl7XG4gICAgICAgICAgICB0YWJ2YWx1ZS52YWx1ZSA9ICcwJztcbiAgICAgICAgICAgIGNoZWNrZWQudmFsdWUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBjb25zdCBhZ2VudHNGaWx0ZXJlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdG91c0xlc0FnZW50cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNlYXJjaEFnZW50LnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG91c0xlc0FnZW50cy52YWx1ZS5maWx0ZXIoYSA9PiBhLmlkID09PSBwYXJzZUludChzZWFyY2hBZ2VudC52YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7cmV0dXJuIHRvdXNMZXNBZ2VudHMudmFsdWU7fVxuXG4gICAgICAgIH0pXG5cbiAgICAgICAgZnVuY3Rpb24gcmVzZXRDcmVuZWF1KCkge1xuICAgICAgICAgICAgLy9wb2ludCA9IDA7XG4gICAgICAgICAgICBkaXN0YW5jZSA9ICdyZXNldCc7XG4gICAgICAgICAgICBkYXRlICA9ICcnO1xuICAgICAgICAgICAgZmV0Y2hDcmVuZWF1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVzYWN0aXZlciA9IGFzeW5jKGFnZW50X2lkLGlkKSA9PiB7IFxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9jcmVuZWF1L2FjdGl2ZXIvJytpZCwge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZ2VudCA9IHJhd0RhdGEudmFsdWUuZmluZChhID0+IGEuaWQgPT09IGFnZW50X2lkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IGFnZW50LmNyZW5lYXVzLmZpbmQoYyA9PiBjLmlkID09PSBpZCk7XG4gICAgICAgICAgICAgICAgLy9sZXQgY3JlbmVhdUluZGV4ID0gYWdlbnRzLnZhbHVlW2FnZW50X2lkXS5jcmVuZWF1cy5maW5kSW5kZXgocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICAgICAgbWF0Y2guYWN0aWYgPSAhbWF0Y2guYWN0aWY7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0RHJhZyhldnQsIGl0ZW0sIGFnZW50LCBhY3RpZiwgdG90YWxDcmVuZWF1KSB7XG4gICAgICAgIGlmKCFhY3RpZil7YWxlcnQoJ0Nyw6luZWF1IGluYWN0aWYgOiBPcMOpcmF0aW9uIGltcG9zc2libGUnKTtyZXR1cm47fVxuICAgICAgICBpZih0b3RhbENyZW5lYXUgPj0zMCl7XG4gICAgICAgICAgICBpZiAoIXdpbmRvdy5jb25maXJtKFwiQXR0ZW50aW9uLCBtYXggMzAgcGFyIGNyw6luZWF1IGhvcmFpcmUgOiBzb3VoYWl0ZXogdm91cyBjb25maXJtZXIgP1wiKSl7cmV0dXJuO31cbiAgICAgICAgfVxuICAgICAgICAgIGV2dC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJ1xuICAgICAgICAgIGV2dC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJ1xuICAgICAgICAgIGV2dC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgnaXRlbUlEJywgaXRlbSlcbiAgICAgICAgICBldnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ2FnZW50SUQnLCBhZ2VudClcbiAgICAgICAgICBldnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RvdGFsQ3JlbmVhdScsIHRvdGFsQ3JlbmVhdSlcbiAgICAgICAgICBjb25zdCBpdGVtSUQgPSBldnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ2l0ZW1JRCcpXG4gICAgICAgIH1cblxuICAgICAgICB3YXRjaChjaGVja2VkLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgRmVuMSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb2ludHMnKTtcbiAgICAgICAgICAgIHZhciBGZW4yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lbnUtYmFzJyk7XG4gICAgICAgICAgICBpZihjaGVja2VkLnZhbHVlID09IHRydWUpe1xuICAgICAgICAgICAgICAgIEZlbjEuc3R5bGUuaGVpZ2h0ID0gJ2NhbGMoMTAwdmggLSA1MDBweCknO1xuICAgICAgICAgICAgICAgIEZlbjIuc3R5bGUuaGVpZ2h0ID0gJzQwMHB4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgRmVuMS5zdHlsZS5oZWlnaHQgPSAnY2FsYygxMDB2aCAtIDE4MHB4KSc7XG4gICAgICAgICAgICAgICAgRmVuMi5zdHlsZS5oZWlnaHQgPScxMDBweCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVBvaW50U2VsZWN0aW9uKHBvaW50RGF0YSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0NhcnRlOiDDiXbDqW5lbWVudCBwb2ludC1zZWxlY3RlZCByZcOndSAhJywgcG9pbnREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgICAgICAgICBmZXRjaENyZW5lYXVzKCk7XG4gICAgICAgICAgICBidXMub24oJ2NyZW5lYXUtdXBkYXRlZCcsIGZldGNoQ3JlbmVhdXMpO1xuICAgICAgICAgICAgYnVzLm9uKCdjcmVuZWF1LXRvVXBkYXRlJywgdXBkYXRlQ3JlbmVhdXMpO1xuICAgICAgICAgICAgYnVzLm9uKCdjYXJ0ZS10b1VwZGF0ZScsIHVwZGF0ZUNhcnRlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGV2ZW50U291cmNlID0gbnVsbDtcblxuICAgICAgICBvblVubW91bnRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9ic2VydmVyKSBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB0b3VzTGVzQWdlbnRzLnZhbHVlPSBbXTtcbiAgICAgICAgICAgIHRhYnZhbHVlLnZhbHVlID0gJzAnO1xuICAgICAgICAgICAgcmF3RGF0YS52YWx1ZT0gW107XG4gICAgICAgICAgICBidXMub2ZmKCdjcmVuZWF1LXVwZGF0ZWQnLCBmZXRjaENyZW5lYXVzKTtcbiAgICAgICAgICAgIGJ1cy5vZmYoJ2NyZW5lYXUtdG9VcGRhdGUnLCB1cGRhdGVDcmVuZWF1cyk7XG4gICAgICAgICAgICBidXMub2ZmKCdjYXJ0ZS10b1VwZGF0ZScpO1xuICAgICAgICB9KTtcbjwvc2NyaXB0PlxuPHRlbXBsYXRlPlxuPGRpdiBpZD1cIm1lbnUtYmFzXCIgc3R5bGU9XCJoZWlnaHQ6IDQwMHB4O1wiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyXCIgc3R5bGU9XCJmbG9hdDogcmlnaHQ7bWFyZ2luOiAyMHB4IDIwcHggMCAwO1wiPlxuICAgICAgICA8c3BhbiB2LWlmPVwidGFidmFsdWUgPT0gMVwiPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV0YXQtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaEFnZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXNcIj5Ub3VzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cImFnZW50TiBpbiB0b3VzTGVzQWdlbnRzXCIgOmtleT1cImFnZW50Ti5pZFwiIDp2YWx1ZT1cImFnZW50Ti5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhZ2VudE4ubm9tIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICZuYnNwOyZuYnNwO1xuICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJyZXNldENyZW5lYXUoKTtcIj5Ub3VzIGNyw6luZWF1eDwvYnV0dG9uPjwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8VG9nZ2xlU3dpdGNoIHYtbW9kZWw9XCJjaGVja2VkXCIgLz5cbiAgICA8L2Rpdj5cbjxkaXYgaWQ9XCJhZ2VudHNcIiBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1wiIGNsYXNzPVwibS0wXCIgPlxuPGRpdiB2LWlmPVwiYWdlbnRzRmlsdGVyZWQubGVuZ3RoID09IDBcIj4gUGFzIGRlIGNyw6luZWF1IHRyb3V2w6kuIDwvZGl2PlxuIDxkaXYgY2xhc3M9XCJwLTBcIj5cbiAgICA8ZGl2IHYtaWY9XCJsb2FkaW5nXCI+Q2hhcmdlbWVudC4uLjwvZGl2PlxuICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwiY2FsZW5kYXItY29udGFpbmVyXCI+XG4gICAgICA8dGFibGUgdi1pZj1cImFnZW50c0ZpbHRlcmVkLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDwhLS0gQ2VsbHVsZSBkJ2FuZ2xlIChmaXhlKSAtLT5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPCEtLSBFbi10w6p0ZSA6IExlcyBub21zIGRlcyBhZ2VudHMgZW4gY29sb25uZXMgLS0+XG4gICAgICAgICAgICA8dGggdi1mb3I9XCJhZ2VudCBpbiBhZ2VudHNGaWx0ZXJlZFwiIDprZXk9XCJhZ2VudC5pZFwiIGNsYXNzPVwic3RpY2t5LWhlYWRlclwiPlxuICAgICAgICAgICAgICA8c3BhbiAgOmNsYXNzPVwiW2FnZW50U2VsID09IGFnZW50LmlkID8gJ2dyZWVuJyA6ICcnXVwiPnt7IGFnZW50Lm5vbSB9fSB7eyBhZ2VudC5wcmVub20gfX08L3NwYW4+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8IS0tIFVuZSBsaWduZSBwYXIgRGF0ZSB1bmlxdWUgLS0+XG4gICAgICAgICAgPHRyIHYtZm9yPVwiZGF0ZSBpbiB0b3V0ZXNMZXNEYXRlc1wiIDprZXk9XCJkYXRlXCI+XG4gICAgICAgICAgICA8dGQgdi1mb3I9XCJhZ2VudCBpbiBhZ2VudHNGaWx0ZXJlZFwiIDprZXk9XCJhZ2VudC5pZFwiIGNsYXNzPVwic2xvdC1jZWxsXCI+XG4gIDxkaXYgdi1pZj1cImdldFNsb3RzRm9yQWdlbnRBbmREYXRlKGFnZW50LmlkLCBkYXRlKS5sZW5ndGggPiAwXCI+XG4gICAgPGRpdiB2LWZvcj1cInNsb3QgaW4gZ2V0U2xvdHNGb3JBZ2VudEFuZERhdGUoYWdlbnQuaWQsIGRhdGUpXCIgOmtleT1cInNsb3QuaWRcIiAgY2xhc3M9XCJzbG90LWJhZGdlIGVsLWRyYWdcIiAgIGRyYWdnYWJsZT1cInRydWVcIiBcbiAgQGRyYWdzdGFydD1cInN0YXJ0RHJhZygkZXZlbnQsIHNsb3QuaWQsIGFnZW50LmlkLCBzbG90LmFjdGlmLCBzbG90LnRvdGFsQ3JlbmVhdUhvcmFpcmUpXCIgOmNsYXNzPVwiW3Nsb3QuY29tcGxldCA/ICdjcmVuZWF1LWNvbXBsZXQnIDogJyddXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwic2xvdC1oZWFkZXJcIj5cbiAgICAgIDxkaXY+PHNwYW4gY2xhc3M9XCJ0aW1lXCI+e3sgc2xvdC5qb3VyU2VtYWluZUZyIH19IHt7IHNsb3QuY3JlbmVhdUhvcmFpcmUubm9tIH19PC9zcGFuPjxicj48c3BhbiBjbGFzcz1cInNsb3QtZGF0ZVwiPnt7IHNsb3QuZGF0ZSB9ffCfk4UgPC9zcGFuPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNsb3QtZm9vdGVyXCIgdi1pZj1cInNsb3QucG9pbnRzLmxlbmd0aCAhPT0gMFwiID5cbiAgICAgICAgPCEtLSBDb250ZW5ldXIgZGUgbCdpbmZvIGJ1bGxlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby13cmFwcGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmZvLXRyaWdnZXJcIj7ihLnvuI88L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImluZm8tcG9wdXBcIj5cbiAgICAgICAgICAgIDxkaXYgdi1mb3I9XCJwb2ludCBpbiBzbG90LnBvaW50c1wiPlxuICAgICAgICAgICAgICAgICAgICAtIDxzdHJvbmc+e3twb2ludC5ub219fTwvc3Ryb25nPiA6IHt7cG9pbnQudGl0cmVSdWV9fSB7e3BvaW50Lm51bWVyb1J1ZX19IHt7cG9pbnQudGl0cmVSdWV9fSB7e3BvaW50Lm5vbVJ1ZX19IHt7cG9pbnQudmlsbGV9fTxicj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgQGNsaWNrPVwiZGVzYWN0aXZlcihhZ2VudC5pZCxzbG90LmlkKVwiPnt7IHNsb3QuYWN0aWYgPyAn4pyFJyA6ICfinYwnIH19PC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInNsb3QtYm9keVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXQtaXRlbVwiPlxuICAgICAgPHNwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPuKtkDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gOmNsYXNzPVwiW3Nsb3QudG90YWwgPiAwID8gJ2dyZWVuJyA6ICcnXVwiPnt7IHNsb3QudG90YWwgfX0gUlY8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9XCJUb3RhbCBwb3VyIGNldHRlIHRyYW5jaGUgaG9yYWlyZVwiIDpjbGFzcz1cIltzbG90LnRvdGFsQ3JlbmVhdUhvcmFpcmUgID49IGFnZW50LnRvdGFsQ3JlbmVhdUhvcmFpcmUgPyAnYWxlcnRlLXJvdWdlJyA6ICd0cmFuY2hlLXRvdGFsJ11cIj4oe3sgc2xvdC50b3RhbENyZW5lYXVIb3JhaXJlIH19KTwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhbiB2LWlmPVwic2xvdC5kaXN0YW5jZSA+PSAwICYmIHNsb3QudG90YWwgPiAwXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJncmVlblwiPjxzdHJvbmc+e3sgc2xvdC5kaXN0YW5jZSB9fW08L3N0cm9uZz48L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gZWxzZT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj4mbmJzcDs8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PiAgICBcbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gICAgPC9kaXY+XG48L3RkPlxuXG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgXG48L3RlbXBsYXRlPlxuPHN0eWxlPlxuLmJsb2MtY3JlbmVhdS1kYXRlIHtkaXNwbGF5OiBmbGV4O2ZsZXgtZGlyZWN0aW9uOiBjb2x1bW47fVxuLnAtdGFiIHtwYWRkaW5nLWJvdHRvbTogMnB4ICFpbXBvcnRhbnQ7cGFkZGluZy10b3A6IDJweCAhaW1wb3J0YW50O31cbi5mbGV4Y29sdW1uIHtkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7ZmxleC1kaXJlY3Rpb246IHJvdyAhaW1wb3J0YW50O31cbi5jcmVuZWF1LWlkZW50IHtoZWlnaHQ6IDUycHg7fVxuLmFnZW50LW5vbSB7cG9zaXRpb246IHN0aWNreSAhaW1wb3J0YW50O31cbi5jcmVuZWF1LWRlc2FjdGl2ZXIge3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAycHg7IHJpZ2h0OjJweDt9XG5cbi5jYWxlbmRhci1jb250YWluZXIge1xuICBvdmVyZmxvdzogYXV0bztcbiAgbWF4LWhlaWdodDogODB2aDsgLyogU2Nyb2xsIHZlcnRpY2FsIHNpIGJlYXVjb3VwIGRlIGRhdGVzICovXG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG59XG5cbnRhYmxlIHtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgLyogSW1wb3J0YW50IHBvdXIgbGUgc3RpY2t5ICovXG4gIGJvcmRlci1zcGFjaW5nOiAwO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmNhbGVuZGFyLWNvbnRhaW5lciB0aCwgLmNhbGVuZGFyLWNvbnRhaW5lciB0ZCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNlZWU7XG4gIHBhZGRpbmc6IDJweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICBtaW4td2lkdGg6IDEwMHB4O1xufVxuXG4vKiBGaXhlciBsJ2VuLXTDqnRlIGVuIGhhdXQgKi9cbi5zdGlja3ktaGVhZGVyIHtcbiAgcG9zaXRpb246IHN0aWNreSAhaW1wb3J0YW50O1xuICB0b3A6IDA7XG4gIGJhY2tncm91bmQ6ICNmOGY5ZmEgIWltcG9ydGFudDtcbiAgei1pbmRleDogMTA7XG4gIGJveC1zaGFkb3c6IDAgMnB4IDJweCAtMXB4IHJnYmEoMCwwLDAsMC4xKTtcbn1cblxuLyogRml4ZXIgbGEgY29sb25uZSBkZXMgZGF0ZXMgw6AgZ2F1Y2hlICovXG4uc3RpY2t5LWNvbCB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIGxlZnQ6IDA7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG4gIHotaW5kZXg6IDExO1xuICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCAjZGRkO1xufVxuXG4vKiBDZWxsdWxlIGQnYW5nbGUgKGhhdXQtZ2F1Y2hlKSA6IGRvaXQgw6p0cmUgYXUgZGVzc3VzIGRlIHRvdXQgKi9cbnRoLnN0aWNreS1jb2wuc3RpY2t5LWhlYWRlciB7XG4gIHotaW5kZXg6IDIwO1xuICBiYWNrZ3JvdW5kOiAjZWNlY2VjO1xufVxuXG4uZGF0ZS1jb2x1bW4ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xufVxuXG4uZGF0ZS1sYWJlbCB7XG4gIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6ICM2NjY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cblxuLmRhdGUtdmFsdWUge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6ICMzMzM7XG59XG4vKiBTdHJ1Y3R1cmUgZGUgbGEgY2FydGUgZGUgY3LDqW5lYXUgKi9cbi5zbG90LWNlbGwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIE7DqWNlc3NhaXJlIHBvdXIgbGUgei1pbmRleCAqL1xuICB0cmFuc2l0aW9uOiB6LWluZGV4IDAuMnM7XG59XG5cbi5zbG90LWNlbGw6aG92ZXIge1xuICB6LWluZGV4OiA1MDsgLyogUGFzc2UgYXUtZGVzc3VzIGRlcyBhdXRyZXMgY2VsbHVsZXMgZXQgZGVzIGhlYWRlcnMgc3RpY2t5ICovXG59XG4vKiAtLS0gRklYIFZJU0lCSUxJVMOJIC0tLSAqL1xuLnNsb3QtY2VsbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogTsOpY2Vzc2FpcmUgcG91ciBsZSB6LWluZGV4ICovXG4gIHRyYW5zaXRpb246IHotaW5kZXggMC4ycztcbn1cblxuLnNsb3QtY2VsbDpob3ZlciB7XG4gIHotaW5kZXg6IDUwOyAvKiBQYXNzZSBhdS1kZXNzdXMgZGVzIGF1dHJlcyBjZWxsdWxlcyBldCBkZXMgaGVhZGVycyBzdGlja3kgKi9cbn1cblxuLyogLS0tIERFU0lHTiBERSBMQSBDQVJURSAtLS0gKi9cbi5zbG90LWJhZGdlIHtcbiAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTdlYjtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICBwYWRkaW5nOiA4cHg7XG4gIG1hcmdpbi1ib3R0b206IDZweDtcbiAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwwLDAsMC41KTtcbiAgbWluLXdpZHRoOiAxNjBweDtcbn1cblxuLnNsb3QtaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAycHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQgI2NjYztcbiAgcGFkZGluZy1ib3R0b206IDJweDtcbn1cblxuLnRpbWUge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgZm9udC1zaXplOiAwLjg1cmVtO1xuICBjb2xvcjogIzI1NjNlYjtcbn1cblxuLnRyYW5jaGUtdG90YWwge1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGJhY2tncm91bmQ6ICNmM2Y0ZjY7XG4gIHBhZGRpbmc6IDBweDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBjb2xvcjogIzRiNTU2Mztcbn1cblxuLnNsb3QtYm9keSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IC8qIE9yZ2FuaXNhdGlvbiB2ZXJ0aWNhbGUgZGVzIHN0YXRzICovXG4gIGdhcDogMnB4O1xuICBtYXJnaW4tYm90dG9tOiAwcHg7XG59XG5cbi5zdGF0LWl0ZW0ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDVweDtcbiAgZm9udC1zaXplOiAxMnB4O1xufVxuXG4uaWNvbiB7XG4gIGZvbnQtc2l6ZTogMC45cmVtO1xufVxuXG4udmFsdWUge1xuICBmb250LXdlaWdodDogNTAwO1xuICBjb2xvcjogIzFmMjkzNztcbn1cblxuLnNsb3QtZm9vdGVyIHtcbnBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLnNsb3QtZGF0ZSB7XG4gIGZvbnQtc2l6ZTogMC43cmVtO1xuICBjb2xvcjogIzljYTNhZjtcbn1cblxuLyogLS0tIFNUWUxFIERVIFBPUFVQIC0tLSAqL1xuLmluZm8td3JhcHBlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBjdXJzb3I6IGhlbHA7XG59XG5cbi5pbmZvLXRyaWdnZXIge1xuICBmb250LXNpemU6IDFyZW07XG4gIG9wYWNpdHk6IDAuNjtcbn1cblxuLmluZm8tdHJpZ2dlcjpob3ZlciB7XG4gIG9wYWNpdHk6IDE7XG59XG5cbi5pbmZvLXBvcHVwIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7XG4gIHRvcDogY2FsYygxMDB2aCAtIDQwMHB4KTsgLyogUydhZmZpY2hlIGF1LWRlc3N1cyBkZSBsJ2ljw7RuZSAqL1xuICBsZWZ0OiAxMHB4O1xuICB3aWR0aDogMjUwcHggIWltcG9ydGFudDtcbiAgaGVpZ2h0OiBhdXRvO1xuICBiYWNrZ3JvdW5kOiAjMWYyOTM3OyAvKiBGb25kIHNvbWJyZSBtb2Rlcm5lICovXG4gIGNvbG9yOiB3aGl0ZTtcbiAgcGFkZGluZzogMTBweCAhaW1wb3J0YW50O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJveC1zaGFkb3c6IDAgMTBweCAxNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjMpO1xuICB6LWluZGV4OiAxMDAwMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7IC8qIFBvdXIgbmUgcGFzIGfDqm5lciBsYSBzb3VyaXMgKi9cbiAgZm9udC1zaXplOiAwLjhyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG59XG5cbi5wb3B1cC10aXRsZSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gIGNvbG9yOiAjNjBhNWZhO1xufVxuXG4uaW5mby1wb3B1cCBociB7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICMzNzQxNTE7XG4gIG1hcmdpbjogNXB4IDA7XG59XG5cbi5pbmZvLXdyYXBwZXI6aG92ZXIgLmluZm8tcG9wdXAge1xuICBkaXNwbGF5OiBibG9jazsgLyogQWZmaWNoZSBsYSBidWxsZSBhdSBzdXJ2b2wgKi9cbn1cblxuLyogUGV0aXQgdHJpYW5nbGUgZW4gYmFzIGRlIGxhIGJ1bGxlICovXG4uaW5mby1wb3B1cDI6OmFmdGVyIHtcbiAgY29udGVudDogXCJcIjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDEwMCU7XG4gIHJpZ2h0OiAxMHB4O1xuICBib3JkZXItd2lkdGg6IDZweDtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLWNvbG9yOiAjMWYyOTM3IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xufVxuLmdyZWVuIHtmb250LXNpemU6IDE0cHg7IGJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDtjb2xvcjogcmdiKDMsIDI1MywgNzQpICFpbXBvcnRhbnQ7Zm9udC13ZWlnaHQ6IGJvbGQ7fVxuLmVtcHR5LWNlbGwge1xuICBjb2xvcjogI2RkZDtcbn1cbi5jcmVuZWF1LWNvbXBsZXQge2JhY2tncm91bmQtY29sb3I6ICNkN2Q3ZDcgIWltcG9ydGFudDt9XG4uYWxlcnRlLXJvdWdlIHtmb250LXNpemU6IDE0cHggIWltcG9ydGFudDsgY29sb3I6IHJlZCAhaW1wb3J0YW50O3BhZGRpbmc6IDBweDt9XG48L3N0eWxlPiIsIjxzY3JpcHQgc2V0dXA+XG5cbmltcG9ydCB7IGNyZWF0ZUFwcCwgcmVmLCBvbk1vdW50ZWQsIG9uQmVmb3JlVW5tb3VudCwgb25Vbm1vdW50ZWQsIGdldEN1cnJlbnRJbnN0YW5jZSwgY29tcHV0ZWR9ICBmcm9tICd2dWUnO1xuXG5pbXBvcnQgVG9vbGJhciBmcm9tICdwcmltZXZ1ZS90b29sYmFyJztcbmltcG9ydCBUb2FzdCBmcm9tICdwcmltZXZ1ZS90b2FzdCc7XG5pbXBvcnQgeyB1c2VUb2FzdCB9IGZyb20gJ3ByaW1ldnVlL3VzZXRvYXN0JztcbmltcG9ydCAnQHZ1ZXBpYy92dWUtZGF0ZXBpY2tlci9kaXN0L21haW4uY3NzJ1xuaW1wb3J0IElucHV0VGV4dCBmcm9tICdwcmltZXZ1ZS9pbnB1dHRleHQnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdwcmltZXZ1ZS9idXR0b24nO1xuaW1wb3J0IERpYWxvZyBmcm9tICdwcmltZXZ1ZS9kaWFsb2cnO1xuaW1wb3J0IENvbG9yUGlja2VyIGZyb20gJ3ByaW1ldnVlL2NvbG9ycGlja2VyJztcblxuaW1wb3J0IEljb25GaWVsZCBmcm9tICdwcmltZXZ1ZS9pY29uZmllbGQnO1xuaW1wb3J0IElucHV0SWNvbiBmcm9tICdwcmltZXZ1ZS9pbnB1dGljb24nO1xuXG4gICAgICAgIGNvbnN0IGV0YXRzID0gcmVmKFtdKTtcbiAgICAgICAgY29uc3QgcGFyYW1EaWFsb2cgPSByZWYoKTtcbiAgICAgICAgY29uc3Qgc3VibWl0dGVkID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHRvYXN0ID0gdXNlVG9hc3QoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXVyID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHBhcmFtID0gcmVmKG51bGwpO1xuXG5cbi8vQ0VOVFJBTEUgREUgQ09NTVVOSUNBVElPTlxuICAgICAgICBjb25zdCBzb3VtZXR0cmVGb3JtdWxhaXJlID0gYXN5bmMoKSA9PiB7XG4gICAgICAgICAgLy9jb250cm9sZXJcbiAgICAgICAgICBpZiAoIWZvcm11bGFpcmVFc3RWYWxpZGUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnTGVzIGRvbm7DqWVzIG5lIHBldXZlbnQgcGFzIMOqdHJlIHZpZGVzJztcbiAgICAgICAgICAgICAgICAvL3RvYXN0LmFkZCh7IHNldmVyaXR5OiAnZGFuZ2VyJywgc3VtbWFyeTogJ0luZm8nLCBkZXRhaWw6IG1lc3NhZ2V1ci52YWx1ZSwgbGlmZTogMzAwMCB9KTtcbiAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IFxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9wYXJhbScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShldGF0cy52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHttZXNzYWdldXIudmFsdWUgPSBcIkVycmV1ciBzYXV2ZWdhcmRlXCI7dG9hc3QuYWRkKHsgc2V2ZXJpdHk6ICdkYW5nZXInLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO31cbiAgICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJQYXJhbcOodHJlcyBlbnJlZ2lzdHLDqXNcIjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2RhbmdlcicsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyZXVyIHLDqXNlYXVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5sb2coXCJEb25uw6llcyDDoCBzYXV2ZWdhcmRlciA6XCIsIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXRhdHMudmFsdWUpKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZm9ybXVsYWlyZUVzdFZhbGlkZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gZXRhdHMudmFsdWUuZXZlcnkoZXRhdCA9PiBldGF0Lm5vbSAmJiBldGF0Lm5vbS50cmltKCkgIT09ICcnKTtcbiAgICAgICAgfSk7XG5cblxuLy9FVkVOVCBJTlRFUkZBQ0UgIFxuICAgICAgICBjb25zdCBlZGl0UGFyYW0gPSAoKSA9PiB7XG4gICAgICAgICAgICBwYXJhbURpYWxvZy52YWx1ZSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhpZGVEaWFsb2cgPSAoKSA9PiB7XG4gICAgICAgICAgICBwYXJhbURpYWxvZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgLy9zdWJtaXR0ZWQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfTtcblxuLy9ERU1BUlJBR0VcbiAgICAgICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICBjb25zdCBhcHBFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhcmFtZXRyZScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwRWxlbWVudCAmJiBhcHBFbGVtZW50LmRhdGFzZXQudXNlclByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyUHJvcHNKc29uID0gYXBwRWxlbWVudC5kYXRhc2V0LnVzZXJQcm9wcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnZhbHVlID0gSlNPTi5wYXJzZSh1c2VyUHJvcHNKc29uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXRhdHMudmFsdWUgPSBwYXJhbS52YWx1ZS5ldGF0cztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGV2ZW50U291cmNlID0gbnVsbDtcblxuICAgICAgICBvblVubW91bnRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTWVyY3VyZSBFdmVudFNvdXJjZSBjbG9zZWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbjxUb2FzdCAvPlxuICAgICAgICA8ZGl2IGlkPVwicGFyYW1CdXR0b25cIj5cbiAgICAgICAgICAgICA8QnV0dG9uIGljb249XCJwaSBwaS1jb2dcIiBjbGFzcz1cIm1yLTIgdG9wLXJpZ2h0XCIgQGNsaWNrPVwiZWRpdFBhcmFtKClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPERpYWxvZyB2LW1vZGVsOnZpc2libGU9XCJwYXJhbURpYWxvZ1wiIDpzdHlsZT1cInsgd2lkdGg6ICc0NTBweCcgfVwiIGhlYWRlcj1cIlBhcmFtw6l0cmFnZVwiIDptb2RhbD1cInRydWVcIj5cbiAgICAgICAgPGRpdj57eyBtZXNzYWdldXIgfX08L2Rpdj5cbiAgICAgICAgICAgIDxmb3JtIEBzdWJtaXQucHJldmVudD1cInNvdW1ldHRyZUZvcm11bGFpcmVcIj5cbiAgICAgICAgICAgICAgPCEtLSAzLiBCb3VjbGUgZHluYW1pcXVlIHN1ciBsZSB0YWJsZWF1IC0tPlxuICAgICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAgIHYtZm9yPVwiKGV0YXQsIGluZGV4KSBpbiBldGF0c1wiIFxuICAgICAgICAgICAgICAgIDprZXk9XCJldGF0LmlkXCIgXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWdyb3VwXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxsYWJlbCA6Zm9yPVwiJ2V0YXQtJyArIGV0YXQuaWRcIj5JRCB7eyBldGF0LmlkIH19IDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDwhLS0gNC4gTGlhaXNvbiBiaWRpcmVjdGlvbm5lbGxlIGF2ZWMgdi1tb2RlbCAtLT5cbiAgICAgICAgICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgICAgICAgICA6aWQ9XCInZXRhdC0nICsgZXRhdC5pZFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiIFxuICAgICAgICAgICAgICAgICAgdi1tb2RlbD1cImV0YXQubm9tXCIgXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk5vbSBkZSBsJ8OpdGF0XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiIWV0YXQubm9tIHx8IGV0YXQubm9tLnRyaW0oKSA9PT0gJydcIiBjbGFzcz1cImVycm9yLW1zZ1wiPlxuICAgICAgICAgICAgICAgICAgICBSZXF1aXNcbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPENvbG9yUGlja2VyIHYtbW9kZWw9XCJldGF0LmNvdWxldXJcIiA6aWQ9XCInY291bGV1ci0nICsgZXRhdC5pZFwiIHJlcXVpcmVkLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCI+U2F1dmVnYXJkZXIgdG91dDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L0RpYWxvZz5cbjwvdGVtcGxhdGU+XG48c3R5bGUgc2NvcGVkPlxuLmNvbnRhaW5lciB7XG4gIG1heC13aWR0aDogNDAwcHg7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcbn1cbiNwYXJhbUJ1dHRvbiB7ZGlzcGxheTogaW5saW5lLWJsb2NrO31cbiNwYXJhbUJ1dHRvbiA+IGJ1dHRvbiB7aGVpZ2h0OiAzMHB4O31cbi5mb3JtLWdyb3VwIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgZ2FwOiAxMHB4O1xufVxubGFiZWwge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgd2lkdGg6IDYwcHg7XG59XG5pbnB1dCB7XG4gIHBhZGRpbmc6IDVweDtcbiAgZmxleC1ncm93OiAxO1xufVxuYnV0dG9uIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuPC9zdHlsZT4iLCI8c2NyaXB0IHNldHVwPlxuXG5pbXBvcnQgeyBjcmVhdGVBcHAsIHJlZiwgb25Nb3VudGVkLCBvbkJlZm9yZVVubW91bnQsIG9uVW5tb3VudGVkLCBnZXRDdXJyZW50SW5zdGFuY2UsIGNvbXB1dGVkLCB3YXRjaH0gIGZyb20gJ3Z1ZSc7XG5cbmltcG9ydCB7IEZpbHRlck1hdGNoTW9kZSwgRmlsdGVyT3BlcmF0b3IgfSBmcm9tICdAcHJpbWV2dWUvY29yZS9hcGknO1xuXG5pbXBvcnQgeyBidXMgfSBmcm9tICcuLi9idXMuanMnOyBcbmltcG9ydCB7IEZ1bmN0aW9ucyB9IGZyb20gJy4vc2VydmljZS9GdW5jdGlvbnMnO1xuXG5pbXBvcnQgeyBWdWVEYXRlUGlja2VyIH0gZnJvbSAnQHZ1ZXBpYy92dWUtZGF0ZXBpY2tlcic7XG5pbXBvcnQgJ0B2dWVwaWMvdnVlLWRhdGVwaWNrZXIvZGlzdC9tYWluLmNzcydcblxuaW1wb3J0IFNlYXJjaCBmcm9tICcuL1NlYXJjaC52dWUnO1xuXG5pbXBvcnQgUHJvZ3Jlc3NCYXIgZnJvbSAncHJpbWV2dWUvcHJvZ3Jlc3NiYXInO1xuaW1wb3J0IERhdGFUYWJsZSBmcm9tICdwcmltZXZ1ZS9kYXRhdGFibGUnO1xuaW1wb3J0IENvbHVtbiBmcm9tICdwcmltZXZ1ZS9jb2x1bW4nO1xuaW1wb3J0IENvbHVtbkdyb3VwIGZyb20gJ3ByaW1ldnVlL2NvbHVtbmdyb3VwJzsgICBcbmltcG9ydCBSb3cgZnJvbSAncHJpbWV2dWUvcm93JzsgICAgIFxuXG5pbXBvcnQgVG9vbGJhciBmcm9tICdwcmltZXZ1ZS90b29sYmFyJztcbmltcG9ydCB7IHVzZVRvYXN0IH0gZnJvbSAncHJpbWV2dWUvdXNldG9hc3QnO1xuXG5pbXBvcnQgSW5wdXRUZXh0IGZyb20gJ3ByaW1ldnVlL2lucHV0dGV4dCc7XG5pbXBvcnQgU2VsZWN0IGZyb20gJ3ByaW1ldnVlL3NlbGVjdCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ3ByaW1ldnVlL2J1dHRvbic7XG5pbXBvcnQgVGV4dGFyZWEgZnJvbSAncHJpbWV2dWUvdGV4dGFyZWEnO1xuXG5pbXBvcnQgRGlhbG9nIGZyb20gJ3ByaW1ldnVlL2RpYWxvZyc7XG5cbmltcG9ydCBJY29uRmllbGQgZnJvbSAncHJpbWV2dWUvaWNvbmZpZWxkJztcbmltcG9ydCBJbnB1dEljb24gZnJvbSAncHJpbWV2dWUvaW5wdXRpY29uJztcblxuXG4gICAgICAgIGNvbnN0IGV0YXRzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IGxpc3RlYWdlbnRzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1pc3Npb25JRCA9IHJlZigpO1xuICAgICAgICBjb25zdCBvcGVyYXRpb25JRCA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlc19pbml0ID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXRlbXAgPSByZWYoKTtcbiAgICAgICAgY29uc3QgcGFyYW0gPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZVNlbCA9IHJlZignU8OpbGVjdGlvbm5leicpO1xuICAgICAgICBjb25zdCB0eXBlU2VsID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzX3R5cGVzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzVHlwZSA9IHJlZihbXSk7IFxuICAgICAgICBjb25zdCBtZXNzYWdlc0lkID0gcmVmKFtdKTsgXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzTm9tID0gcmVmKFtdKTsgXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzVGV4dGUgPSByZWYoW10pOyBcbiAgICAgICAgY29uc3QgbWVzc2FnZXNTdWpldCA9IHJlZihbXSk7IFxuICAgICAgICBjb25zdCBwb2ludHMgPSByZWYoW10pOyAvLyBMYSBsaXN0ZSBzZXJhIGNoYXJnw6llIGV0IG1pc2Ugw6Agam91ciB2aWEgTWVyY3VyZS9BUElcbiAgICAgICAgY29uc3QgbG9ja2VkUG9pbnRzID0gcmVmKFtdKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXVyID0gcmVmKCcnKTtcbiAgICAgICAgY29uc3Qgbm9tYnJlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHBvdXJjZW50ID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VTTVM9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlRXhjZWw9IHJlZigpO1xuICAgICAgICAvL2NvbnN0IG9wdGlvbnMgPSByZWYoW10pO1xuICAgICAgICBsZXQgc2VsZWN0aW9uID0gMDtcbiAgICAgICAgbGV0IHNlbCA9IDA7XG4gICAgICAgIGxldCBzZWFyY2ggPSAwO1xuICAgICAgICBjb25zdCBtYVZhbGV1ciA9IHJlZigwKVxuICAgICAgICBjb25zdCBzaG93V2l0aFJWID0gcmVmKHRydWUpO1xuICAgICAgICBsZXQgc2VsZWN0ZWQgPSAnJztcbiAgICAgICAgY29uc3QgbW9pcyA9IHJlZigpO1xuICAgICAgICBjb25zdCBzdGFydERhdGUgPSByZWYoKTtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHJlZihuZXcgRGF0ZSgpKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcklEID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IGxvYWRpbmcgPXJlZigpO1xuICAgICAgICBsb2FkaW5nLnZhbHVlID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBzZWFyY2hOb20gPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdGF0dXMgPSByZWYoJ1RvdXMnKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoTnVtZXJvUGh5c2lxdWUgPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoTnVtZXJvQ2xpZW50ID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaE5vbVJ1ZSA9IHJlZignVG91dGVzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hEYXRlUlYgPSByZWYoJ1RvdXRlcycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoUXVhcnRpZXIgPSByZWYoJ1RvdXMnKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoVmlsbGUgPSByZWYoJ1RvdXRlcycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoRXRhdCA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoVGVsID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXIxID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXIyID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXIzID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXI0ID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXI1ID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaEFnZW50ID0gcmVmKCdUb3VzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hMaWJlbGxlID0gcmVmKCdUb3VzJyk7IFxuICAgICAgICBjb25zdCBzbG90UHJvcHMgPSByZWYoKTsgXG5cbiAgICAgICAgY29uc3QgY2xpY2tlZFJvd0lkID0gcmVmKG51bGwpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZFRhYmxlUG9pbnRzID0gcmVmKFtdKTsgXG4gICAgICAgIGNvbnN0IENvbG9ycyA9IHJlZihbXSk7IFxuXG4gICAgICAgIGNvbnN0IGV4cGFuZGVkUm93c1RhYiA9IHJlZihbXSk7XG4gICAgICAgIGNvbnN0IHRvYXN0ID0gdXNlVG9hc3QoKTtcbiAgICAgICAgY29uc3QgcHJvZHVjdERpYWxvZyA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IGV4Y2VsRGlhbG9nID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgcHJvZHVjdCA9IHJlZih7fSk7XG4gICAgICAgIGNvbnN0IHN1Ym1pdHRlZCA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVmKDApO1xuICAgICAgICBjb25zdCBkYXRhQ3JlbmVhdSA9IHt9O1xuICAgICAgICBjb25zdCBkYXRlRXhjZWwgPSB7fTtcbiAgICAgICAgY29uc3QgZGF0YUNhcnRlID0ge307XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCkrMTtcbiAgICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIHJldHVybiBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUHJvZHVjdHMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWV0YUtleSA9IHJlZih0cnVlKTtcblxuLy9DRU5UUkFMRSBERSBDT01NVU5JQ0FUSU9OXG5cbiAgICAgICAgZnVuY3Rpb24gZmV0Y2hQb2ludHMgKGNsdXN0ZXJfaWQpeyAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAvLyB5b3VyIG9wdGlvbnMuLi4gbWV0aG9kOiBQT1NULCBoZWFkZXJzLCBjb3JzLCBldGMuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGUudmFsdWU9JydcbiAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL2NsdXN0ZXIvJytjbHVzdGVyX2lkLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0YS5zdGF0dXMnK2RhdGEuc3RhdHVzKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWRpcmVjdGlvbiBmb3Jjw6llIHZlcnMgbGEgcGFnZSBkZSBsb2dpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NoYXJnZW1lbnQgcG9pbnRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlID0gZGF0YS5yZXNwb25zZS5tYXAocCA9PiAoeyAuLi5wLCBpc0VkaXRpbmc6IGZhbHNlLCBvcmlnaW5hbDoge30sIHNlbGVjdGVkOiBmYWxzZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdEl0ZW0gPSBwb2ludHMudmFsdWUuZmluZCh4PT54IT09dW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VhcmNoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gc2VhcmNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFBvaW50KHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgnVW5lIGVycmV1ciBzXFwnZXN0IHByb2R1aXRlIG91IHZvdXMgw6p0ZXMgZMOpY29ubmVjdMOpJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGZldGNoUG9pbnRzTWlzc2lvbihtaXNzaW9uX2lkKXsgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLy8geW91ciBvcHRpb25zLi4uIG1ldGhvZDogUE9TVCwgaGVhZGVycywgY29ycywgZXRjLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY2hhcmdlbWVudGRlcyBwb2ludHMnKVxuICAgICAgICAgICAgICAgIGRhdGUudmFsdWU9JydcbiAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL29wZXJhdGlvbi8nK29wZXJhdGlvbklELnZhbHVlKycvJyttaXNzaW9uX2lkLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0YS5zdGF0dXMnK2RhdGEuc3RhdHVzKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWRpcmVjdGlvbiBmb3Jjw6llIHZlcnMgbGEgcGFnZSBkZSBsb2dpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NoYXJnZW1lbnQgcG9pbnRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlID0gZGF0YS5yZXNwb25zZS5tYXAocCA9PiAoeyAuLi5wLCBpc0VkaXRpbmc6IGZhbHNlLCBvcmlnaW5hbDoge30sIHNlbGVjdGVkOiBmYWxzZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdEl0ZW0gPSBwb2ludHMudmFsdWUuZmluZCh4PT54IT09dW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VhcmNoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gc2VhcmNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFBvaW50KHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgnVW5lIGVycmV1ciBzXFwnZXN0IHByb2R1aXRlIG91IHZvdXMgw6p0ZXMgZMOpY29ubmVjdMOpJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGdldEluZm9zKGRhdGEpeyAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRwb2ludHM6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0ZS52YWx1ZT0nJ1xuICAgICAgICAgICAgICAgIEZ1bmN0aW9ucy5tYWtlUmVxdWVzdCgnL2FwaS9wb2ludHMvZ2V0VjIvJywgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkYXRhLnN0YXR1cycrZGF0YS5zdGF0dXMpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yZXNwb25zZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4MiA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBlbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50SW5kZXgyICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXgyXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5lbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXgzID0gZmlsdGVyZWRQb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gZWxlbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkUG9pbnRzLnZhbHVlW3BvaW50SW5kZXgzXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gZnJvemVuUG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2ludEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5Qb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5lbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFDYXJ0ZS5jbHVzdGVySWQgPSBlbGVtZW50LmNsdXN0ZXI1O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFDYXJ0ZS5taXNzaW9uID0gZWxlbWVudC5taXNzaW9uLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1cy5lbWl0KCdjYXJ0ZS1yZWZyZXNoJywgZGF0YUNhcnRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdID0gcHJvZHVjdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5sb2coZXJyb3IpKSAvLyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggZXJyb3JcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVNZXJjdXJlTWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7IFxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhgTWVyY3VyZSBtZXNzYWdlIHJlY2VpdmVkIDpgLCBkYXRhKTtcbiAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50LmFjdGlvbjtcbiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaF9jcmVuZWF1ID0gMDtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAvL21pc2Ugw6Agam91ciBkZXMgY2x1c3RlcnMgY29tcGxldFxuICAgICAgICAgICAgICAgICAgICBjYXNlICdjbHVzdGVyX2NvbXBsZXRlZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnY2x1c3RlcnNjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBlbGVtZW50LCAvLyBQYXNzIHlvdXIgZGF0YSBpbiB0aGUgJ2RldGFpbCcgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGVhZmxldG1hcCcpLmNvbnRlbnRXaW5kb3cuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwcm9kdWN0X3VwZGF0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmZvcyhlbGVtZW50LnBvaW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfY3JlbmVhdSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NyZW5lYXVfdXBkYXRlZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVuZWF1X3VwZGF0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaF9jcmVuZWF1ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsVXBkYXRlKGVsZW1lbnQuZG9ubmVlcy5ub21icmUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2FydGUtcmVmcmVzaCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjYXJ0ZSB0byByZWZyZXNoJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidXMuZW1pdCgnY2FydGUtcmVmcmVzaCcsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYocmVmcmVzaF9jcmVuZWF1ID09IDEpe1xuICAgICAgICAgICAgICAgIGJ1cy5lbWl0KCdjcmVuZWF1LXVwZGF0ZWQnLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuLy8gSU5URVJGQUNFXG4gICAgICAgIGNvbnN0IGFnZW50cyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsQWdlbnRzV2l0aER1cGxpY2F0ZXMgPSBwb2ludHMudmFsdWUubWFwKHBvaW50ID0+IChwb2ludC5hZ2VudC5ub20rJyAnKyhwb2ludC5hZ2VudC5wcmVub20/PycnKSkpXG4gICAgICAgICAgICBjb25zdCB1bmlxdWVBZ2VudFNldCA9IG5ldyBTZXQoYWxsQWdlbnRzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlQWdlbnRTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdmlsbGVzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxDaXRpZXNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnQudmlsbGUpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlQ2l0eVNldCA9IG5ldyBTZXQoYWxsQ2l0aWVzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlQ2l0eVNldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBxdWFydGllcnMgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbFF1YXJ0aWVyc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC5xdWFydGllcik7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVRdWFydGllclNldCA9IG5ldyBTZXQoYWxsUXVhcnRpZXJzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlUXVhcnRpZXJTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcnVlcyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsUnVlc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC5ub21SdWUpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlUnVlU2V0ID0gbmV3IFNldChhbGxSdWVzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlUnVlU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGxpYmVsbGVzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxMaWJlbGxlc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC5saWJlbGxlQ29tcHRldXIpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlTGliZWxsZXNTZXQgPSBuZXcgU2V0KGFsbExpYmVsbGVzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlTGliZWxsZXNTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZGF0ZXNSViAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsRGF0ZXNSVldpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludF9SVihwb2ludCkpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlYWxsRGF0ZXNSVlNldCA9IG5ldyBTZXQoYWxsRGF0ZXNSVldpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZWFsbERhdGVzUlZTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gcG9pbnRfUlYocG9pbnQpe1xuICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUpeyBcbiAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUpe3JldHVybiBwb2ludC5jcmVuZWF1LmRhdGU7fWVsc2V7cmV0dXJuICdTYW5zIFJWJzt9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2V7cmV0dXJuICdTYW5zIFJWJzt9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9wcmnDqXTDqSBjYWxjdWzDqWUgcXVpIHJlbnZlcnJhIGxhIGxpc3RlIGZpbHRyw6llIMOgIGxhIERhdGFUYWJsZVxuICAgICAgICBjb25zdCBmaWx0ZXJlZFBvaW50cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2ZpbHRlciBldGFwZScpO1xuICAgICAgICAgICAgLy8gU2kgb24gbidhIHBhcyBlbmNvcmUgZGUgZG9ubsOpZXMsIG9uIHJlbnZvaWUgdW4gdGFibGVhdSB2aWRlXG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT24gY29tbWVuY2UgYXZlYyB1bmUgY29waWUgZGUgdG91dGVzIGxlcyBkb25uw6llc1xuICAgICAgICAgICAgbGV0IHBvaW50c1RvRmlsdGVyID0gWy4uLnBvaW50cy52YWx1ZV07XG5cbiAgICAgICAgICAgIC8vIEZpbHRyZSBwYXIgbm9tXG4gICAgICAgICAgICBpZiAoc2VhcmNoTm9tLnZhbHVlICYmIHNlYXJjaE5vbS52YWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG93ZXJDYXNlU2VhcmNoID0gc2VhcmNoTm9tLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIC8vIEFqb3V0ZXogaWNpIHRvdSBsZXMgY2hhbXBzIGRhbnMgbGVzcXVlbHMgdm91cyB2b3VsZXogY2hlcmNoZXJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubm9tLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbHRyZSBwYXIgTnVtZXJvUGh5c2lxdWVcbiAgICAgICAgICAgIGlmIChzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZSAmJiBzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG93ZXJDYXNlU2VhcmNoID0gc2VhcmNoTnVtZXJvUGh5c2lxdWUudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgLy8gQWpvdXRleiBpY2kgdG91cyBsZXMgY2hhbXBzIGRhbnMgbGVzcXVlbHMgdm91cyB2b3VsZXogY2hlcmNoZXJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubnVtZXJvUGh5c2lxdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlckNhc2VTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBOdW1lcm9DbGllbnRcbiAgICAgICAgICAgIGlmIChzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUgJiYgc2VhcmNoTnVtZXJvQ2xpZW50LnZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgLy8gQWpvdXRleiBpY2kgdG91cyBsZXMgY2hhbXBzIGRhbnMgbGVzcXVlbHMgdm91cyB2b3VsZXogY2hlcmNoZXJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubnVtZXJvQ2xpZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbHRyZSBwYXIgTm9tUnVlXG4gICAgICAgICAgICBpZiAoc2VhcmNoTm9tUnVlLnZhbHVlICYmIHNlYXJjaE5vbVJ1ZS52YWx1ZS50cmltKCkgIT09ICdUb3V0ZXMnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG93ZXJDYXNlU2VhcmNoID0gc2VhcmNoTm9tUnVlLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIC8vIEFqb3V0ZXogaWNpIHRvdXMgbGVzIGNoYW1wcyBkYW5zIGxlc3F1ZWxzIHZvdXMgdm91bGV6IGNoZXJjaGVyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50Lm5vbVJ1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyQ2FzZVNlYXJjaClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgVmlsbGVcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3ZpbGxlJytzZWFyY2hWaWxsZS52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hWaWxsZS52YWx1ZSAmJiBzZWFyY2hWaWxsZS52YWx1ZSAhPT0gJ1RvdXRlcycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQudmlsbGUgPT09IHNlYXJjaFZpbGxlLnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIFRlbFxuICAgICAgICAgICAgaWYgKHNlYXJjaFRlbC52YWx1ZSAmJiBzZWFyY2hUZWwudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnRlbDEudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZWwudmFsdWUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIFF1YXJ0aWVyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWFydGllcicrc2VhcmNoUXVhcnRpZXIudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoUXVhcnRpZXIudmFsdWUgJiYgc2VhcmNoUXVhcnRpZXIudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5xdWFydGllciA9PT0gc2VhcmNoUXVhcnRpZXIudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgTGliZWxsZVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncXVhcnRpZXInK3NlYXJjaFF1YXJ0aWVyLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaExpYmVsbGUudmFsdWUgJiYgc2VhcmNoTGliZWxsZS52YWx1ZSAhPT0gJ1RvdXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmxpYmVsbGVDb21wdGV1ciA9PT0gc2VhcmNoTGliZWxsZS52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBBZ2VudFxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncXVhcnRpZXInK3NlYXJjaFF1YXJ0aWVyLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaEFnZW50LnZhbHVlICYmIHNlYXJjaEFnZW50LnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgKHBvaW50LmFnZW50Lm5vbSsnICcrKHBvaW50LmFnZW50LnByZW5vbT8/JycpKSA9PT0gc2VhcmNoQWdlbnQudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgRGF0ZVJWXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWFydGllcicrc2VhcmNoUXVhcnRpZXIudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoRGF0ZVJWLnZhbHVlICYmIHNlYXJjaERhdGVSVi52YWx1ZSAhPT0gJ1RvdXRlcycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uX3BvaW50X1JWKHBvaW50LCBzZWFyY2hEYXRlUlYudmFsdWUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbmRpdGlvbl9wb2ludF9SVihwb2ludCwgZGF0ZVJWKXtcbiAgICAgICAgICAgICAgaWYocG9pbnQuY3JlbmVhdSl7IFxuICAgICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSA9PSBkYXRlUlYpe3JldHVybiB0cnVlO31cbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgaWYoZGF0ZVJWID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBpZihkYXRlUlYgPT0gJ1NhbnMgUlYnKXtyZXR1cm4gdHJ1ZTt9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgRXRhdFxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZXRhdCcrc2VhcmNoRXRhdC52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hFdGF0LnZhbHVlICYmIHNlYXJjaEV0YXQudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5ldGF0LmlkID09PSBzZWFyY2hFdGF0LnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBEYXRlUlZcbiAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25fc2VsZWN0ZWQocG9pbnQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbmRpdGlvbl9zZWxlY3RlZChwb2ludCl7XG4gICAgICAgICAgICAgICAgIGlmKHBvaW50LmZyb3plbil7XG4gICAgICAgICAgICAgICAgICAgICAgaWYocG9pbnQuZnJvemVuID09IHRydWUpe3JldHVybiBmYWxzZTt9XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvdW50LnZhbHVlID0gcG9pbnRzVG9GaWx0ZXIubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIHBvaW50c1RvRmlsdGVyO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjbGVhckZpbHRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIHNlYXJjaE5vbS52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoRXRhdC52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaFF1YXJ0aWVyLnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgc2VhcmNoTGliZWxsZS52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaFRlbC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoVmlsbGUudmFsdWUgPSAnVG91dGVzJztcbiAgICAgICAgICAgIHNlYXJjaE5vbVJ1ZS52YWx1ZSA9ICdUb3V0ZXMnO1xuICAgICAgICAgICAgc2VhcmNoTnVtZXJvQ2xpZW50LnZhbHVlICA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoTnVtZXJvUGh5c2lxdWUudmFsdWUgID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hEYXRlUlYudmFsdWUgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb24gcmVjb2l0IHVuIG1lc3NhZ2UgZGUgbGVhZmxldFxuICAgICAgICBjb25zdCB1cGRhdGVDbHVzdGVyID0gKGNsdXN0ZXJTZWFyY2gpID0+IHtcbiAgICAgICAgICAgIGNsZWFyRmlsdGVyKCk7XG4gICAgICAgICAgICBldmFsKCdzZWFyY2hDbHVzdGVyJytjbHVzdGVyU2VhcmNoLnR5cGUrJy52YWx1ZSA9ICcrY2x1c3RlclNlYXJjaC52YWx1ZSk7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjbGljIHJlY2lldmVkJyArIGNsdXN0ZXJTZWFyY2gudHlwZSArJ2lkJysgKyBjbHVzdGVyU2VhcmNoLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb24gcsOpaW5pdGFsaXNlIGwnYWZmaWNoYWdlLCBvbiBsw6h2ZSBsZSBsb2NrXG4gICAgICAgIGNvbnN0IGdsb2JhbEV4dGVybmFsQ2FsbCA9IChjbHVzdGVyX2lkLCBzZWwpID0+IHtcbiAgICAgICAgICAgIC8vc2VuZExvY2sobnVsbCwgMik7XG4gICAgICAgICAgICBzZWFyY2ggPSBzZWw7XG4gICAgICAgICAgICBmZXRjaFBvaW50cyhjbHVzdGVyX2lkKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UG9pbnQgPSAoaWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzLnZhbHVlLmZpbmQocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAocG9pbnQpIHtcbiAgICAgICAgICAgICAgICBwb2ludC5vcmlnaW5hbCA9IHsgLi4ucG9pbnQgfTtcbiAgICAgICAgICAgICAgICBwb2ludC5pc0VkaXRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3BvaW50QycrcG9pbnQuaWQpO1xuICAgICAgICAgICAgICAgIGlmIChwb2ludC5jcmVuZWF1ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNyZW5lYXUgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQuY3JlbmVhdS5pZCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3NlbmRMb2NrKHBvaW50LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjYW5jZWxFZGl0ID0gKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgIGlmIChwb2ludEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XSA9IHsgLi4ucG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLm9yaWdpbmFsLCBpc0VkaXRpbmc6IGZhbHNlLCBvcmlnaW5hbDoge30gfTtcbiAgICAgICAgICAgICAgICAvL3NlbmRMb2NrKHBvaW50cy52YWx1ZVtwb2ludEluZGV4XSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc2VuZEluZm9zID0gYXN5bmMoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9wb2ludHMvdXBkYXRlVjIvJytpZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHByb2R1Y3QudmFsdWUuY29tbWVudGFpcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJsZTogcHJvZHVjdC52YWx1ZS5jb21wdGV1ckFjY2Vzc2libGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2l2aWxpdGU6IHByb2R1Y3QudmFsdWUuY2l2aWxpdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9tOiBwcm9kdWN0LnZhbHVlLm5vbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcm9DbGllbnQ6IHByb2R1Y3QudmFsdWUubnVtZXJvQ2xpZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbDE6IHByb2R1Y3QudmFsdWUudGVsMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWwyOiBwcm9kdWN0LnZhbHVlLnRlbDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IHByb2R1Y3QudmFsdWUuZW1haWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhdDogcHJvZHVjdC52YWx1ZS5ldGF0LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ01vZGlmaWNhdGlvbiBlbnZvecOpZSDDoCBTeW1mb255LiBBdHRlbnRlIGRlIGxhIG1pc2Ugw6Agam91ciBNZXJjdXJlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnRmljaGUgbWlzZSDDoCBqb3VyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LmlzRWRpdGluZyA9IGZhbHNlOyAvLyBTb3J0aXIgZHUgbW9kZSDDqWRpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSBwcm9kdWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkdSBwcm9kdWl0OlwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0VycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZGUgbGEgZmljaGUgOiAnK2F3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgcsOpc2VhdSBsb3JzIGRlIGxhIHNhdXZlZ2FyZGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2VuZEV4Y2VsKCl7XG4gICAgICAgICAgICBoaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICBsZXQgY2hhaW5lID0gJyc7XG4gICAgICAgICAgICBmcm96ZW5Qb2ludHMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoYWluZSA9IGNoYWluZSArIGVsZW1lbnQuaWQgKyAnLCc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZmlsdGVyZWRQb2ludHMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoYWluZSA9IGNoYWluZSArIGVsZW1lbnQuaWQgKyAnLCc7XG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjaGFpbmUuc2xpY2UoMCwgLTEpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmZXRjaCgnL2V4Y2VsL2V4cG9ydC8nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluZTogY2hhaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3Npb25faWQ6IHByb3BzLnBhcmFtLm1pc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYmxvYigpKS50aGVuKGRhdGEgPT4gd2luZG93Lm9wZW4oVVJMLmNyZWF0ZU9iamVjdFVSTChkYXRhKSkpXG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGV4Y2VsXCIpO1xuICAgICAgICAgICAgIH0gICBcbiAgICAgICAgICAgIC8vd2luZG93Lm9wZW4oJy9hZG1pbi9leGNlbC9leHBvcnQvPycrY2hhaW5lLCAnX2JsYW5rJykuZm9jdXMoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgZnVuY3Rpb24gc2VsZWN0ZWRQb2ludHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHBvaW50cy52YWx1ZS5maWx0ZXIocG9pbnQgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhwb2ludC5zZWxlY3RlZCk7XG4gICAgICAgICAgICByZXR1cm4gKHBvaW50LnNlbGVjdGVkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBzZWFyY2hEYXRlQ3JlbmVhdShpZCkge1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LnBvaW50ID0gaWQ7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUuZGlzdGFuY2UgPSAncmVzZXQnO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LmRhdGUgPSBmb3JtYXREYXRlKGRhdGUudmFsdWUpO1xuICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS10b1VwZGF0ZScsIGRhdGFDcmVuZWF1KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZVRvRm9ybWF0KXtcbiAgICAgICAgICBpZiAoIWRhdGVUb0Zvcm1hdCkgcmV0dXJuICcnO1xuICAgICAgICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlVG9Gb3JtYXQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGVUb0Zvcm1hdC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTsgLy8gTGVzIG1vaXMgc29udCBpbmRleMOpcyDDoCBwYXJ0aXIgZGUgMFxuICAgICAgICAgIGNvbnN0IHllYXIgPSBkYXRlVG9Gb3JtYXQuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRTTVMgPSBhc3luYyhwb2ludCwgdGVsKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdzbXMgZW52b2knK3BvaW50LmlkKVxuICAgICAgICAgICAgICAgIGlmKHRlbC5sZW5ndGggPT0gOSl7dGVsID0gJzAnICsgdGVsO31cbiAgICAgICAgICAgICAgICBtZXNzYWdldGVtcC52YWx1ZSA9IG1lc3NhZ2UudmFsdWVbMF0udGV4dGUucmVwbGFjZShcIk5PTVwiLCBwb2ludC5jaXZpbGl0ZSsnICcrcG9pbnQubm9tKTtcbiAgICAgICAgICAgICAgICBtZXNzYWdldGVtcC52YWx1ZSA9IG1lc3NhZ2V0ZW1wLnZhbHVlLnJlcGxhY2UoXCJBRFJFU1NFXCIsIHBvaW50Lm51bWVyb1J1ZSsnICcrIHBvaW50LnRpdHJlUnVlKycgJytwb2ludC5ub21SdWUrJyAnK3BvaW50LmNvZGVQb3N0YWwrJyAnK3BvaW50LnZpbGxlKTtcbiAgICAgICAgICAgICAgICBsZXQgbGllbiA9ICAnaHR0cHM6Ly8nK3dpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSsnL2VhZS9jb25uZWN0Lycrb3BlcmF0aW9uSUQudmFsdWUrJy8nK3BvaW50LmlkO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2V0ZW1wLnZhbHVlID0gbWVzc2FnZXRlbXAudmFsdWUucmVwbGFjZShcIkxJRU5cIiwgbGllbik7XG4gICAgICAgICAgICAgICAgaWYocG9pbnQuY3JlbmVhdSl7XG4gICAgICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldGVtcC52YWx1ZSA9IG1lc3NhZ2V0ZW1wLnZhbHVlLnJlcGxhY2UoXCJEQVRFXCIsIHBvaW50LmNyZW5lYXUuZGF0ZSsnICcrIHBvaW50LmNyZW5lYXUuY3JlbmVhdUhvcmFpcmUubm9tICsnIEFnZW50IDogJytwb2ludC5jcmVuZWF1LmFnZW50Lm5vbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGVuY29kZWRUZXh0ID0gZW5jb2RlVVJJQ29tcG9uZW50KG1lc3NhZ2V0ZW1wLnZhbHVlKTtcblxuICAgICAgICAgICAgICAgIC8vIEFzdHVjZSBwb3VyIGNvbXBhdGliaWxpdMOpIGlPUyB2cyBBbmRyb2lkXG4gICAgICAgICAgICAgICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHZhciBpc2lPUyA9IC9pcGhvbmV8aXBhZHxpcG9kLy50ZXN0KHVhKTtcbiAgICAgICAgICAgICAgICB2YXIgc2VwYXJhdG9yID0gaXNpT1MgPyAnJicgOiAnPyc7XG5cbiAgICAgICAgICAgICAgICB3aW5kb3cub3Blbignc21zOicgKyB0ZWwgKyBzZXBhcmF0b3IgKyAnYm9keT0nICsgZW5jb2RlZFRleHQsICdfYmxhbmsnKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIC8qKi9cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Ntcy8nK3BvaW50LmlkKycvJyttZXNzYWdlLnZhbHVlWzBdLmlkKycvc2VuZCcsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZW5kRW1haWwgPSBhc3luYyhpZCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL21haWwvJytpZCsnLycrbWVzc2FnZS52YWx1ZVswXS5pZCsnL21haWxzZW5kJywge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHttZXNzYWdldXIudmFsdWUgPSBcIkVycmV1ciBlbnZvaSBtYWlsXCI7fVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSBkYXRhLmRhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIHLDqXNlYXVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJldXIgcsOpc2VhdVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdhdGNoKG1lc3NhZ2VTZWwsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSBtZXNzYWdlcy52YWx1ZS5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmlkID09PSBtZXNzYWdlU2VsLnZhbHVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0eXBlU2VsLnZhbHVlID0gbWVzc2FnZS52YWx1ZVswXS50eXBlO1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygndHlwZVNlbC52YWx1ZScrdHlwZVNlbC52YWx1ZSlcbiAgICAgICAgfSk7XG5cbi8vbGVzIHBvaW50cyBzw6lsZWN0aW9ubsOpc1xuXG4vL0VWRU5UIElOVEVSRkFDRSAgXG4gICAgICAgIGNvbnN0IExvY2sgPSAoZXZlbnQpID0+IHsgICAgICBcbiAgICAgICAgICAgIGxldCBwb2ludEluZGV4ID0gLTE7ICAgICAgXG4gICAgICAgICAgICBsb2NrZWRQb2ludHMudmFsdWUgPSBbXTtcbiAgICAgICAgICAgIHBvaW50SW5kZXggPSBmaWx0ZXJlZFBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBldmVudC5kYXRhLmlkKTtcbiAgICAgICAgICAgIGlmKHBvaW50SW5kZXggIT0gLTEpe1xuICAgICAgICAgICAgICAgIC8vbG9ja2VkUG9pbnRzLnZhbHVlID0gW2xvY2tlZFBvaW50cy52YWx1ZS5maWx0ZXIocCA9PiBwLmlkICE9PSBldmVudC5kYXRhLmlkKV07ICBcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5mcm96ZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZyb3plblBvaW50cy52YWx1ZS5wdXNoKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwb2ludEluZGV4ID0gZnJvemVuUG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGV2ZW50LmRhdGEuaWQpO1xuICAgICAgICAgICAgLy9leHBhbmRlZFJvd3NUYWIudmFsdWUgPSBbXTtcbiAgICAgICAgICAgIC8vZXhwYW5kZWRSb3dzVGFiLnZhbHVlLnB1c2goZnJvemVuUG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdKTtcbiAgICAgICAgICAgIFxuXG4gICAgICAgICAgICBmaWx0ZXJlZFBvaW50cy52YWx1ZS5zb3J0KCh2YWwxLCB2YWwyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbDEuaWQgPCB2YWwyLmlkID8gLTEgOiAxO1xuICAgICAgICAgICAgfSk7ICAgICAgICAgICAgXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZWRpdFByb2R1Y3QgPSAocHJvZCkgPT4ge1xuICAgICAgICAgICAgcHJvZHVjdC52YWx1ZSA9IHsuLi5wcm9kfTtcbiAgICAgICAgICAgIHByb2R1Y3REaWFsb2cudmFsdWUgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBleHBvcnRFeGNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgIGV4Y2VsRGlhbG9nLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGlkZURpYWxvZyA9ICgpID0+IHtcbiAgICAgICAgICAgIGV4Y2VsRGlhbG9nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICBwcm9kdWN0RGlhbG9nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICBzdWJtaXR0ZWQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkZWxldGVfbG9nPSBhc3luYyhpZCkgPT4ge1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvbG9nL2RlbGV0ZS8nK2lkLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge21lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIGVudm9pIGRlbGV0ZVwiO31cbiAgICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ2RlbGV0ZSBvaydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIHLDqXNlYXVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJldXIgcsOpc2VhdVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoZWNrVGVsID0gKHRlbCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRlbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBjb25zdCByZWdleCA9IC9eKDZ8MDZ8N3wwNykvOyBcbiAgICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QoU3RyaW5nKHRlbCkpO1xuICAgICAgICB9XG5cbi8vREVNQVJSQUdFXG4gICAgICAgIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoXCJodHRwczovL2FkMTFjNjAwLWVmNGEtNDgxNS1hM2RjLWEzMjY4Mjc0NWExNC5tZXJjdXJlLnJvY2tzLy53ZWxsLWtub3duL21lcmN1cmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJ0b3BpY1wiLCBcIi9jYXJ0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGhhbmRsZU1lcmN1cmVNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NhcnRlJywgaGFuZGxlTWVyY3VyZU1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIEV2ZW50U291cmNlOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHBFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lc3NhZ2VzJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcHBFbGVtZW50ICYmIGFwcEVsZW1lbnQuZGF0YXNldC51c2VyUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJQcm9wc0pzb24gPSBhcHBFbGVtZW50LmRhdGFzZXQudXNlclByb3BzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0udmFsdWUgPSBKU09OLnBhcnNlKHVzZXJQcm9wc0pzb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV0YXRzLnZhbHVlID0gcGFyYW0udmFsdWUuZXRhdHM7XG4gICAgICAgICAgICAgICAgICAgIG1vaXMudmFsdWUgPSBwYXJhbS52YWx1ZS5tb2lzO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbC52YWx1ZSA9IHBhcmFtLnZhbHVlLnRvdGFsO1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVySUQudmFsdWUgPSBwYXJhbS52YWx1ZS5jbHVzdGVySWQ7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbklELnZhbHVlID0gcGFyYW0udmFsdWUub3BlcmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZWFnZW50cy52YWx1ZSA9IHBhcmFtLnZhbHVlLmFnZW50cztcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMudmFsdWUgPSBwYXJhbS52YWx1ZS5tZXNzYWdlcztcbiAgICAgICAgICAgICAgICAgICAgbWlzc2lvbklELnZhbHVlID0gcGFyYW0udmFsdWUubWlzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hQb2ludHNNaXNzaW9uKG1pc3Npb25JRC52YWx1ZSlcblxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcblxuICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk1lcmN1cmUgRXZlbnRTb3VyY2UgY2xvc2VkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvLyBvbkJlZm9yZVVubW91bnQgZXN0IGFwcGVsw6kganVzdGUgYXZhbnQgcXVlIGxlIGNvbXBvc2FudCBuZSBzb2l0IHJldGlyw6kgZHUgRE9NLlxuICAgICAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuLy88U2VhcmNoIHYtaWY9XCJwYXJhbVwiIDpwYXJhbT1cInBhcmFtXCIvPlxuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG4gICAgICAgIDxkaXYgaWQ9XCJwb2ludHNcIiAgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoMTAwdmggLSAxMDBweCk7XCI+XG4gICAgICAgICAgICA8RGF0YVRhYmxlIFxuICAgICAgICAgICAgOnZhbHVlPVwiZmlsdGVyZWRQb2ludHNcIiBcbiAgICAgICAgICAgIHNjcm9sbGFibGUgXG4gICAgICAgICAgICBzY3JvbGxIZWlnaHQ9XCJmbGV4XCJcbiAgICAgICAgICAgIHBhZ2luYXRvciA6cm93cz1cIjEwMFwiIFxuICAgICAgICAgICAgZGF0YUtleT1cImlkXCIgXG4gICAgICAgICAgICBmaWx0ZXJEaXNwbGF5PVwicm93XCIgXG4gICAgICAgICAgICA6bG9hZGluZz1cImxvYWRpbmdcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1maWx0ZXItc2xhc2hcIiBsYWJlbD1cIkNsZWFyIEZpbHRyZVwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIEBjbGljaz1cImNsZWFyRmlsdGVyKClcIiBzdHlsZT1cImhlaWdodDo0MHB4O1wiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJtZXNzYWdlLWZpbHRlclwiIHYtbW9kZWw9XCJtZXNzYWdlU2VsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlPDqWxlY3Rpb25uZXpcIj5Tw6lsZWN0aW9ubmV6PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cIm1lc3NhZ2UgaW4gbWVzc2FnZXNcIiA6a2V5PVwibWVzc2FnZS5pZFwiIDp2YWx1ZT1cIm1lc3NhZ2UuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbWVzc2FnZS5ub20gfX0gLyB7eyBtZXNzYWdlLnN1amV0IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2VtcHR5PiBQYXMgZGUgcG9pbnQgdHJvdXbDqS4gPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2xvYWRpbmc+IExvYWRpbmcgLi4uIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImlkXCIgaGVhZGVyPVwiSURcIiAvPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbHM9XCJub21cIiBzdHlsZT1cIm1pbi13aWR0aDogMTJyZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuY2l2aWxpdGUgfX0ge3sgZGF0YS5ub20gfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IHYtbW9kZWw9XCJzZWFyY2hOb21cIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiTm9tXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm51bWVyb0NsaWVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEubnVtZXJvQ2xpZW50IH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCB2LW1vZGVsPVwic2VhcmNoTnVtZXJvQ2xpZW50XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk7CsCBjbGllbnRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwidGVsXCIgc3R5bGU9XCJtaW4td2lkdGg6IDEycmVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLnRlbDEgfX08YnI+e3sgZGF0YS50ZWwyIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCB2LW1vZGVsPVwic2VhcmNoVGVsXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlRlbFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm51bWVyb1BoeXNpcXVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5udW1lcm9QaHlzaXF1ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgdi1tb2RlbD1cInNlYXJjaE51bWVyb1BoeXNpcXVlXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk7CsCBwaHlzaXF1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiAgZmllbGQ9XCJldGF0XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmV0YXQgJiYgZGF0YS5ldGF0LmlkXCIgOnN0eWxlPVwieyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzJweCA4cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkICNjY2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTYwcHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZmZmJywgLyogQ291bGV1ciBkZSB0ZXh0ZSBibGFuY2hlIHBvdXIgdW4gbWVpbGxldXIgY29udHJhc3RlICovXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRhdGEuZXRhdC5jb3VsZXVyXG4gICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5ldGF0Lm5vbSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZXRhdC1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoRXRhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3VzXCI+VG91czwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJldGF0IGluIGV0YXRzXCIgOmtleT1cImV0YXRcIiA6dmFsdWU9XCJldGF0LmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGV0YXQubm9tIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibGFzdE1lc3NhZ2VcIiBzdHlsZT1cIndpZHRoOiAxNTBweDtcIiBoZWFkZXI9XCJEZXJuaWVyIE1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5sb2dwb2ludHMubGVuZ3RoID4gMFwiPnt7IGRhdGEubG9ncG9pbnRzLnNsaWNlKC0xKVswXS5kYXRlY3JlYSB9fS97eyBkYXRhLmxvZ3BvaW50cy5zbGljZSgtMSlbMF0uY29tbWVudGFpcmUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxDb2x1bW4gc3R5bGU9XCJ3aWR0aDogMTAwcHggIWltcG9ydGFudFwiPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInNsb3RQcm9wc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cInNsb3RQcm9wcy5kYXRhLmVtYWlsLmxlbmd0aCA+IDYgJiYgdHlwZVNlbCA9PSAxXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mb1wiIEBjbGljaz1cInNlbmRFbWFpbChzbG90UHJvcHMuZGF0YS5pZClcIiBzdHlsZT1cIndpZHRoOiAyNTBweCAhaW1wb3J0YW50XCI+e3sgc2xvdFByb3BzLmRhdGEuZW1haWwgfX08L2J1dHRvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwic2xvdFByb3BzLmRhdGEudGVsMSAmJiBjaGVja1RlbChzbG90UHJvcHMuZGF0YS50ZWwxKSAmJiB0eXBlU2VsID09IDJcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvXCIgQGNsaWNrPVwic2VuZFNNUyhzbG90UHJvcHMuZGF0YSxzbG90UHJvcHMuZGF0YS50ZWwxKVwiIHN0eWxlPVwid2lkdGg6IDI1MHB4ICFpbXBvcnRhbnRcIj48c3BhbiBjbGFzcz1cInBpIHBpLW1vYmlsZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwOyZuYnNwO1NNUyB7eyBzbG90UHJvcHMuZGF0YS50ZWwxIH19PC9idXR0b24+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cInNsb3RQcm9wcy5kYXRhLnRlbDIgJiYgY2hlY2tUZWwoc2xvdFByb3BzLmRhdGEudGVsMikgJiYgdHlwZVNlbCA9PSAyXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mb1wiIEBjbGljaz1cInNlbmRTTVMoc2xvdFByb3BzLmRhdGEsc2xvdFByb3BzLmRhdGEudGVsMilcIiBzdHlsZT1cIndpZHRoOiAyNTBweCAhaW1wb3J0YW50XCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1tb2JpbGVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj4mbmJzcDsmbmJzcDtTTVMge3sgc2xvdFByb3BzLmRhdGEudGVsMiB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJzbG90UHJvcHMuZGF0YS5lbWFpbC5sZW5ndGggPiA2ICYmIHR5cGVTZWwgPT0gNVwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm9cIiBAY2xpY2s9XCJzZW5kRW1haWwoc2xvdFByb3BzLmRhdGEuaWQpXCIgc3R5bGU9XCJ3aWR0aDogMjUwcHggIWltcG9ydGFudFwiPkVtYWlsIFJWIFdlYjwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJzbG90UHJvcHMuZGF0YS50ZWwxICYmIGNoZWNrVGVsKHNsb3RQcm9wcy5kYXRhLnRlbDEpICYmIHR5cGVTZWwgPT0gNVwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm9cIiBAY2xpY2s9XCJzZW5kU01TKHNsb3RQcm9wcy5kYXRhLHNsb3RQcm9wcy5kYXRhLnRlbDEpXCIgc3R5bGU9XCJ3aWR0aDogMjUwcHggIWltcG9ydGFudFwiPjxzcGFuIGNsYXNzPVwicGkgcGktbW9iaWxlXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj48L3NwYW4+Jm5ic3A7Jm5ic3A7U01TIFJWIFdlYiB7eyBzbG90UHJvcHMuZGF0YS50ZWwxIH19PC9idXR0b24+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cInNsb3RQcm9wcy5kYXRhLnRlbDIgJiYgY2hlY2tUZWwoc2xvdFByb3BzLmRhdGEudGVsMikgJiYgdHlwZVNlbCA9PSA1XCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mb1wiIEBjbGljaz1cInNlbmRTTVMoc2xvdFByb3BzLmRhdGEsc2xvdFByb3BzLmRhdGEudGVsMilcIiBzdHlsZT1cIndpZHRoOiAyNTBweCAhaW1wb3J0YW50XCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1tb2JpbGVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj4mbmJzcDsmbmJzcDtTTVMgUlYgV2ViIHt7IHNsb3RQcm9wcy5kYXRhLnRlbDIgfX08L2J1dHRvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibm9tUnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5udW1lcm9SdWUgfX0ge3sgZGF0YS50aXRyZVJ1ZSAgfX0ge3sgZGF0YS5ub21SdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJub21SdWUtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaE5vbVJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXRlc1wiPlRvdXRlcyBsZXMgcnVlczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cInJ1ZSBpbiBydWVzXCIgOmtleT1cInJ1ZVwiIDp2YWx1ZT1cInJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJ1ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJ2aWxsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuY29kZVBvc3RhbCB9fSB7eyBkYXRhLnZpbGxlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInZpbGxlLWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hWaWxsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3V0ZXNcIj5Ub3V0ZXMgdmlsbGVzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cInZpbGxlIGluIHZpbGxlc1wiIDprZXk9XCJ2aWxsZVwiIDp2YWx1ZT1cInZpbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHZpbGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiYWdlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5hZ2VudFwiPnt7IGRhdGEuYWdlbnQubm9tIH19IDxzcGFuIHYtaWY9XCJkYXRhLmFnZW50LnByZW5vbVwiPnt7IGRhdGEuYWdlbnQucHJlbm9tIH19PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiYWdlbnQtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaEFnZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXNcIj5Ub3VzIGFnZW50czwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJhZ2VudCBpbiBhZ2VudHNcIiA6a2V5PVwiYWdlbnRcIiA6dmFsdWU9XCJhZ2VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhZ2VudCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImRhdGVSVlwiIHN0eWxlPVwibWluLXdpZHRoOiAxNTBweFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEuY3JlbmVhdVwiPnt7IGRhdGEuY3JlbmVhdS5kYXRlIH19IHt7IGRhdGEuY3JlbmVhdS5jcmVuZWF1SG9yYWlyZS5ub20gfX08YnI+QWdlbnQgOiB7eyBkYXRhLmNyZW5lYXUuYWdlbnQubm9tIH19IDxzcGFuIHYtaWY9XCJkYXRhLmNyZW5lYXUuYWdlbnQucHJlbm9tXCI+e3sgZGF0YS5jcmVuZWF1LmFnZW50LnByZW5vbSB9fTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImRhdGVSVi1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoRGF0ZVJWXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXRlc1wiPlJWIC8gVG91dGVzIGRhdGVzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cImRhdGVSViBpbiBkYXRlc1JWXCIgOmtleT1cImRhdGVSVlwiIDp2YWx1ZT1cImRhdGVSVlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRlUlYgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgICA8Q29sdW1uIGhlYWRlcj1cIkVkaXRcIiBzdHlsZT1cIndpZHRoOiA1MHB4XCI+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwic2xvdFByb3BzXCI+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBpY29uPVwicGkgcGktcGVuY2lsXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgcm91bmRlZCBjbGFzcz1cIm1yLTJcIiBAY2xpY2s9XCJlZGl0UHJvZHVjdChzbG90UHJvcHMuZGF0YSlcIj5FZGl0PC9CdXR0b24+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgIDwvRGF0YVRhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8RGlhbG9nIHYtbW9kZWw6dmlzaWJsZT1cInByb2R1Y3REaWFsb2dcIiA6c3R5bGU9XCJ7IHdpZHRoOiAnNDUwcHgnIH1cIiBoZWFkZXI9XCJEw6l0YWlscyBkdSBwb2ludFwiIDptb2RhbD1cInRydWVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC02XCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm51bWVyb0NsaWVudFwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5OdW3DqXJvIENsaWVudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJudW1lcm9DbGllbnRcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0Lm51bWVyb0NsaWVudFwiIHJlcXVpcmVkPVwidHJ1ZVwiIGF1dG9mb2N1cyA6aW52YWxpZD1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5udW1lcm9DbGllbnRcIiBmbHVpZCAvPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgdi1pZj1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5udW1lcm9DbGllbnRcIiBjbGFzcz1cInRleHQtcmVkLTUwMFwiPk51bcOpcm8gQ2xpZW50IHJlcXVpcy48L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb21wdGV1ckFjY2Vzc2libGVcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+QWNjZXNzaWJsZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiY29tcHRldXJBY2Nlc3NpYmxlXCIgdi1tb2RlbD1cInByb2R1Y3QuY29tcHRldXJBY2Nlc3NpYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiA6dmFsdWU9XCJ0cnVlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiBncmVlblwiPk91aTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gOnZhbHVlPVwiZmFsc2VcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHJlZFwiPk5vbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+IFxuICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXRhdFwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5DaGFuZ2VyIGwnw6l0YXQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0IHYtbW9kZWw9XCJwcm9kdWN0LmV0YXRcIiA6b3B0aW9ucz1cImV0YXRzXCIgb3B0aW9uTGFiZWw9XCJub21cIiAgOmluaXRpYWxWYWx1ZXM9XCJwcm9kdWN0LmV0YXQuaWRcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdGlvbm5lciB1biDDqXRhdFwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+ICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXRhdFwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5BZ2VudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3Qgdi1tb2RlbD1cInByb2R1Y3QuYWdlbnRcIiA6b3B0aW9ucz1cImxpc3RlYWdlbnRzXCIgb3B0aW9uTGFiZWw9XCJub21cIiAgOmluaXRpYWxWYWx1ZXM9XCJwcm9kdWN0LmFnZW50LmlkXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3Rpb25uZXIgdW4gYWdlbnRcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjaXZpbGl0ZVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5DaXZpbGl0w6k8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwiY2l2aWxpdGVcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0LmNpdmlsaXRlXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgYXV0b2ZvY3VzIDppbnZhbGlkPVwic3VibWl0dGVkICYmICFwcm9kdWN0LmNpdmlsaXRlXCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHYtaWY9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QuY2l2aWxpdGVcIiBjbGFzcz1cInRleHQtcmVkLTUwMFwiPkNpdmlsaXTDqSByZXF1aXNlLjwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+Tm9tPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cIm5hbWVcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0Lm5vbVwiIHJlcXVpcmVkPVwidHJ1ZVwiIGF1dG9mb2N1cyA6aW52YWxpZD1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5ub21cIiBmbHVpZCAvPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgdi1pZj1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5ub21cIiBjbGFzcz1cInRleHQtcmVkLTUwMFwiPk5vbSByZXF1aXMuPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGVsMVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5UZWwgMTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJ0ZWwxXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC50ZWwxXCIgcmVxdWlyZWQ9XCJmYWxzZVwiIGF1dG9mb2N1cyBmbHVpZCAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0ZWwyXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPlRlbCAyPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cInRlbDJcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0LnRlbDJcIiByZXF1aXJlZD1cImZhbHNlXCIgYXV0b2ZvY3VzIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkVtYWlsPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cImVtYWlsXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5lbWFpbFwiIHJlcXVpcmVkPVwiZmFsc2VcIiBhdXRvZm9jdXMgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY29tbWVudGFpcmVcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+Q29tbWVudGFpcmU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8VGV4dGFyZWEgaWQ9XCJjb21tZW50YWlyZVwiIHYtbW9kZWw9XCJwcm9kdWN0LmNvbW1lbnRhaXJlXCIgcmVxdWlyZWQ9XCJmYWxzZVwiIHJvd3M9XCIzXCIgY29scz1cIjIwXCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHRlbXBsYXRlICNmb290ZXI+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIkFubnVsZXJcIiBpY29uPVwicGkgcGktdGltZXNcIiB0ZXh0IEBjbGljaz1cImhpZGVEaWFsb2dcIiAvPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJTYXV2ZXJcIiBpY29uPVwicGkgcGktY2hlY2tcIiBAY2xpY2s9XCJzZW5kSW5mb3MocHJvZHVjdC5pZClcIiAvPlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9EaWFsb2c+XG4gICAgICAgIDxEaWFsb2cgdi1tb2RlbDp2aXNpYmxlPVwiZXhjZWxEaWFsb2dcIiA6c3R5bGU9XCJ7IHdpZHRoOiAnNDUwcHgnIH1cIiBoZWFkZXI9XCJFeHBvcnQgRXhjZWxcIiA6bW9kYWw9XCJ0cnVlXCI+XG4gICAgICAgICAgICA8cD5VbiBleHBvcnQgY29tcGxldCBlc3QgZ8OpbsOpcsOpIGNoYXF1ZSBudWl0LiBWb3VzIHBvdXZleiBjcsOpZXIgdW4gcmFwcG9ydCBwYXJ0aWVsIGxpbWl0w6kgw6AgNTAwIGxpZ25lcyDDoCBwYXJ0aXIgZGUgdm9zIGNyaXTDqHJlcy48L3A+XG4gICAgICAgICAgICA8dGVtcGxhdGUgI2Zvb3Rlcj5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiQW5udWxlclwiIGljb249XCJwaSBwaS10aW1lc1wiIHRleHQgQGNsaWNrPVwiaGlkZURpYWxvZ1wiIC8+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIkV4cG9ydGVyXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgQGNsaWNrPVwic2VuZEV4Y2VsKClcIiAvPlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9EaWFsb2c+XG48L3RlbXBsYXRlPlxuPHN0eWxlPlxuOmRlZXAodHIubXktY3VzdG9tLWhpZ2hsaWdodCkge1xuICAgIC8qYmFja2dyb3VuZDogI2ZjZDlhNSAhaW1wb3J0YW50OyovXG4gICAgLypmb250LXdlaWdodDogYm9sZDsqL1xufVxuLnAtZGF0YXRhYmxlLXRoZWFkID4gdHIgPiB0aCAge1xuICAgIHBhZGRpbmctdG9wOiA0cHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWJvdHRvbTogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1sZWZ0OiA0cHggIWltcG9ydGFudDtcbn1cbi5wLWRhdGF0YWJsZS1oZWFkZXItY2VsbCAgIHtcbiAgICBwYWRkaW5nLXRvcDogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctbGVmdDogNHB4ICFpbXBvcnRhbnQ7XG59XG5zZWxlY3Qge21heC13aWR0aDogMTIwcHg7fVxuPC9zdHlsZT4iLCI8dGVtcGxhdGU+XHJcbiAgPHRhYmxlPlxyXG4gIDx0Ym9keT5cclxuICA8dHI+XHJcbiAgPHRkPlxyXG4gIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O2ZsZXgtZGlyZWN0aW9uOiBjb2x1bW47ZmxleC13cmFwOiBub3dyYXA7d2lkdGg6IDIxMHB4O3Bvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgPEZsb2F0TGFiZWw+XHJcbiAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwidXNlcm5hbWVcIiB2LW1vZGVsPVwicXVlcnlcIiBAaW5wdXQ9XCJoYW5kbGVJbnB1dFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiLz5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJ1c2VybmFtZVwiPk5vbSBvdSB0ZWw8L2xhYmVsPlxyXG4gICAgICA8L0Zsb2F0TGFiZWw+XHJcbiAgICA8L2Rpdj4gICAgICAgICAgXHJcbiAgICA8dWwgdi1pZj1cInJlc3VsdHMubGVuZ3RoID4gMFwiIGNsYXNzPVwic3VnZ2VzdGlvbnNcIj5cclxuICAgICAgICAgICAgPGxpIHYtZm9yPVwicG9pbnQgaW4gcmVzdWx0c1wiIDprZXk9XCJwb2ludC5ub21cIiBAY2xpY2s9XCJzZWxlY3ROb20ocG9pbnQubm9tKVwiPlxyXG4gICAgICAgICAgICAgIHt7IHBvaW50LmNpdmlsaXRlfX0ge3sgcG9pbnQubm9tIH19XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG4gICAgPC90ZD5cclxuICAgIDx0ZD5cclxuICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtmbGV4LWRpcmVjdGlvbjogY29sdW1uO2ZsZXgtd3JhcDogbm93cmFwO3dpZHRoOiAyMTBweDtwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgIDxGbG9hdExhYmVsPlxyXG4gICAgICAgICAgPElucHV0VGV4dCBpZD1cIm51bWVyb1wiIHYtbW9kZWw9XCJxdWVyeTNcIiBAaW5wdXQ9XCJoYW5kbGVJbnB1dDNcIiBhdXRvY29tcGxldGU9XCJvZmZcIi8+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwibnVtZXJvXCI+TsKwIGNvbXB0ZXVyIG91IGNsaWVudDwvbGFiZWw+XHJcbiAgICAgIDwvRmxvYXRMYWJlbD5cclxuICAgIDwvZGl2PiAgICAgICAgICBcclxuICAgIDx1bCB2LWlmPVwicmVzdWx0czMubGVuZ3RoID4gMFwiIGNsYXNzPVwic3VnZ2VzdGlvbnNcIj5cclxuICAgICAgICAgICAgPGxpIHYtZm9yPVwicG9pbnQgaW4gcmVzdWx0czNcIiA6a2V5PVwicG9pbnQubm9tXCIgQGNsaWNrPVwic2VsZWN0TnVtZXJvKHBvaW50Lm51bWVyb0NsaWVudClcIj5cclxuICAgICAgICAgICAgICB7eyBwb2ludC5udW1lcm9QaHlzaXF1ZX19IC8ge3sgcG9pbnQubnVtZXJvQ2xpZW50IH19XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG4gICAgPC90ZD5cclxuICAgIDx0ZD5cclxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O2ZsZXgtZGlyZWN0aW9uOiBjb2x1bW47ZmxleC13cmFwOiBub3dyYXA7d2lkdGg6IDIxMHB4O3Bvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgPEZsb2F0TGFiZWw+XHJcbiAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwidmlsbGVcIiB2LW1vZGVsPVwicXVlcnkyXCIgQGlucHV0PVwiaGFuZGxlSW5wdXQyXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIvPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInZpbGxlXCI+VmlsbGU8L2xhYmVsPlxyXG4gICAgICA8L0Zsb2F0TGFiZWw+XHJcbiAgICA8L2Rpdj4gICAgICAgICAgXHJcbiAgICA8dWwgdi1pZj1cInJlc3VsdHMyLmxlbmd0aCA+IDBcIiBjbGFzcz1cInN1Z2dlc3Rpb25zXCI+XHJcbiAgICAgICAgICAgIDxsaSB2LWZvcj1cInBvaW50IGluIHJlc3VsdHMyXCIgOmtleT1cInBvaW50LnZpbGxlXCIgQGNsaWNrPVwic2VsZWN0VmlsbGUocG9pbnQudmlsbGUpXCI+XHJcbiAgICAgICAgICAgICAge3sgcG9pbnQuY29kZVBvc3RhbCB9fSB7eyBwb2ludC52aWxsZSB9fVxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgPC91bD5cclxuICA8L3RkPlxyXG4gIDx0ZD5cclxuICAgIDxkaXYgdi1pZj1cInF1ZXJ5MlwiIHN0eWxlPVwiZGlzcGxheTogZmxleDtmbGV4LWRpcmVjdGlvbjogY29sdW1uO2ZsZXgtd3JhcDogbm93cmFwO3dpZHRoOiAyMTBweDtwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgIDxGbG9hdExhYmVsPlxyXG4gICAgICAgICAgPE11bHRpU2VsZWN0ICBcclxuICAgICAgICAgIGlkPVwicnVlXCIgXHJcbiAgICAgICAgICAgIHYtbW9kZWw9XCJzZWxlY3RlZEl0ZW1zXCIgXHJcbiAgICAgICAgICAgIDpvcHRpb25zPVwib3B0aW9uc1wiIFxyXG4gICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5vbVJ1ZVwiIFxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlJlY2hlcmNoZXIuLi5cIlxyXG4gICAgICAgICAgICA6ZmlsdGVyPVwidHJ1ZVwiIFxyXG4gICAgICAgICAgICBAZmlsdGVyPVwib25GaWx0ZXJcIiBcclxuICAgICAgICAgICAgQGNoYW5nZT1cIm9uU2VsZWN0aW9uQ2hhbmdlXCIgXHJcbiAgICAgICAgICAgIDpsb2FkaW5nPVwibG9hZGluZzJcIlxyXG4gICAgICAgICAgICA6c2VsZWN0aW9uTGltaXQ9XCIzXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgbWQ6dy0yMHJlbVwiXHJcbiAgICAgICAgICAgIGVtcHR5TWVzc2FnZT1cIkF1IG1vaW5zIGRldXggbGV0dHJlc1wiXHJcbiAgICAgICAgICAgIGVtcHR5RmlsdGVyTWVzc2FnZT1cIkF1Y3VuIHLDqXN1bHRhdCB0cm91dsOpXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInJ1ZVwiPlJ1ZTwvbGFiZWw+XHJcbiAgICAgIDwvRmxvYXRMYWJlbD5cclxuICAgIDwvZGl2PiAgICAgICAgICBcclxuICA8L3RkPlxyXG4gICAgPHRkPlxyXG4gICAgPGRpdiB2LWlmPVwicXVlcnk0XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O2ZsZXgtZGlyZWN0aW9uOiBjb2x1bW47ZmxleC13cmFwOiBub3dyYXA7d2lkdGg6IDIxMHB4O3Bvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgPEZsb2F0TGFiZWw+XHJcbiAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwibnVtcnVlXCIgdi1tb2RlbD1cInF1ZXJ5NVwiIEBpbnB1dD1cImhhbmRsZUlucHV0NVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiLz5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJudW1ydWVcIj5OdW08L2xhYmVsPlxyXG4gICAgICA8L0Zsb2F0TGFiZWw+XHJcbiAgICA8L2Rpdj4gICAgICAgICAgXHJcbiAgICA8dWwgdi1pZj1cInJlc3VsdHM1Lmxlbmd0aD4wXCIgY2xhc3M9XCJzdWdnZXN0aW9uc1wiPlxyXG4gICAgICAgICAgICA8bGkgdi1mb3I9XCJwb2ludCBpbiByZXN1bHRzNVwiIDprZXk9XCJwb2ludC5udW1lcm9SdWVcIiBAY2xpY2s9XCJzZWxlY3ROdW1SdWUocG9pbnQubnVtZXJvUnVlKVwiPlxyXG4gICAgICAgICAgICAgIHt7IHBvaW50Lm51bWVyb1J1ZSB9fVxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICA8L3RkPlxyXG4gIDwvdHI+XHJcbiAgPHRyPjx0ZCBjb2xzcGFuPVwiNFwiPjxzcGFuIHN0eWxlPVwiY29sb3I6IGJsYWNrO1wiPnt7IGNvdW50ZXIgfX0gcsOpc3VsdGF0KHMpPC9zcGFuPiZuYnNwOyZuYnNwOzxCdXR0b24gdHlwZT1cImJ1dHRvblwiIGxhYmVsPVwiUmVzZXRcIiAgQGNsaWNrPVwiY2xlYXJGaWx0ZXIoKVwiIHN0eWxlPVwiaGVpZ2h0OjIwcHg7XCIvPjwvdGQ+PC90cj5cclxuICA8L3Rib2R5PlxyXG4gIDwvdGFibGU+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwPlxyXG5pbXBvcnQgeyByZWYgfSBmcm9tICd2dWUnO1xyXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xyXG5pbXBvcnQgeyBidXMgfSBmcm9tICcuLi9idXMuanMnOyBcclxuXHJcbmltcG9ydCBJbnB1dFRleHQgZnJvbSAncHJpbWV2dWUvaW5wdXR0ZXh0JztcclxuaW1wb3J0IEZsb2F0TGFiZWwgZnJvbSAncHJpbWV2dWUvZmxvYXRsYWJlbCc7XHJcbmltcG9ydCBNdWx0aVNlbGVjdCBmcm9tICdwcmltZXZ1ZS9tdWx0aXNlbGVjdCc7XHJcblxyXG5pbXBvcnQgQnV0dG9uIGZyb20gJ3ByaW1ldnVlL2J1dHRvbic7XHJcbmltcG9ydCBJY29uRmllbGQgZnJvbSAncHJpbWV2dWUvaWNvbmZpZWxkJztcclxuaW1wb3J0IElucHV0SWNvbiBmcm9tICdwcmltZXZ1ZS9pbnB1dGljb24nO1xyXG5cclxuY29uc3QgcXVlcnkgPSByZWYoJycpO1xyXG5jb25zdCByZXN1bHRzID0gcmVmKFtdKTtcclxuY29uc3QgcXVlcnkyID0gcmVmKCcnKTtcclxuY29uc3QgcmVzdWx0czIgPSByZWYoW10pO1xyXG5jb25zdCBxdWVyeTMgPSByZWYoJycpO1xyXG5jb25zdCByZXN1bHRzMyA9IHJlZihbXSk7XHJcbmNvbnN0IHF1ZXJ5NCA9IHJlZignJyk7XHJcbmNvbnN0IHJlc3VsdHM0ID0gcmVmKFtdKTtcclxuY29uc3QgcXVlcnk1ID0gcmVmKCcnKTtcclxuY29uc3QgcmVzdWx0czUgPSByZWYoW10pO1xyXG5jb25zdCBjb3VudGVyID0gcmVmKDApO1xyXG5jb25zdCBjcml0ZXJlID0gcmVmKCcnKTtcclxubGV0IHRpbWVvdXQgPSBudWxsO1xyXG5cclxuY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHJlZihbXSk7XHJcbmNvbnN0IG9wdGlvbnMgPSByZWYoW10pO1xyXG5jb25zdCBsb2FkaW5nMiA9IHJlZihmYWxzZSk7XHJcbmxldCBkZWJvdW5jZVRpbWVyID0gbnVsbDtcclxuY29uc3QgaXNTdWJtaXR0aW5nID0gcmVmKGZhbHNlKTtcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0cyhbJ3NlYXJjaC1zZWxlY3RlZCddKTtcclxuXHJcbmNvbnN0IGhhbmRsZUlucHV0ID0gKCkgPT4ge1xyXG4gIGlmIChxdWVyeS52YWx1ZS5sZW5ndGggPCAzKSB7XHJcbiAgICByZXN1bHRzLnZhbHVlID0gW107XHJcbiAgICByZXR1cm47IC8vIE9uIHNvcnQgZGUgbGEgZm9uY3Rpb24sIHBhcyBkJ2FwcGVsIEFQSVxyXG4gIH1cclxuICBzZW5kSW5wdXQocmVzdWx0cywgJ25vbScpO1xyXG59O1xyXG5cclxuLy92aWxsZVxyXG5jb25zdCBoYW5kbGVJbnB1dDIgPSAoKSA9PiB7XHJcbiAgaWYgKHF1ZXJ5Mi52YWx1ZS5sZW5ndGggPCAyKSB7XHJcbiAgICByZXN1bHRzMi52YWx1ZSA9IFtdO1xyXG4gICAgcmV0dXJuOyAvLyBPbiBzb3J0IGRlIGxhIGZvbmN0aW9uLCBwYXMgZCdhcHBlbCBBUElcclxuICB9XHJcbiAgc2VuZElucHV0KHJlc3VsdHMyLCAndmlsbGUnKTtcclxufTtcclxuXHJcbi8vdmlsbGVcclxuY29uc3QgaGFuZGxlSW5wdXQzID0gKCkgPT4ge1xyXG4gIGlmIChxdWVyeTMudmFsdWUubGVuZ3RoIDwgMikge1xyXG4gICAgcmVzdWx0czMudmFsdWUgPSBbXTtcclxuICAgIHJldHVybjsgLy8gT24gc29ydCBkZSBsYSBmb25jdGlvbiwgcGFzIGQnYXBwZWwgQVBJXHJcbiAgfVxyXG4gIHNlbmRJbnB1dChyZXN1bHRzMywgJ251bWVybycpO1xyXG59O1xyXG5cclxuLy9ydWVcclxuY29uc3QgaGFuZGxlSW5wdXQ0ID0gKCkgPT4ge1xyXG4gIGlmIChxdWVyeTQudmFsdWUubGVuZ3RoIDwgMikge1xyXG4gICAgcmVzdWx0czQudmFsdWUgPSBbXTtcclxuICAgIHJldHVybjsgLy8gT24gc29ydCBkZSBsYSBmb25jdGlvbiwgcGFzIGQnYXBwZWwgQVBJXHJcbiAgfVxyXG4gICBzZW5kSW5wdXQocmVzdWx0czQsICdydWUnKTtcclxufTtcclxuXHJcbmNvbnN0IGhhbmRsZUlucHV0NSA9ICgpID0+IHtcclxuICBpZiAocXVlcnk1LnZhbHVlLmxlbmd0aCA8IDEpIHtcclxuICAgIHJlc3VsdHM1LnZhbHVlID0gW107XHJcbiAgICByZXR1cm47IC8vIE9uIHNvcnQgZGUgbGEgZm9uY3Rpb24sIHBhcyBkJ2FwcGVsIEFQSVxyXG4gIH1cclxuXHJcbiAgIHNlbmRJbnB1dChyZXN1bHRzNSwgJ251bXJ1ZScpO1xyXG59O1xyXG5cclxuLy8gRm9uY3Rpb24gZGUgcmVjaGVyY2hlIHZpYSBBSkFYXHJcbmNvbnN0IG9uRmlsdGVyID0gKGV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCBxdWVyeSA9IGV2ZW50LnZhbHVlO1xyXG5cclxuICAgIGlmICghcXVlcnkgfHwgcXVlcnkudHJpbSgpLmxlbmd0aCA8IDIpIHJldHVybjtcclxuXHJcbiAgICAvLyBEZWJvdW5jZSBwb3VyIGxpbWl0ZXIgbGVzIGFwcGVscyBBUElcclxuICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVyKTtcclxuICAgIGRlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgICBsb2FkaW5nMi52YWx1ZSA9IHRydWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gUmVtcGxhY2V6IHBhciB2b3RyZSBhcHBlbCBBUEkgcsOpZWxcclxuICAgICAgICAgICAgLy9jb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL2FwaS5leGVtcGxlLmNvbS9zZWFyY2g/cT0ke3F1ZXJ5fWApO1xyXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldCgnL2FwaS9zdGFuZGFyZC9zZWFyY2gnLCB7IFxyXG4gICAgICAgICAgICAgIHBhcmFtczogeyBcclxuICAgICAgICAgICAgICAgICBuOiBxdWVyeS52YWx1ZSxcclxuICAgICAgICAgICAgICAgICB2OiBxdWVyeTIudmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgbnVtOiBxdWVyeTMudmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgcjogcXVlcnk0LnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgIG51bXJ1ZTogcXVlcnk1LnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgIGM6ICdydWUnXHJcbiAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBuZXdSZXN1bHRzID0gYXdhaXQgcmVzcG9uc2UuZGF0YTtcclxuXHJcbiAgICAgICAgICAgIC8vIEZVU0lPTiA6IEdhcmRlciBsZXMgw6lsw6ltZW50cyBkw6lqw6Agc8OpbGVjdGlvbm7DqXMgKyBsZXMgbm91dmVhdXggcsOpc3VsdGF0c1xyXG4gICAgICAgICAgICAvLyBDZWxhIMOpdml0ZSBxdWUgbGVzIMOpbMOpbWVudHMgZMOpasOgIGNvY2jDqXMgbmUgZGlzcGFyYWlzc2VudCBkZSBsYSBsaXN0ZVxyXG4gICAgICAgICAgICBjb25zdCBhbGxPcHRpb25zID0gWy4uLnNlbGVjdGVkSXRlbXMudmFsdWVdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbmV3UmVzdWx0cy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFhbGxPcHRpb25zLmZpbmQobyA9PiBvLm5vbVJ1ZSA9PT0gaXRlbS5ub21SdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsT3B0aW9ucy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIG9wdGlvbnMudmFsdWUgPSBhbGxPcHRpb25zO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgbG9ycyBkdSBjaGFyZ2VtZW50IGRlcyBvcHRpb25zXCIsIGVycm9yKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICBsb2FkaW5nMi52YWx1ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH0sIDQwMCk7IC8vIDQwMG1zIGRlIGTDqWxhaVxyXG59O1xyXG5cclxuLy8gQ2V0dGUgZm9uY3Rpb24gZXN0IGFwcGVsw6llIMOgIGNoYXF1ZSBjbGljIHN1ciB1bmUgY2FzZVxyXG5jb25zdCBvblNlbGVjdGlvbkNoYW5nZSA9IGFzeW5jIChldmVudCkgPT4ge1xyXG4gICAgLy8gZXZlbnQudmFsdWUgY29udGllbnQgbGEgbm91dmVsbGUgbGlzdGUgY29tcGzDqHRlIGRlcyDDqWzDqW1lbnRzIHPDqWxlY3Rpb25uw6lzXHJcbiAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uID0gZXZlbnQudmFsdWU7XHJcblxyXG4gICAgXHJcbnF1ZXJ5NC52YWx1ZSA9IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRTZWxlY3Rpb24ubWFwKGkgPT4gaS5ub21SdWUpKVxyXG4gIGlmIChxdWVyeTQudmFsdWUubGVuZ3RoIDwgMikge1xyXG4gICAgcmVzdWx0czQudmFsdWUgPSBbXTtcclxuICAgIHJldHVybjsgLy8gT24gc29ydCBkZSBsYSBmb25jdGlvbiwgcGFzIGQnYXBwZWwgQVBJXHJcbiAgfVxyXG4gICAvL3NlbmRJbnB1dChyZXN1bHRzNCwgJ3J1ZScpO1xyXG4gICBjb3VudElucHV0KClcclxufTtcclxuXHJcblxyXG5cclxuZnVuY3Rpb24gc2VuZElucHV0KHRhcmdldFJlc3VsdHNSZWYsIGNyaXQpe1xyXG4gIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcclxuICBsZXQgcmV0b3VyPScnXHJcbiAgdGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MuZ2V0KCcvYXBpL3N0YW5kYXJkL3NlYXJjaCcsIHsgXHJcbiAgICAgICAgICBwYXJhbXM6IHsgXHJcbiAgICAgICAgICAgICBuOiBxdWVyeS52YWx1ZSxcclxuICAgICAgICAgICAgIHY6IHF1ZXJ5Mi52YWx1ZSxcclxuICAgICAgICAgICAgIG51bTogcXVlcnkzLnZhbHVlLFxyXG4gICAgICAgICAgICAgcjogcXVlcnk0LnZhbHVlLFxyXG4gICAgICAgICAgICAgbnVtcnVlOiBxdWVyeTUudmFsdWUsXHJcbiAgICAgICAgICAgICBjOiBjcml0XHJcbiAgICAgICAgICB9IFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBSZWRpcmVjdGlvbiBmb3Jjw6llIHZlcnMgbGEgcGFnZSBkZSBsb2dpblxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICB0YXJnZXRSZXN1bHRzUmVmLnZhbHVlID0gcmVzcG9uc2UuZGF0YTtcclxuICAgICAgICBpZih0YXJnZXRSZXN1bHRzUmVmLnZhbHVlIDwgMSl7Y291bnRlci52YWx1ZSA9IDA7fVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY291bnRlci52YWx1ZSA9IDA7XHJcbiAgICAgICAgdGFyZ2V0UmVzdWx0c1JlZi52YWx1ZSA9IFtdO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgIH1cclxuICB9LCAzMDApO1xyXG59XHJcblxyXG5cclxuY29uc3QgY291bnRJbnB1dCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldCgnL2FwaS9zdGFuZGFyZC9jb3VudCcsIHsgXHJcbiAgICAgICAgICBwYXJhbXM6IHsgXHJcbiAgICAgICAgICAgICBuOiBxdWVyeS52YWx1ZSxcclxuICAgICAgICAgICAgIHY6IHF1ZXJ5Mi52YWx1ZSxcclxuICAgICAgICAgICAgIG51bTogcXVlcnkzLnZhbHVlLFxyXG4gICAgICAgICAgICAgcjogcXVlcnk0LnZhbHVlLFxyXG4gICAgICAgICAgICAgbnVtcnVlOiBxdWVyeTUudmFsdWUsXHJcbiAgICAgICAgICB9IFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvdW50ZXIudmFsdWUgPSByZXNwb25zZS5kYXRhWzBdLmNvdW50O1xyXG4gICAgICAgIGlmKGNvdW50ZXIudmFsdWUgPiAwICYmIGNvdW50ZXIudmFsdWUgPCAzMDEpe1xyXG4gICAgICAgICAgIGVtaXQoJ3NlYXJjaC1zZWxlY3RlZCcsICduPScrcXVlcnkudmFsdWUrJyZ2PScrcXVlcnkyLnZhbHVlKycmbnVtPScrcXVlcnkzLnZhbHVlKycmcj0nK3F1ZXJ5NC52YWx1ZSsnJm51bXJ1ZT0nK3F1ZXJ5NS52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgfVxyXG59XHJcblxyXG4gICAgICAgIGNvbnN0IGNsZWFyRmlsdGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHRzLnZhbHVlID0gW107XHJcbiAgICAgICAgICAgIHJlc3VsdHMyLnZhbHVlID0gW107XHJcbiAgICAgICAgICAgIHJlc3VsdHMzLnZhbHVlID0gW107XHJcbiAgICAgICAgICAgIHJlc3VsdHM0LnZhbHVlID0gW107XHJcbiAgICAgICAgICAgIHJlc3VsdHM1LnZhbHVlID0gW107XHJcbiAgICAgICAgICAgIHF1ZXJ5LnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgIHF1ZXJ5Mi52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICBxdWVyeTMudmFsdWUgPSAnJztcclxuICAgICAgICAgICAgcXVlcnk0LnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgIHF1ZXJ5NS52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICBjb3VudGVyLnZhbHVlID0gMDtcclxuICAgICAgICAgICAgb3B0aW9ucy52YWx1ZSA9IFtdO1xyXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLnZhbHVlID0gW107XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyZXNlJylcclxuICAgICAgICAgICAgYnVzLmVtaXQoJ3Jlc2V0LXN0YW5kYXJkJywgJycpO1xyXG4gICAgICAgIH1cclxuYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShcclxuICAgIHJlc3BvbnNlID0+IHJlc3BvbnNlLCAvLyBTaSB0b3V0IHZhIGJpZW4sIG9uIG5lIGZhaXQgcmllblxyXG4gICAgZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vIFNpIGwnZXJyZXVyIGVzdCB1bmUgNDAxIChOb24gYXV0b3Jpc8OpKVxyXG4gICAgICAgIGlmIChlcnJvci5yZXNwb25zZSAmJiBlcnJvci5yZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG4gICAgfVxyXG4pO1xyXG5cclxuY29uc3Qgc2VsZWN0Tm9tID0gKG5vbSkgPT4ge1xyXG4gIHF1ZXJ5LnZhbHVlID0gbm9tO1xyXG4gIHJlc3VsdHMudmFsdWUgPSBbXTsgLy8gT24gY2FjaGUgbGEgbGlzdGUgYXByw6hzIHPDqWxlY3Rpb25cclxuICBjb3VudElucHV0KClcclxufTtcclxuXHJcbmNvbnN0IHNlbGVjdFZpbGxlID0gKHZpbGxlKSA9PiB7XHJcbiAgcXVlcnkyLnZhbHVlID0gdmlsbGU7XHJcbiAgcmVzdWx0czIudmFsdWUgPSBbXTsgLy8gT24gY2FjaGUgbGEgbGlzdGUgYXByw6hzIHPDqWxlY3Rpb25cclxuICBjb3VudElucHV0KClcclxufTtcclxuXHJcbmNvbnN0IHNlbGVjdE51bWVybyA9IChwb2ludCkgPT4ge1xyXG4gIHF1ZXJ5My52YWx1ZSA9IHBvaW50O1xyXG4gIHJlc3VsdHMzLnZhbHVlID0gW107IC8vIE9uIGNhY2hlIGxhIGxpc3RlIGFwcsOocyBzw6lsZWN0aW9uXHJcbiAgY291bnRJbnB1dCgpXHJcbn07XHJcblxyXG5jb25zdCBzZWxlY3RSdWUgPSAocnVlKSA9PiB7XHJcbiAgcXVlcnk0LnZhbHVlID0gcnVlO1xyXG4gIHJlc3VsdHM0LnZhbHVlID0gW107IC8vIE9uIGNhY2hlIGxhIGxpc3RlIGFwcsOocyBzw6lsZWN0aW9uXHJcbiAgY291bnRJbnB1dCgpXHJcbn07XHJcblxyXG5jb25zdCBzZWxlY3ROdW1SdWUgPSAobnVtcnVlKSA9PiB7XHJcbiAgcXVlcnk1LnZhbHVlID0gbnVtcnVlO1xyXG4gIHJlc3VsdHM1LnZhbHVlID0gW107IC8vIE9uIGNhY2hlIGxhIGxpc3RlIGFwcsOocyBzw6lsZWN0aW9uXHJcbiAgY291bnRJbnB1dCgpXHJcbn07XHJcblxyXG48L3NjcmlwdD5cclxuXHJcbjxzdHlsZT5cclxuLnN1Z2dlc3Rpb25zIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgdG9wOiAyNXB4O1xyXG4gIGJhY2tncm91bmQ6ICNmZmY7XHJcbiAgbGlzdC1zdHlsZTogbm9uZTtcclxuICBwYWRkaW5nOiAwO1xyXG4gIG1hcmdpbjogMDtcclxuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xyXG4gIG1heC1oZWlnaHQ6IDE1MHB4O1xyXG4gIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgei1pbmRleDogMTA7XHJcbiAgd2lkdGg6IGF1dG87XHJcbn1cclxuLnN1Z2dlc3Rpb25zIGxpIHtcclxuICBwYWRkaW5nOiA4cHg7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIGNvbG9yOiMwMDAwMDA7XHJcbn1cclxuLnN1Z2dlc3Rpb25zIGxpOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kOiAjZWVlO1xyXG59XHJcbi5oZWxwLXRleHQge1xyXG4gIGZvbnQtc2l6ZTogMC44ZW07XHJcbiAgY29sb3I6ICM2NjY7XHJcbn1cclxuRmxvYXRMYWJlbCAucC1pbnB1dHRleHQge21heC13aWR0aDogMjAwcHggIWltcG9ydGFudDt3aWR0aDogMjAwcHggIWltcG9ydGFudH1cclxuXHJcbjwvc3R5bGU+IiwiPHNjcmlwdCBzZXR1cD5cblxuaW1wb3J0IHsgY3JlYXRlQXBwLCByZWYsIG9uTW91bnRlZCwgb25CZWZvcmVVbm1vdW50LCBvblVubW91bnRlZCwgZ2V0Q3VycmVudEluc3RhbmNlLCBjb21wdXRlZH0gIGZyb20gJ3Z1ZSc7XG5cbmltcG9ydCB7IEZpbHRlck1hdGNoTW9kZSwgRmlsdGVyT3BlcmF0b3IgfSBmcm9tICdAcHJpbWV2dWUvY29yZS9hcGknO1xuXG5pbXBvcnQgeyBidXMgfSBmcm9tICcuLi9idXMuanMnOyBcbmltcG9ydCB7IEZ1bmN0aW9ucyB9IGZyb20gJy4vc2VydmljZS9GdW5jdGlvbnMnO1xuXG5pbXBvcnQgeyBWdWVEYXRlUGlja2VyIH0gZnJvbSAnQHZ1ZXBpYy92dWUtZGF0ZXBpY2tlcic7XG5pbXBvcnQgJ0B2dWVwaWMvdnVlLWRhdGVwaWNrZXIvZGlzdC9tYWluLmNzcydcblxuaW1wb3J0IFNlYXJjaFN0YW5kYXJkIGZyb20gJy4vU2VhcmNoU3RhbmRhcmQudnVlJztcblxuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJ3ByaW1ldnVlL3Byb2dyZXNzYmFyJztcbmltcG9ydCBEYXRhVGFibGUgZnJvbSAncHJpbWV2dWUvZGF0YXRhYmxlJztcbmltcG9ydCBDb2x1bW4gZnJvbSAncHJpbWV2dWUvY29sdW1uJztcbmltcG9ydCBDb2x1bW5Hcm91cCBmcm9tICdwcmltZXZ1ZS9jb2x1bW5ncm91cCc7ICAgXG5pbXBvcnQgUm93IGZyb20gJ3ByaW1ldnVlL3Jvdyc7ICAgICBcbmltcG9ydCBUb2dnbGVTd2l0Y2ggZnJvbSAncHJpbWV2dWUvdG9nZ2xlc3dpdGNoJztcblxuaW1wb3J0IFRvb2xiYXIgZnJvbSAncHJpbWV2dWUvdG9vbGJhcic7XG5pbXBvcnQgeyB1c2VUb2FzdCB9IGZyb20gJ3ByaW1ldnVlL3VzZXRvYXN0JztcblxuaW1wb3J0IElucHV0VGV4dCBmcm9tICdwcmltZXZ1ZS9pbnB1dHRleHQnO1xuaW1wb3J0IFNlbGVjdCBmcm9tICdwcmltZXZ1ZS9zZWxlY3QnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdwcmltZXZ1ZS9idXR0b24nO1xuaW1wb3J0IFRleHRhcmVhIGZyb20gJ3ByaW1ldnVlL3RleHRhcmVhJztcblxuaW1wb3J0IERpYWxvZyBmcm9tICdwcmltZXZ1ZS9kaWFsb2cnO1xuXG5pbXBvcnQgSWNvbkZpZWxkIGZyb20gJ3ByaW1ldnVlL2ljb25maWVsZCc7XG5pbXBvcnQgSW5wdXRJY29uIGZyb20gJ3ByaW1ldnVlL2lucHV0aWNvbic7XG5cbmltcG9ydCBDaGVja2JveCBmcm9tICdwcmltZXZ1ZS9jaGVja2JveCc7XG5pbXBvcnQgQ2hlY2tib3hHcm91cCBmcm9tICdwcmltZXZ1ZS9jaGVja2JveGdyb3VwJztcblxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gIHBhcmFtOiAge1xuICAgIHR5cGU6IE9iamVjdCwgXG4gICAgcmVxdWlyZWQ6IHRydWUgXG4gIH1cbn0pO1xuXG4gICAgICAgIGNvbnN0IGV0YXRzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IGxpc3RlYWdlbnRzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gcmVmKDMwMCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZV90ZW1wID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzX3R5cGVzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzVHlwZSA9IHJlZihbXSk7IFxuXG4gICAgICAgIGNvbnN0IHBvaW50cyA9IHJlZihbXSk7IC8vIExhIGxpc3RlIHNlcmEgY2hhcmfDqWUgZXQgbWlzZSDDoCBqb3VyIHZpYSBNZXJjdXJlL0FQSVxuICAgICAgICBjb25zdCBleHBhbmRlZFJvd3MgPSByZWYoW10pO1xuICAgICAgICBjb25zdCBtZXNzYWdldXIgPSByZWYoJycpO1xuICAgICAgICBjb25zdCBub21icmUgPSByZWYoKTtcbiAgICAgICAgY29uc3QgdG90YWwgPSByZWYoKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWYoKTtcbiAgICAgICAgY29uc3QgcG91cmNlbnQgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZVNNUz0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VFeGNlbD0gcmVmKCk7XG4gICAgICAgIC8vY29uc3Qgb3B0aW9ucyA9IHJlZihbXSk7XG4gICAgICAgIGxldCBzZWxlY3Rpb24gPSAwO1xuICAgICAgICBsZXQgc2VsID0gMDtcbiAgICAgICAgbGV0IHNlYXJjaCA9IDA7XG4gICAgICAgIGNvbnN0IG1hVmFsZXVyID0gcmVmKDApXG4gICAgICAgIGNvbnN0IHNob3dXaXRoUlYgPSByZWYodHJ1ZSk7XG4gICAgICAgIGxldCBzZWxlY3RlZCA9ICcnO1xuICAgICAgICBjb25zdCBtb2lzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHJlZigpO1xuICAgICAgICBjb25zdCBkYXRlID0gcmVmKG5ldyBEYXRlKCkpO1xuICAgICAgICBjb25zdCBjbHVzdGVySUQgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbG9hZGluZyA9cmVmKCk7XG4gICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBzZWFyY2hOb20gPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdGF0dXMgPSByZWYoJ1RvdXMnKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWIgPSByZWYoW10pO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaE51bWVyb1BoeXNpcXVlID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaE51bWVyb0NsaWVudCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hOb21SdWUgPSByZWYoJ1RvdXRlcycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoRGF0ZVJWID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFF1YXJ0aWVyID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNlYXJjaFZpbGxlID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaEV0YXQgPSByZWYoJ1RvdXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFRlbCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXIxID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXIyID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXIzID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXI0ID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXI1ID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaEVtcGxhY2VtZW50ID0gcmVmKCdUb3VzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hBZ2VudCA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoTGliZWxsZSA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2xvdFByb3BzID0gcmVmKCk7IFxuXG4gICAgICAgIGNvbnN0IGNsaWNrZWRSb3dJZCA9IHJlZihudWxsKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWJsZVBvaW50cyA9IHJlZihbXSk7IFxuICAgICAgICBjb25zdCBDb2xvcnMgPSByZWYoW10pOyBcblxuICAgICAgICBjb25zdCBleHBhbmRlZFJvd3NUYWIgPSByZWYoW10pO1xuICAgICAgICBjb25zdCB0b2FzdCA9IHVzZVRvYXN0KCk7XG4gICAgICAgIGNvbnN0IHByb2R1Y3REaWFsb2cgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBleGNlbERpYWxvZyA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IHByb2R1Y3QgPSByZWYoe30pO1xuICAgICAgICBjb25zdCBzdWJtaXR0ZWQgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlZigwKTtcbiAgICAgICAgY29uc3QgZGF0YUNyZW5lYXUgPSB7fTtcbiAgICAgICAgY29uc3QgZGF0ZUV4Y2VsID0ge307XG4gICAgICAgIGNvbnN0IGRhdGFDYXJ0ZSA9IHt9O1xuICAgICAgICBjb25zdCBmb3JtYXQgPSAoZGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpKzE7XG4gICAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICByZXR1cm4gYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3RzID0gcmVmKHt9KTtcbiAgICAgICAgY29uc3QgbWV0YUtleSA9IHJlZih0cnVlKTtcblxuY29uc3Qgc2VsZWN0ZWRTZWFyY2ggPSByZWYobnVsbCk7XG5cbmNvbnN0IGhhbmRsZVNlbGVjdGlvbiA9IChzZWFyY2gpID0+IHtcbiAgLy9jb25zb2xlLmxvZyhcIlNlYXJjaCByZcOndWUgZHUgY29tcG9zYW50IGVuZmFudCA6XCIsIHNlYXJjaCk7XG4gIHNlbGVjdGVkU2VhcmNoLnZhbHVlID0gc2VhcmNoO1xuICBmZXRjaFBvaW50cyhzZWFyY2gpXG5cbn07XG5cbi8vQ0VOVFJBTEUgREUgQ09NTVVOSUNBVElPTlxuICAgICAgICAvLyBGb25jdGlvbiBwb3VyIHLDqWN1cMOpcmVyIGxlcyBpbml0aWF1eCBkZXB1aXMgbCdBUEkgU3ltZm9ueVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZmV0Y2hQb2ludHMgKHNlYXJjaCl7ICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC8vIHlvdXIgb3B0aW9ucy4uLiBtZXRob2Q6IFBPU1QsIGhlYWRlcnMsIGNvcnMsIGV0Yy5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0ZS52YWx1ZSA9ICcnXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWIudmFsdWUgPSBbXTtcbiAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL3N0YW5kYXJkPycrc2VhcmNoLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdkYXRhLnN0YXR1cycrZGF0YS5zdGF0dXMpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZGlyZWN0aW9uIGZvcmPDqWUgdmVycyBsYSBwYWdlIGRlIGxvZ2luXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjaGFyZ2VtZW50IHBvaW50cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZSA9IGRhdGEucmVzcG9uc2UubWFwKHAgPT4gKHsgLi4ucCwgaXNFZGl0aW5nOiBmYWxzZSwgb3JpZ2luYWw6IHt9LCBzZWxlY3RlZDogZmFsc2UgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RJdGVtID0gcG9pbnRzLnZhbHVlLmZpbmQoeD0+eCE9PXVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlYXJjaCA+IDApe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IHNlYXJjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5maXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRQb2ludChwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5sb2coZXJyb3IpKSAvLyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggZXJyb3JcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBjaGFuZ2VfYWxlcnRlKHBvaW50KXsgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLy8geW91ciBvcHRpb25zLi4uIG1ldGhvZDogUE9TVCwgaGVhZGVycywgY29ycywgZXRjLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEZ1bmN0aW9ucy5tYWtlUmVxdWVzdCgnL2FwaS9wb2ludHMvYWxlcnRlLycrcG9pbnQuaWQrJy8nK3BvaW50LmFsZXJ0ZSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiBjb25zb2xlLmxvZyhlcnJvcikpIC8vIGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCBlcnJvclxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGdldEluZm9zKGRhdGEpeyAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRwb2ludHM6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0ZS52YWx1ZT0nJ1xuICAgICAgICAgICAgICAgIEZ1bmN0aW9ucy5tYWtlUmVxdWVzdCgnL2FwaS9wb2ludHMvZ2V0VjIvJywgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2RhdGEuc3RhdHVzJytkYXRhLnN0YXR1cylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlc3BvbnNlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXgyID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRJbmRleDIgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleDJdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleDMgPSBmaWx0ZXJlZFBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBlbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRQb2ludHMudmFsdWVbcG9pbnRJbmRleDNdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBmcm96ZW5Qb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gZWxlbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plblBvaW50cy52YWx1ZVtwb2ludEluZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNhcnRlLmNvdWxldXIgPSBlbGVtZW50LmNvdWxldXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNhcnRlLmNsdXN0ZXJJZCA9IGVsZW1lbnQuY2x1c3RlcjU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNhcnRlLm1pc3Npb24gPSBlbGVtZW50Lm1pc3Npb24uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NhcnRlLXJlZnJlc2gnLCBkYXRhQ2FydGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSBwcm9kdWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hpZGVEaWFsb2coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5sb2coZXJyb3IpKSAvLyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggZXJyb3JcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVNZXJjdXJlTWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7IFxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhgTWVyY3VyZSBtZXNzYWdlIHJlY2VpdmVkIDpgLCBkYXRhKTtcbiAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50LmFjdGlvbjtcbiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaF9jcmVuZWF1ID0gMDtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAvL21pc2Ugw6Agam91ciBkZXMgY2x1c3RlcnMgY29tcGxldFxuICAgICAgICAgICAgICAgICAgICBjYXNlICdjbHVzdGVyX2NvbXBsZXRlZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnY2x1c3RlcnNjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBlbGVtZW50LCAvLyBQYXNzIHlvdXIgZGF0YSBpbiB0aGUgJ2RldGFpbCcgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGVhZmxldG1hcCcpLmNvbnRlbnRXaW5kb3cuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwcm9kdWN0X3VwZGF0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmZvcyhlbGVtZW50LnBvaW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfY3JlbmVhdSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjcmVuZWF1X3VwZGF0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaF9jcmVuZWF1ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsVXBkYXRlKGVsZW1lbnQuZG9ubmVlcy5ub21icmUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYocmVmcmVzaF9jcmVuZWF1ID09IDEpe1xuICAgICAgICAgICAgICAgIGJ1cy5lbWl0KCdjcmVuZWF1LXVwZGF0ZWQnLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuLy8gSU5URVJGQUNFXG5cbiAgICAgICAgLy8gUHJvcHJpw6l0w6kgY2FsY3Vsw6llIHF1aSByZW52ZXJyYSBsYSBsaXN0ZSBmaWx0csOpZSDDoCBsYSBEYXRhVGFibGVcbiAgICAgICAgY29uc3QgZmlsdGVyZWRQb2ludHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT24gY29tbWVuY2UgYXZlYyB1bmUgY29waWUgZGUgdG91dGVzIGxlcyBkb25uw6llc1xuICAgICAgICAgICAgbGV0IHBvaW50c1RvRmlsdGVyID0gWy4uLnBvaW50cy52YWx1ZV07XG5cbiAgICAgICAgICAgIGNvdW50LnZhbHVlID0gcG9pbnRzVG9GaWx0ZXIubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIHBvaW50c1RvRmlsdGVyO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjbGVhckZpbHRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIHNlYXJjaE5vbS52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoRXRhdC52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaFF1YXJ0aWVyLnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgc2VhcmNoTGliZWxsZS52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaFRlbC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoVmlsbGUudmFsdWUgPSAnVG91dGVzJztcbiAgICAgICAgICAgIHNlYXJjaE5vbVJ1ZS52YWx1ZSA9ICdUb3V0ZXMnO1xuICAgICAgICAgICAgc2VhcmNoTnVtZXJvQ2xpZW50LnZhbHVlICA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoTnVtZXJvUGh5c2lxdWUudmFsdWUgID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hDbHVzdGVyMS52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoQ2x1c3RlcjIudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaENsdXN0ZXIzLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hDbHVzdGVyNC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoQ2x1c3RlcjUudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaENsdXN0ZXIudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaERhdGVSVi52YWx1ZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9vbiByZWNvaXQgdW4gbWVzc2FnZSBkZSBsZWFmbGV0XG4gICAgICAgIGNvbnN0IHVwZGF0ZUNsdXN0ZXIgPSAoY2x1c3RlclNlYXJjaCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJGaWx0ZXIoKTtcbiAgICAgICAgICAgIHZhciBzZWFyY2ggPSAnY2x1c3Rlcj0nK2NsdXN0ZXJTZWFyY2gudmFsdWU7XG4gICAgICAgICAgICBmZXRjaFBvaW50cyAoc2VhcmNoKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjbGljIHJlY2lldmVkJyArIGNsdXN0ZXJTZWFyY2gudHlwZSArJ2lkJysgKyBjbHVzdGVyU2VhcmNoLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb24gcsOpaW5pdGFsaXNlIGwnYWZmaWNoYWdlLCBvbiBsw6h2ZSBsZSBsb2NrXG4gICAgICAgIGNvbnN0IGdsb2JhbEV4dGVybmFsQ2FsbCA9IChjbHVzdGVyX2lkLCBzZWwpID0+IHtcbiAgICAgICAgICAgIC8vc2VuZExvY2sobnVsbCwgMik7XG4gICAgICAgICAgICBzZWFyY2ggPSBzZWw7XG4gICAgICAgICAgICBmZXRjaFBvaW50cyhjbHVzdGVyX2lkKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UG9pbnQgPSAoaWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzLnZhbHVlLmZpbmQocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAocG9pbnQpIHtcbiAgICAgICAgICAgICAgICBwb2ludC5vcmlnaW5hbCA9IHsgLi4ucG9pbnQgfTtcbiAgICAgICAgICAgICAgICBwb2ludC5pc0VkaXRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3BvaW50QycrcG9pbnQuaWQpO1xuICAgICAgICAgICAgICAgIGlmIChwb2ludC5jcmVuZWF1ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNyZW5lYXUgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQuY3JlbmVhdS5pZCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3NlbmRMb2NrKHBvaW50LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjYW5jZWxFZGl0ID0gKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgIGlmIChwb2ludEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XSA9IHsgLi4ucG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLm9yaWdpbmFsLCBpc0VkaXRpbmc6IGZhbHNlLCBvcmlnaW5hbDoge30gfTtcbiAgICAgICAgICAgICAgICAvL3NlbmRMb2NrKHBvaW50cy52YWx1ZVtwb2ludEluZGV4XSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc2VuZEluZm9zID0gYXN5bmMoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9wb2ludHMvdXBkYXRlVjIvJytpZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHByb2R1Y3QudmFsdWUuY29tbWVudGFpcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJsZTogcHJvZHVjdC52YWx1ZS5jb21wdGV1ckFjY2Vzc2libGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2l2aWxpdGU6IHByb2R1Y3QudmFsdWUuY2l2aWxpdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9tOiBwcm9kdWN0LnZhbHVlLm5vbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcm9DbGllbnQ6IHByb2R1Y3QudmFsdWUubnVtZXJvQ2xpZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbDE6IHByb2R1Y3QudmFsdWUudGVsMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWwyOiBwcm9kdWN0LnZhbHVlLnRlbDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IHByb2R1Y3QudmFsdWUuZW1haWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhdDogcHJvZHVjdC52YWx1ZS5ldGF0LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZW50OiBwcm9kdWN0LnZhbHVlLmFnZW50LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ01vZGlmaWNhdGlvbiBlbnZvecOpZSDDoCBTeW1mb255LiBBdHRlbnRlIGRlIGxhIG1pc2Ugw6Agam91ciBNZXJjdXJlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LmlzRWRpdGluZyA9IGZhbHNlOyAvLyBTb3J0aXIgZHUgbW9kZSDDqWRpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSBwcm9kdWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkdSBwcm9kdWl0OlwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0VycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZGUgbGEgZmljaGUgOiAnK2F3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgcsOpc2VhdSBsb3JzIGRlIGxhIHNhdXZlZ2FyZGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2VuZEV4Y2VsKCl7XG4gICAgICAgICAgICBoaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICBsZXQgY2hhaW5lID0gJyc7XG4gICAgICAgICAgICBmcm96ZW5Qb2ludHMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoYWluZSA9IGNoYWluZSArIGVsZW1lbnQuaWQgKyAnLCc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZmlsdGVyZWRQb2ludHMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoYWluZSA9IGNoYWluZSArIGVsZW1lbnQuaWQgKyAnLCc7XG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjaGFpbmUuc2xpY2UoMCwgLTEpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmZXRjaCgnL2FkbWluL2V4Y2VsL2V4cG9ydC8nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluZTogY2hhaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3Npb25faWQ6IHByb3BzLnBhcmFtLm1pc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYmxvYigpKS50aGVuKGRhdGEgPT4gd2luZG93Lm9wZW4oVVJMLmNyZWF0ZU9iamVjdFVSTChkYXRhKSkpXG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGV4Y2VsXCIpO1xuICAgICAgICAgICAgIH0gICBcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRMb2NrID0gYXN5bmMocG9pbnQsIGxvY2tpbmcpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbnZveWVyIGxlcyBtb2RpZmljYXRpb25zIMOgIGwnQVBJIFN5bWZvbnlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS9wb2ludHMvbG9ja2luZy9gK3BvaW50LmlkKycvJytsb2NraW5nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7fSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZHUgcHJvZHVpdDpcIiwgYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgcsOpc2VhdSBsb3JzIGRlIGxhIHNhdXZlZ2FyZGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlzdGFuY2VVcGRhdGUgPSAocG9pbnQsIGRpc3RhbmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBwb2ludCk7XG4gICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5vcGVyYXRpb24gPSBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0ub3BlcnRhaW9uLmlkO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LnBvaW50ID0gcG9pbnQ7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUuZGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5kYXRlID0gMDtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5hZ2VudCA9IHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5hZ2VudC5pZDtcbiAgICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS10b1VwZGF0ZScsIGRhdGFDcmVuZWF1KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhcnRlVXBkYXRlID0gKHBvaW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBwb2ludCk7XG4gICAgICAgICAgICAgICAgZGF0YUNhcnRlLmNsdXN0ZXJJZCA9IHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5jbHVzdGVyNTtcbiAgICAgICAgICAgICAgICBkYXRhQ2FydGUubWlzc2lvbiA9IHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5taXNzaW9uLmlkO1xuICAgICAgICAgICAgICAgIGRhdGFDYXJ0ZS5vcGVyYXRpb24gPSBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0ub3BlcnRhaW9uLmlkO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkYXRhQ2FydGUub3AnK2RhdGFDYXJ0ZS5vcGVyYXRpb24pXG5cbiAgICAgICAgICAgICAgICBidXMuZW1pdCgnY2FydGUtdG9VcGRhdGUnLCBkYXRhQ2FydGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxVcGRhdGUgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncmVjdW5vbWJyZScrZGF0YSk7XG4gICAgICAgICAgICAgICB2YWx1ZS52YWx1ZSA9IE1hdGgucm91bmQoZGF0YSoxMDAgLyB0b3RhbC52YWx1ZSk7XG4gICAgICAgICAgICAgICBub21icmUudmFsdWUgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBmdW5jdGlvbiBzZWxlY3RlZFBvaW50cygpIHtcbiAgICAgICAgICByZXR1cm4gcG9pbnRzLnZhbHVlLmZpbHRlcihwb2ludCA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHBvaW50LnNlbGVjdGVkKTtcbiAgICAgICAgICAgIHJldHVybiAocG9pbnQuc2VsZWN0ZWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHNlYXJjaERhdGVDcmVuZWF1KGlkKSB7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUucG9pbnQgPSBpZDtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5kaXN0YW5jZSA9ICdyZXNldCc7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUuZGF0ZSA9IGZvcm1hdERhdGUoZGF0ZS52YWx1ZSk7XG4gICAgICAgICAgICAgIGJ1cy5lbWl0KCdjcmVuZWF1LXRvVXBkYXRlJywgZGF0YUNyZW5lYXUpO1xuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiTGEgZGF0ZSBhIMOpdMOpIHPDqWxlY3Rpb25uw6llIDpcIiwgZm9ybWF0RGF0ZShkYXRlLnZhbHVlKSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZVRvRm9ybWF0KXtcbiAgICAgICAgICBpZiAoIWRhdGVUb0Zvcm1hdCkgcmV0dXJuICcnO1xuICAgICAgICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlVG9Gb3JtYXQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGVUb0Zvcm1hdC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTsgLy8gTGVzIG1vaXMgc29udCBpbmRleMOpcyDDoCBwYXJ0aXIgZGUgMFxuICAgICAgICAgIGNvbnN0IHllYXIgPSBkYXRlVG9Gb3JtYXQuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9uRHJvcCA9IGFzeW5jKGV2dCwgbGlzdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JRCA9IGV2dC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgnaXRlbUlEJylcbiAgICAgICAgICBjb25zdCBhZ2VudElEID0gZXZ0LmRhdGFUcmFuc2Zlci5nZXREYXRhKCdhZ2VudElEJylcbiAgICAgICAgICBjb25zdCB0b3RhbENyZW5lYXUgPSBldnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RvdGFsQ3JlbmVhdScpXG4gICAgICAgICAgaWYodG90YWxDcmVuZWF1ID49MzApe1xuICAgICAgICAgICAgaWYgKCF3aW5kb3cuY29uZmlybShcIkF0dGVudGlvbiwgbWF4IDMwIHBhciBjcsOpbmVhdSBob3JhaXJlIDogc291aGFpdGV6IHZvdXMgY29uZmlybWVyID9cIikpe3JldHVybjt9XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBjb25maXJtID0gMDtcbiAgICAgICAgICBzZWxlY3RlZCA9ICdcInNlbGVjdGVkXCIgOiBbJztcbiAgICAgICAgICBpZihmcm96ZW5Qb2ludHMudmFsdWUubGVuZ3RoID09IDApe2FsZXJ0KCdNZXJjaSBkZSBzw6lsZWN0aW9ubmVyIGF1IG1vaW5zIHVuIHBvaW50Jyk7cmV0dXJuO31cbiAgICAgICAgICBmcm96ZW5Qb2ludHMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgc2VsZWN0ZWQgPSBzZWxlY3RlZCArIGVsZW1lbnQuaWQgKyBcIixcIjtcbiAgICAgICAgICAgIGlmKGVsZW1lbnQuYWdlbnQuaWQgIT0gYWdlbnRJRCl7Y29uZmlybSA9IDE7fVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWQuc2xpY2UoMCwgLTEpICsgJ10nO1xuICAgICAgICAgIHNlbGVjdGVkID0gJ3tcImlkXCI6JysgaXRlbUlEICsgJywnICsgc2VsZWN0ZWQgKyd9JztcbiAgICAgICAgICBpZihjb25maXJtID09IDEpe1xuICAgICAgICAgICAgaWYgKCF3aW5kb3cuY29uZmlybShcIkF0dGVudGlvbiwgYWdlbnRzIGRpZmbDqXJlbnRzIDogc291aGFpdGV6IHZvdXMgY29uZmlybWVyID9cIikpe3JldHVybjt9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vY29uc29sZS5sb2coJ3NlbGVjdGVkJyArIHNlbGVjdGVkKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbnZveWVyIGxlcyBtb2RpZmljYXRpb25zIMOgIGwnQVBJIFN5bWZvbnlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS9wb2ludHMvY3JlbmVhdS91cGRhdGUvYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciByw6lzZWF1IHVwZGF0ZSBjZXJlbmF1IDpcIiwgYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIHLDqXNlYXUgdXBkYXRlIGNlcmVuYXVcIik7XG4gICAgICAgICAgICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9yZXNldCBkZXMgZnJvemVuXG4gICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlPVtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VuZFRlbCA9IGFzeW5jKHBvaW50LCB0ZWwpID0+IHtcbiAgICAgICAgICAgICAgICBpZih0ZWwubGVuZ3RoID09IDkpe3RlbCA9ICcwJyArIHRlbDt9XG4gICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oJ3RlbDonK3RlbCwgJ19ibGFuaycpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdGVsLycrcG9pbnQuaWQrJy9zZW5kJywge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvL21lc3NhZ2V1cj0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJhbnRUZWwgPSBhc3luYyhwb2ludCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdGVsLycrcG9pbnQuaWQrJy9lbnRyYW50Jywge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnVGVsIGVudHJhbnQgZW5yZWdpc3Ryw6knO1xuICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VuZFNNUyA9IGFzeW5jKHBvaW50LCB0ZWwpID0+IHtcbiAgICAgICAgICAgICAgICBpZih0ZWwubGVuZ3RoID09IDkpe3RlbCA9ICcwJyArIHRlbDt9XG4gICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSBtZXNzYWdlcy52YWx1ZS5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnR5cGUgPT09IDJcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgbWVzc2FnZXRlbXAudmFsdWUgPSBtZXNzYWdlLnZhbHVlWzBdLnRleHRlLnJlcGxhY2UoXCJOT01cIiwgcG9pbnQuY2l2aWxpdGUrJyAnK3BvaW50Lm5vbSk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXRlbXAudmFsdWUgPSBtZXNzYWdldGVtcC52YWx1ZS5yZXBsYWNlKFwiQURSRVNTRVwiLCBwb2ludC5udW1lcm9SdWUrJyAnKyBwb2ludC50aXRyZVJ1ZSsnICcrcG9pbnQubm9tUnVlKycgJytwb2ludC5jb2RlUG9zdGFsKycgJytwb2ludC52aWxsZSk7XG4gICAgICAgICAgICAgICAgbGV0IGxpZW4gPSAgJ2h0dHBzOi8vJyt3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUrJy9lYWUvY29ubmVjdC8nK29wZXJhdGlvbklELnZhbHVlKycvJytwb2ludC5pZDtcbiAgICAgICAgICAgICAgICBtZXNzYWdldGVtcC52YWx1ZSA9IG1lc3NhZ2V0ZW1wLnZhbHVlLnJlcGxhY2UoXCJMSUVOXCIsIGxpZW4pO1xuICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUpe1xuICAgICAgICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXRlbXAudmFsdWUgPSBtZXNzYWdldGVtcC52YWx1ZS5yZXBsYWNlKFwiREFURVwiLCBwb2ludC5jcmVuZWF1LmRhdGUrJyAnKyBwb2ludC5jcmVuZWF1LmNyZW5lYXVIb3JhaXJlLm5vbSArJyBBZ2VudCA6ICcrcG9pbnQuY3JlbmVhdS5hZ2VudC5ub20pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBlbmNvZGVkVGV4dCA9IGVuY29kZVVSSUNvbXBvbmVudChtZXNzYWdldGVtcC52YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAvKiovXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9zbXMvJytwb2ludC5pZCsnLycrbWVzc2FnZS52YWx1ZVswXS5pZCsnL3NlbmQnLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgLy8gbWVzc2FnZXVyPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZW5kRW1haWwgPSBhc3luYyhpZCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS52YWx1ZSA9IG1lc3NhZ2VzLnZhbHVlLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQudHlwZSA9PT0gMlxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL21haWwvJytpZCsnLycrbWVzc2FnZS52YWx1ZVswXS5pZCsnL21haWxzZW5kJywge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHttZXNzYWdldXIudmFsdWUgPSBcIkVycmV1ciBlbnZvaSBtYWlsXCI7fVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSBkYXRhLmRhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIHLDqXNlYXVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJldXIgcsOpc2VhdVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlbGV0ZV9sb2c9IGFzeW5jKGlkKSA9PiB7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9sb2cvZGVsZXRlLycraWQsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7bWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgZW52b2kgZGVsZXRlXCI7fVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnZGVsZXRlIG9rJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciByw6lzZWF1XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93Q2xhc3MgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7ICdjdXN0b20tZnJvemVuLXJvdyc6IGRhdGEuZnJvemVuIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2hlY2tUZWwgPSAodGVsKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCd0ZWwnK3RlbClcbiAgICAgICAgICAgICAgaWYgKCF0ZWwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSAvXig2fDA2fDd8MDcpLzsgXG4gICAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KFN0cmluZyh0ZWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlZGlyZWN0ID0gKG9wSWQsaWQpID0+IHtcbiAgICAgICAgICAgIHdpbmRvdy50b3AubG9jYXRpb24uaHJlZj1cIi9hZG1pbi9jYXJ0ZS8xL1wiK29wSWQrJy8nK2lkO1xuICAgICAgICB9XG5cbi8vbGVzIHBvaW50cyBzw6lsZWN0aW9ubsOpc1xuXG4vL0VWRU5UIElOVEVSRkFDRSAgXG4gICAgICAgIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyZWRQb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvLyBPbiB2w6lyaWZpZSBzaSBjaGFxdWUgcHJvZHVpdCBkZSBsYSBsaXN0ZSBhIHNhIGNsw6kgw6AgJ3RydWUnIGRhbnMgbCdvYmpldCBkZSBzw6lsZWN0aW9uXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRQb2ludHMudmFsdWUuZXZlcnkocCA9PiBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlW3AuaWRdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdG9nZ2xlQWxsID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbHRlcmVkUG9pbnRzLnZhbHVlLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgYWxlcnQoXCJJbXBvc3NpYmxlIGRlIHRvdXQgc8OpbGVjdGlvbm5lciA6IHRyb3AgZGUgcsOpc3VsdGF0cyAoPjEwKS5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzQWxsU2VsZWN0ZWQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlID0ge307XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNpbm9uIC0+IG9uIGNvbnN0cnVpdCB1biBvYmpldCBhdmVjIHRvdXMgbGVzIElEcyAoU8OpbGVjdGlvbiB0b3RhbGUpXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0ge307XG4gICAgICAgICAgICAgICAgZmlsdGVyZWRQb2ludHMudmFsdWUuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbmV3U2VsZWN0aW9uW3AuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlID0gbmV3U2VsZWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRvZ2dsZVJvdyA9IChwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHByb2R1Y3QuaWQ7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gISFzZWxlY3RlZFByb2R1Y3RzLnZhbHVlW2lkXTtcblxuXG4gICAgICAgICAgICAvLyBDcsOpYXRpb24gZCd1bmUgY29waWUgcG91ciBsYSByw6lhY3Rpdml0w6lcbiAgICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHsgLi4uc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZSB9O1xuXG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdTZWxlY3Rpb25baWRdOyAvLyBPbiByZXRpcmUgbGEgY2zDqVxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVGFiLnZhbHVlW2lkXSA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdTZWxlY3Rpb25baWRdID0gdHJ1ZTsgLy8gT24gYWpvdXRlIGxhIGNsw6lcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRhYi52YWx1ZVtpZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlID0gbmV3U2VsZWN0aW9uO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGZyb3plblBvaW50cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFBvaW50cy52YWx1ZS5maWx0ZXIocCA9PiBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlW3AuaWRdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdW5zZWxlY3RlZFBvaW50cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFBvaW50cy52YWx1ZS5maWx0ZXIocCA9PiAhc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZVtwLmlkXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG9uUm93RXhwYW5kID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBleHBhbmRlZFJvd3MudmFsdWUgPSB7IFtldmVudC5kYXRhLmlkXTogdHJ1ZSB9O1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGVwbG95IGlkJyArIGV2ZW50LmRhdGEuaWQpXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGVkaXRQcm9kdWN0ID0gKHByb2QpID0+IHtcbiAgICAgICAgICAgIHByb2R1Y3QudmFsdWUgPSB7Li4ucHJvZH07XG4gICAgICAgICAgICBwcm9kdWN0RGlhbG9nLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXhwb3J0RXhjZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICBleGNlbERpYWxvZy52YWx1ZSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhpZGVEaWFsb2cgPSAoKSA9PiB7XG4gICAgICAgICAgICBleGNlbERpYWxvZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgcHJvZHVjdERpYWxvZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgc3VibWl0dGVkLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIH07XG5cbi8vREVNQVJSQUdFXG4gICAgICAgIG9uTW91bnRlZCgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChcImh0dHBzOi8vYWQxMWM2MDAtZWY0YS00ODE1LWEzZGMtYTMyNjgyNzQ1YTE0Lm1lcmN1cmUucm9ja3MvLndlbGwta25vd24vbWVyY3VyZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcInRvcGljXCIsIFwiL2NhcnRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gaGFuZGxlTWVyY3VyZU1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignY2FydGUnLCBoYW5kbGVNZXJjdXJlTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgRXZlbnRTb3VyY2U6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1vaXMudmFsdWUgPSBwcm9wcy5wYXJhbS5tb2lzO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbC52YWx1ZSA9IHByb3BzLnBhcmFtLnRvdGFsO1xuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGUudmFsdWUgPSBwcm9wcy5wYXJhbS5zdGFydERhdGU7XG4gICAgICAgICAgICAgICAgICAgIG5vbWJyZS52YWx1ZSA9IHByb3BzLnBhcmFtLm5vbWJyZTtcbiAgICAgICAgICAgICAgICAgICAgdG90YWwudmFsdWUgPSBwcm9wcy5wYXJhbS50b3RhbDtcbiAgICAgICAgICAgICAgICAgICAgcG91cmNlbnQudmFsdWUgPSBNYXRoLnJvdW5kKHByb3BzLnBhcmFtLm5vbWJyZSoxMDAgLyBwcm9wcy5wYXJhbS50b3RhbCk7XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJJRC52YWx1ZSA9IHByb3BzLnBhcmFtLmNsdXN0ZXJJZDtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVNNUy52YWx1ZSA9IHByb3BzLnBhcmFtLm1lc3NhZ2VTTVM7XG4gICAgICAgICAgICAgICAgICAgIGV0YXRzLnZhbHVlID0gcHJvcHMucGFyYW0uZXRhdHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdldGF0cycrZXRhdHMudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIGxpc3RlYWdlbnRzLnZhbHVlID0gcHJvcHMucGFyYW0uYWdlbnRzO1xuICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZS52YWx1ZSA9IHByb3BzLnBhcmFtLmRpc3RhbmNlO1xuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnZhbHVlID0gcHJvcHMucGFyYW0ubWVzc2FnZXM7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzX3R5cGVzLnZhbHVlID0gcHJvcHMubWVzc2FnZXNfdHlwZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgYnVzLm9uKCdjbHVzdGVyLXNlbGVjdGVkJywgdXBkYXRlQ2x1c3Rlcik7XG4gICAgICAgICAgICAgICAgICAgIGJ1cy5vbigncmVzZXQtc3RhbmRhcmQnLCByZXNldERhdGEpO1xuICAgICAgICAgICAgICAgICAgICAvL2ZldGNoUG9pbnRzKGNsdXN0ZXJJRC52YWx1ZSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGV2ZW50U291cmNlID0gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGZ1bmN0aW9uIHJlc2V0RGF0YSgpe1xuICAgICAgICAgICAgcG9pbnRzLnZhbHVlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBvblVubW91bnRlZCgoKSA9PiB7XG5cbiAgICAgICAgICAgIGJ1cy5vZmYoJ2NsdXN0ZXItc2VsZWN0ZWQnLCB1cGRhdGVDbHVzdGVyKTtcbiAgICAgICAgICAgIGJ1cy5vZmYoJ3Jlc2V0LXN0YW5kYXJkJywgcmVzZXREYXRhKTtcbiAgICAgICAgICAgIGlmIChvYnNlcnZlcikgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgb25CZWZvcmVVbm1vdW50KCgpID0+IHtcbiAgICAgICAgICBidXMub2ZmKCdjbHVzdGVyLXNlbGVjdGVkJyk7XG4gICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbjwvc2NyaXB0PlxuPHRlbXBsYXRlPlxuICAgICAgICA8ZGl2IGlkPVwicG9pbnRzXCIgQGRyb3A9XCJvbkRyb3AoJGV2ZW50LCAxKVwiIEBkcmFnb3Zlci5wcmV2ZW50IEBkcmFnZW50ZXIucHJldmVudCBzdHlsZT1cImhlaWdodDogY2FsYygxMDB2aCAtIDUwMHB4KTtcIiB0YWJsZVN0eWxlPVwibWF4LXdpZHRoOiAxMjAwcHhcIj5cbiAgICAgICAgICAgIDxEYXRhVGFibGUgXG4gICAgICAgICAgICA6dmFsdWU9XCJwb2ludHNcIiBcbiAgICAgICAgICAgIHYtbW9kZWw6ZXhwYW5kZWRSb3dzPVwiZXhwYW5kZWRSb3dzXCIgXG4gICAgICAgICAgICBAcm93RXhwYW5kPVwib25Sb3dFeHBhbmRcIlxuICAgICAgICAgICAgc2Nyb2xsYWJsZSBcbiAgICAgICAgICAgIHNjcm9sbEhlaWdodD1cImZsZXhcIlxuICAgICAgICAgICAgcGFnaW5hdG9yIDpyb3dzPVwiMTAwXCIgXG4gICAgICAgICAgICBkYXRhS2V5PVwiaWRcIiBcbiAgICAgICAgICAgIGZpbHRlckRpc3BsYXk9XCJyb3dcIiBcbiAgICAgICAgICAgIDpsb2FkaW5nPVwibG9hZGluZ1wiXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgOnJvdy1jbGFzcz1cInJvd0NsYXNzXCIgXG4gICAgICAgICAgICA6Y2xhc3M9XCJ7ICdoaWRlLXNlbGVjdC1hbGwnOiBmaWx0ZXJlZFBvaW50cy5sZW5ndGggPiAxMCB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInBhbmVsc2VhcmNoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImhlYWRlci1hcHBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWFyY2hTdGFuZGFyZCBAc2VhcmNoLXNlbGVjdGVkPVwiaGFuZGxlU2VsZWN0aW9uXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiBcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2xvYWRpbmc+IExvYWRpbmcgLiA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJpZFwiIGhlYWRlcj1cIklEXCIgIGhlYWRlclN0eWxlPVwid2lkdGg6IDIwcHhcIi8+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBleHBhbmRlciAgaGVhZGVyU3R5bGU9XCJ3aWR0aDogMjBweFwiIC8+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBoZWFkZXJTdHlsZT1cIndpZHRoOiAyMHB4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cInRvZ2dsZUFsbFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzPVwieyAnZGlzYWJsZWQtd3JhcHBlcic6IGZpbHRlcmVkUG9pbnRzLmxlbmd0aCA+IDEwIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG91dCBzw6lsZWN0aW9ubmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hlY2tib3ggXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptb2RlbFZhbHVlPVwiaXNBbGxTZWxlY3RlZFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6YmluYXJ5PVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJmaWx0ZXJlZFBvaW50cy5sZW5ndGggPiAxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmU7XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cInRvZ2dsZVJvdyhkYXRhKVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtd3JhcHBlclwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO21heC13aWR0aDogMjBweCAhaW1wb3J0YW50O1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bW9kZWxWYWx1ZT1cIiEhc2VsZWN0ZWRQcm9kdWN0c1tkYXRhLmlkXVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6YmluYXJ5PVwidHJ1ZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lO1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwib3BlcmF0aW9uXCIgaGVhZGVyPVwiT3BcIiBoZWFkZXJTdHlsZT1cIndpZHRoOiA1MHB4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBAY2xpY2s9XCJyZWRpcmVjdChkYXRhLm9wZXJ0YWlvbi5pZCxkYXRhLm1pc3Npb24uaWQpXCIgY2xhc3M9XCJsaW5rXCI+e3sgZGF0YS5taXNzaW9uLm5vbSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gICBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwibm9tXCIgIGhlYWRlcj1cIk5vbVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVwieyAnZm9udC1ibHVlJzogc2VsZWN0ZWRUYWJbZGF0YS5pZF0gPT0gdHJ1ZSB9XCI+e3sgZGF0YS5jaXZpbGl0ZSB9fSB7eyBkYXRhLm5vbSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gICAgICAgICBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwiYWxlcnRlXCIgc3R5bGU9XCJtaW4td2lkdGg6IDNyZW1cIiBoZWFkZXI9XCJBbGVydGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUb2dnbGVTd2l0Y2ggdi1tb2RlbD1cImRhdGEuYWxlcnRlXCIgQGNoYW5nZT1cImNoYW5nZV9hbGVydGUoZGF0YSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm51bWVyb0NsaWVudFwiIGhlYWRlcj1cIk7CsCBDbGllbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLm51bWVyb0NsaWVudCB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibnVtZXJvUGh5c2lxdWVcIiBoZWFkZXI9XCJOwrAgQ29tcHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLm51bWVyb1BoeXNpcXVlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+IFxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbHM9XCJ0ZWwwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDgwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRudGVsMlwiIEBjbGljaz1cImVudHJhbnRUZWwoZGF0YSlcIj48c3BhbiBjbGFzcz1cInBpIHBpLXBob25lXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj48L3NwYW4+PC9idXR0b24+PGJyPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgRW50cmFudFxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbHM9XCJ0ZWxcIiBzdHlsZT1cIm1pbi13aWR0aDogMTJyZW1cIiBoZWFkZXI9XCJUZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEudGVsMVwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm8gYnRudGVsXCIgQGNsaWNrPVwic2VuZFRlbChkYXRhLGRhdGEudGVsMSlcIj48c3BhbiBjbGFzcz1cInBpIHBpLXBob25lXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj48L3NwYW4+Jm5ic3A7VEVMIHt7IGRhdGEudGVsMSB9fTwvYnV0dG9uPjwvc3Bhbj48YnI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLnRlbDJcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvIGJ0bnRlbFwiIEBjbGljaz1cInNlbmRUZWwoZGF0YSxkYXRhLnRlbDIpXCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1waG9uZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwO1RFTCB7eyBkYXRhLnRlbDIgfX08L2J1dHRvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiAgZmllbGQ9XCJldGF0XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmV0YXQgJiYgZGF0YS5ldGF0LmlkXCIgOnN0eWxlPVwieyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzJweCA4cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkICNjY2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTYwcHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZmZmJywgLyogQ291bGV1ciBkZSB0ZXh0ZSBibGFuY2hlIHBvdXIgdW4gbWVpbGxldXIgY29udHJhc3RlICovXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRhdGEuZXRhdC5jb3VsZXVyIFxuICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuZXRhdC5ub20gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImVtcGxhY2VtZW50Q29tcHRldXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLmVtcGxhY2VtZW50Q29tcHRldXIgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIEVtcGxhY2VtZW50XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm1vZHVsZVNldWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5tb2R1bGVTZXVsXCI+TW9kdWxlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cIiFkYXRhLm1vZHVsZVNldWxcIj5Db21wdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBzdHlsZT1cIndpZHRoOiA0MHB4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInNsb3RQcm9wc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpY29uPVwicGkgcGktcGVuY2lsXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgcm91bmRlZCBjbGFzcz1cIm1yLTJcIiBAY2xpY2s9XCJkaXN0YW5jZVVwZGF0ZShzbG90UHJvcHMuZGF0YS5pZCwgNTAwKVwiPjUwMG08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibm9tUnVlXCIgaGVhZGVyPVwiUnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5udW1lcm9SdWUgfX0ge3sgZGF0YS50aXRyZVJ1ZSAgfX0ge3sgZGF0YS5ub21SdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwidmlsbGVcIiBoZWFkZXI9XCJWaWxsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuY29kZVBvc3RhbCB9fSB7eyBkYXRhLnZpbGxlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImFnZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEuYWdlbnRcIj57eyBkYXRhLmFnZW50Lm5vbSB9fSA8c3BhbiB2LWlmPVwiZGF0YS5hZ2VudC5wcmVub21cIj57eyBkYXRhLmFnZW50LnByZW5vbSB9fTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImRhdGVSVlwiIHN0eWxlPVwibWluLXdpZHRoOiAxNTBweFwiIGhlYWRlcj1cIkRhdGUgUlZcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmNyZW5lYXVcIj57eyBkYXRhLmNyZW5lYXUuZGF0ZSB9fSB7eyBkYXRhLmNyZW5lYXUuY3JlbmVhdUhvcmFpcmUubm9tIH19PGJyPkFnZW50IDoge3sgZGF0YS5jcmVuZWF1LmFnZW50Lm5vbSB9fSA8c3BhbiB2LWlmPVwiZGF0YS5jcmVuZWF1LmFnZW50LnByZW5vbVwiPnt7IGRhdGEuY3JlbmVhdS5hZ2VudC5wcmVub20gfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgICA8Q29sdW1uIGhlYWRlcj1cIkVkaXRcIiBzdHlsZT1cIndpZHRoOiA1MHB4XCI+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwic2xvdFByb3BzXCI+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBpY29uPVwicGkgcGktcGVuY2lsXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgcm91bmRlZCBjbGFzcz1cIm1yLTJcIiBAY2xpY2s9XCJlZGl0UHJvZHVjdChzbG90UHJvcHMuZGF0YSlcIj5FZGl0PC9CdXR0b24+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2V4cGFuc2lvbj1cInNsb3RQcm9wc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiA4MDBweDtcIj5DcsOpbmVhdXggOiA8YnV0dG9uIEBjbGljaz1cImRpc3RhbmNlVXBkYXRlKHNsb3RQcm9wcy5kYXRhLmlkLCA1MClcIiBjbGFzcz1cIm1iLTEwXCI+NTAgbTwvYnV0dG9uPiZuYnNwOyZuYnNwOzxidXR0b24gQGNsaWNrPVwiZGlzdGFuY2VVcGRhdGUoc2xvdFByb3BzLmRhdGEuaWQsIDIwMClcIiBjbGFzcz1cIm1iLTEwXCI+MjAwIG08L2J1dHRvbj4mbmJzcDsmbmJzcDs8YnV0dG9uIEBjbGljaz1cImRpc3RhbmNlVXBkYXRlKHNsb3RQcm9wcy5kYXRhLmlkLCA1MDApXCIgY2xhc3M9XCJtYi0xMFwiPjUwMCBtPC9idXR0b24+Jm5ic3A7Jm5ic3A7PGJ1dHRvbiBAY2xpY2s9XCJkaXN0YW5jZVVwZGF0ZShzbG90UHJvcHMuZGF0YS5pZCAsICdyZXNldCcpXCIgY2xhc3M9XCJtYi0xMFwiPlRvdXM8L2J1dHRvbj4mbmJzcDsmbmJzcDs8dnVlLWRhdGUtcGlja2VyIHYtbW9kZWw9XCJkYXRlXCIgIHBsYWNlaG9sZGVyPVwiRGF0ZVwiIDp0ZWxlcG9ydD1cInRydWVcIiA6c3RhcnQtZGF0ZT1cInN0YXJ0RGF0ZVwiIGF1dG8tYXBwbHkgQHVwZGF0ZTptb2RlbC12YWx1ZT1cInNlYXJjaERhdGVDcmVuZWF1KHNsb3RQcm9wcy5kYXRhLmlkKVwiPjwvdnVlLWRhdGUtcGlja2VyPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImluZm9zVGFic1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mb3NUYWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Q29tbWVudGFpcmU8L3A+PEJ1dHRvbiBpY29uPVwicGkgcGktcGVuY2lsXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgcm91bmRlZCBjbGFzcz1cIm1yLTIgdG9wLXJpZ2h0XCIgQGNsaWNrPVwiZWRpdFByb2R1Y3Qoc2xvdFByb3BzLmRhdGEpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICBzbG90UHJvcHMuZGF0YS5jb21tZW50YWlyZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mb3NUYWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SGlzdG9yaXF1ZTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTttYXgtd2lkdGg6IDQwMHB4O3BhZGRpbmc6IDJweCAhaW1wb3J0YW50O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHYtZm9yPVwibG9nIGluIHNsb3RQcm9wcy5kYXRhLmxvZ3BvaW50c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBsb2cuZGF0ZWNyZWEgfX08L3RkPjx0ZD57eyBsb2cuYWN0aW9uLm5vbSB9fTwvdGQ+PHRkPnt7IGxvZy5jb21tZW50YWlyZSB9fTwvdGQ+PHRkPjxzcGFuIGNsYXNzPVwicC1idXR0b24taWNvbiBwaSBwaS10cmFzaFwiIGRhdGEtcD1cImxlZnRcIiBkYXRhLXBjLXNlY3Rpb249XCJpY29uXCIgQGNsaWNrPVwiZGVsZXRlX2xvZyhsb2cuaWQpXCI+PC9zcGFuPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mb3NUYWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+RXRhdHM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7bWF4LXdpZHRoOiA0MDBweDtwYWRkaW5nOiAycHggIWltcG9ydGFudDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2LWZvcj1cImxvZyBpbiBzbG90UHJvcHMuZGF0YS5sb2dldGF0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBsb2cuZGF0ZWNyZWEgfX08L3RkPjx0ZD57eyBsb2cuZXRhdC5ub20gfX08L3RkPjx0ZD57eyBsb2cuY29tbWVudGFpcmUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICA8L0RhdGFUYWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPERpYWxvZyB2LW1vZGVsOnZpc2libGU9XCJwcm9kdWN0RGlhbG9nXCIgOnN0eWxlPVwieyB3aWR0aDogJzQ1MHB4JyB9XCIgaGVhZGVyPVwiRMOpdGFpbHMgZHUgcG9pbnRcIiA6bW9kYWw9XCJ0cnVlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNlwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJudW1lcm9DbGllbnRcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+TnVtw6lybyBDbGllbnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwibnVtZXJvQ2xpZW50XCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5udW1lcm9DbGllbnRcIiByZXF1aXJlZD1cInRydWVcIiBhdXRvZm9jdXMgOmludmFsaWQ9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QubnVtZXJvQ2xpZW50XCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHYtaWY9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QubnVtZXJvQ2xpZW50XCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDBcIj5OdW3DqXJvIENsaWVudCByZXF1aXMuPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY29tcHRldXJBY2Nlc3NpYmxlXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkFjY2Vzc2libGU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImNvbXB0ZXVyQWNjZXNzaWJsZVwiIHYtbW9kZWw9XCJwcm9kdWN0LmNvbXB0ZXVyQWNjZXNzaWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gOnZhbHVlPVwidHJ1ZVwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogZ3JlZW5cIj5PdWk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIDp2YWx1ZT1cImZhbHNlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiByZWRcIj5Ob248L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PiBcbiAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV0YXRcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+Q2hhbmdlciBsJ8OpdGF0PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdCB2LW1vZGVsPVwicHJvZHVjdC5ldGF0XCIgOm9wdGlvbnM9XCJldGF0c1wiIG9wdGlvbkxhYmVsPVwibm9tXCIgIDppbml0aWFsVmFsdWVzPVwicHJvZHVjdC5ldGF0LmlkXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3Rpb25uZXIgdW4gw6l0YXRcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PiAgIFxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjaXZpbGl0ZVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5DaXZpbGl0w6k8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwiY2l2aWxpdGVcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0LmNpdmlsaXRlXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgYXV0b2ZvY3VzIDppbnZhbGlkPVwic3VibWl0dGVkICYmICFwcm9kdWN0LmNpdmlsaXRlXCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHYtaWY9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QuY2l2aWxpdGVcIiBjbGFzcz1cInRleHQtcmVkLTUwMFwiPkNpdmlsaXTDqSByZXF1aXNlLjwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+Tm9tPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cIm5hbWVcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0Lm5vbVwiIHJlcXVpcmVkPVwidHJ1ZVwiIGF1dG9mb2N1cyA6aW52YWxpZD1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5ub21cIiBmbHVpZCAvPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgdi1pZj1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5ub21cIiBjbGFzcz1cInRleHQtcmVkLTUwMFwiPk5vbSByZXF1aXMuPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGVsMVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5UZWwgMTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJ0ZWwxXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC50ZWwxXCIgcmVxdWlyZWQ9XCJmYWxzZVwiIGF1dG9mb2N1cyBmbHVpZCAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0ZWwyXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPlRlbCAyPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cInRlbDJcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0LnRlbDJcIiByZXF1aXJlZD1cImZhbHNlXCIgYXV0b2ZvY3VzIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkVtYWlsPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cImVtYWlsXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5lbWFpbFwiIHJlcXVpcmVkPVwiZmFsc2VcIiBhdXRvZm9jdXMgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY29tbWVudGFpcmVcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+Q29tbWVudGFpcmU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8VGV4dGFyZWEgaWQ9XCJjb21tZW50YWlyZVwiIHYtbW9kZWw9XCJwcm9kdWN0LmNvbW1lbnRhaXJlXCIgcmVxdWlyZWQ9XCJmYWxzZVwiIHJvd3M9XCIzXCIgY29scz1cIjIwXCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHRlbXBsYXRlICNmb290ZXI+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIkFubnVsZXJcIiBpY29uPVwicGkgcGktdGltZXNcIiB0ZXh0IEBjbGljaz1cImhpZGVEaWFsb2dcIiAvPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJTYXV2ZXJcIiBpY29uPVwicGkgcGktY2hlY2tcIiBAY2xpY2s9XCJzZW5kSW5mb3MocHJvZHVjdC5pZClcIiAvPlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9EaWFsb2c+XG4gICAgICAgIDxEaWFsb2cgdi1tb2RlbDp2aXNpYmxlPVwiZXhjZWxEaWFsb2dcIiA6c3R5bGU9XCJ7IHdpZHRoOiAnNDUwcHgnIH1cIiBoZWFkZXI9XCJFeHBvcnQgRXhjZWxcIiA6bW9kYWw9XCJ0cnVlXCI+XG4gICAgICAgICAgICA8cD5VbiBleHBvcnQgY29tcGxldCBlc3QgZ8OpbsOpcsOpIGNoYXF1ZSBudWl0LiBWb3VzIHBvdXZleiBjcsOpZXIgdW4gcmFwcG9ydCBwYXJ0aWVsIGxpbWl0w6kgw6AgNTAwIGxpZ25lcyDDoCBwYXJ0aXIgZGUgdm9zIGNyaXTDqHJlcy48L3A+XG4gICAgICAgICAgICA8dGVtcGxhdGUgI2Zvb3Rlcj5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiQW5udWxlclwiIGljb249XCJwaSBwaS10aW1lc1wiIHRleHQgQGNsaWNrPVwiaGlkZURpYWxvZ1wiIC8+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIkV4cG9ydGVyXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgQGNsaWNrPVwic2VuZEV4Y2VsKClcIiAvPlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9EaWFsb2c+XG48L3RlbXBsYXRlPlxuPHN0eWxlPlxuOmRlZXAodHIubXktY3VzdG9tLWhpZ2hsaWdodCkge1xuICAgIC8qYmFja2dyb3VuZDogI2ZjZDlhNSAhaW1wb3J0YW50OyovXG4gICAgLypmb250LXdlaWdodDogYm9sZDsqL1xufVxuLnAtZGF0YXRhYmxlLXRoZWFkID4gdHIgPiB0aCAge1xuICAgIHBhZGRpbmctdG9wOiA0cHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWJvdHRvbTogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1sZWZ0OiA0cHggIWltcG9ydGFudDtcbn1cbi5wLWRhdGF0YWJsZS1oZWFkZXItY2VsbCAgIHtcbiAgICBwYWRkaW5nLXRvcDogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctbGVmdDogNHB4ICFpbXBvcnRhbnQ7XG59XG4ucC1kYXRhdGFibGUtZnJvemVuLXRib2R5ID4gdHIgPiB0ZCB7XG4gIC8qYmFja2dyb3VuZC1jb2xvcjogI2M4ZTNmZSAhaW1wb3J0YW50OyAqL1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6IGJsdWUgIWltcG9ydGFudDtcbn1cbiNoZWFkZXItYXBwIHt6LWluZGV4OiAxMDt9XG4uZHBfX2lucHV0LCAuZHBfX21haW57d2lkdGg6IDI1MHB4ICFpbXBvcnRhbnQ7ZGlzcGxheTogaW5saW5lLWJsb2NrO31cblxuI2luZm9zVGFicyB7YmFja2dyb3VuZC1jb2xvcjogZ3JleTtwYWRkaW5nOiA1cHg7fVxuLmluZm9zVGFiIHtoZWlnaHQ6MzAwcHg7IG92ZXJmbG93LXk6IGF1dG87YmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjt9XG5cbi5oaWRlLXNlbGVjdC1hbGwgdGggPiAucC1jaGVja2JveCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbiNwYW5lbHNlYXJjaCB7d2lkdGg6MTAwJTsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OmNlbnRlcjt9XG4uYnRudGVsIHt3aWR0aDogMTUwcHggIWltcG9ydGFudDsgZm9udC1zaXplOjEycHg7aGVpZ2h0IDogMjBweCAhaW1wb3J0YW50O3BhZGRpbmc6IDJweCAhaW1wb3J0YW50O31cbi5idG50ZWwyIHt3aWR0aDogNDBweCAhaW1wb3J0YW50OyBsaW5lLWhlaWdodDogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyO2ZvbnQtc2l6ZToxMnB4O2hlaWdodCA6IDIwcHggIWltcG9ydGFudDtwYWRkaW5nOiAycHggIWltcG9ydGFudDt9XG4ubGluayB7Y29sb3I6IGJsdWU7dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7fVxuLmZvbnQtYmx1ZSB7Zm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiByZ2IoMywgMjUzLCA3NCk7fVxuXG48L3N0eWxlPlxuIiwiPHNjcmlwdCBzZXR1cD5cblxuaW1wb3J0IHsgY3JlYXRlQXBwLCByZWYsIG9uTW91bnRlZCwgb25Vbm1vdW50ZWQsIGdldEN1cnJlbnRJbnN0YW5jZSwgY29tcHV0ZWQsIHdhdGNofSAgZnJvbSAndnVlJztcbmltcG9ydCB7IGJ1cyB9IGZyb20gJy4uL2J1cy5qcyc7IFxuaW1wb3J0IExlYWZsZXRTdGFuZGFyZCBmcm9tICcuL0xlYWZsZXRTdGFuZGFyZC52dWUnO1xuaW1wb3J0IFRhYnMgZnJvbSAncHJpbWV2dWUvdGFicyc7XG5pbXBvcnQgVGFiTGlzdCBmcm9tICdwcmltZXZ1ZS90YWJsaXN0JztcbmltcG9ydCBUYWIgZnJvbSAncHJpbWV2dWUvdGFiJztcbmltcG9ydCBUYWJQYW5lbHMgZnJvbSAncHJpbWV2dWUvdGFicGFuZWxzJztcbmltcG9ydCBUYWJQYW5lbCBmcm9tICdwcmltZXZ1ZS90YWJwYW5lbCc7XG5pbXBvcnQgVG9nZ2xlU3dpdGNoIGZyb20gJ3ByaW1ldnVlL3RvZ2dsZXN3aXRjaCc7XG5pbXBvcnQgeyB1c2VUb2FzdCB9IGZyb20gJ3ByaW1ldnVlL3VzZXRvYXN0JztcblxuICAgICAgICBjb25zdCBhZ2VudHMgPSByZWYoW10pOyAvLyBMYSBsaXN0ZSBzZXJhIGNoYXJnw6llIGV0IG1pc2Ugw6Agam91ciB2aWEgTWVyY3VyZS9BUElcbiAgICAgICAgdmFyIGFnZW50czIgPSByZWYoW10pO1xuICAgICAgICBjb25zdCBjb3VudGNyZW5lYXUgPSByZWYoJzAnKTtcbiAgICAgICAgY29uc3QgZG9ubmVlcyA9IFtdO1xuICAgICAgICBjb25zdCB0b2FzdCA9IHVzZVRvYXN0KCk7XG4gICAgICAgIGNvbnN0IGFnZW50c19tYWogPSBbXTtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICAgICAgY29uc3QgaW5pdGlhbEFnZW50cyA9IFtdO1xuICAgICAgICBjb25zdCBzZWFyY2hBZ2VudCA9IHJlZignVG91cycpO1xuICAgICAgICBjb25zdCBzaG93Q29tcGxldGVkID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgbG9hZGluZyA9IHJlZih0cnVlKTtcbiAgICAgICAgY29uc3QgcGFyYW0gPSByZWYobnVsbCk7XG4gICAgICAgIGNvbnN0IHBhcmFtTGVhZmxldCA9IHJlZihudWxsKTtcbiAgICAgICAgY29uc3QgYWdlbnRTZWwgPSByZWYobnVsbCk7XG4gICAgICAgIHZhciBwb2ludCA9IDA7XG4gICAgICAgIHZhciBkaXN0YW5jZSA9ICdyZXNldCc7XG4gICAgICAgIHZhciBkYXRlICA9ICcnO1xuICAgICAgICBjb25zdCB0YWJ2YWx1ZSA9IHJlZignMCcpO1xuICAgICAgICBjb25zdCBjaGVja2VkID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCByZWNoRGlzdGFuY2UgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBzaG93ID0gcmVmKHRydWUpO1xuICAgICAgICBjb25zdCByYXdEYXRhID0gcmVmKFtdKTtcblxuICAgICAgICBjb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcbiAgICAgICAgICBwYXJhbTogIHtcbiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwgXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSBcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcGFyYW1MZWFmbGV0LnZhbHVlID0gcHJvcHMucGFyYW07XG5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ3JlbmVhdXMoZGF0YUNyZW5lYXUpe1xuICAgICAgICAgICAgaWYoZGF0YUNyZW5lYXUub3BlcmF0aW9uKXtwcm9wcy5wYXJhbS5vcGVyYXRpb24gPSBkYXRhQ3JlbmVhdS5vcGVyYXRpb247fVxuICAgICAgICAgICAgcG9pbnQgPSBkYXRhQ3JlbmVhdS5wb2ludDtcbiAgICAgICAgICAgIGRpc3RhbmNlID0gZGF0YUNyZW5lYXUuZGlzdGFuY2U7XG4gICAgICAgICAgICBkYXRlICA9IGRhdGFDcmVuZWF1LmRhdGU7XG4gICAgICAgICAgICB0YWJ2YWx1ZS52YWx1ZSA9ICcxJztcbiAgICAgICAgICAgIGlmKGRhdGFDcmVuZWF1LmFnZW50KXthZ2VudFNlbC52YWx1ZSA9IGRhdGFDcmVuZWF1LmFnZW50O31cbiAgICAgICAgICAgIGZldGNoQ3JlbmVhdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmZXRjaENyZW5lYXVzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgc2VhcmNoQWdlbnQudmFsdWUgPSAnVG91cyc7XG4gICAgICAgICAgICBpZihkaXN0YW5jZSA9PSAncmVzZXQnKXtyZWNoRGlzdGFuY2UudmFsdWUgPSBmYWxzZTt9XG4gICAgICAgICAgICBlbHNle3JlY2hEaXN0YW5jZS52YWx1ZSA9IHRydWU7fVxuICAgICAgICAgICAgaWYoZGF0ZSA9PSAnJyl7ZGF0ZSA9IDA7fVxuICAgICAgICAgICAgaWYocHJvcHMucGFyYW0ub3BlcmF0aW9uKXtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2NyZW5lYXVzLycrcHJvcHMucGFyYW0ub3BlcmF0aW9uKycvMC8nICsgcG9pbnQgKyAnLycgKyBkaXN0YW5jZSArICcvMC8wJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgaWYoZGF0YS5sZW5ndGggPiAzKXtjb3VudC52YWx1ZSA9IGZhbHNlO31cbiAgICAgICAgICAgICAgICAgICBlbHNle2NvdW50LnZhbHVlID0gdHJ1ZTt9XG4gICAgICAgICAgICAgICAgICAgcmF3RGF0YS52YWx1ZSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICBjb3VudGNyZW5lYXUudmFsdWUgPSBhZ2VudHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIHLDqWN1cMOpcmF0aW9uIGRlcyBwb2ludHM6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgLy93aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdGFidmFsdWUudmFsdWUgPSAnMSc7XG4gICAgICAgICAgICAgICAgY2hlY2tlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2hvdy52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmZXRjaENyZW5lYXUgPSBhc3luYyAoZGF0YTIpID0+IHtcbiAgICAgICAgICAgIHNlYXJjaEFnZW50LnZhbHVlICA9ICdUb3VzJztcbiAgICAgICAgICAgIGxldCBhZ2VudF9pZCA9IGRhdGEyO1xuICAgICAgICAgICAgaWYocHJvcHMucGFyYW0ub3BlcmF0aW9uKXtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGF0ZS52YWx1ZT0nJztcbiAgICAgICAgICAgICAgICBzaG93Q29tcGxldGVkLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFyIHEgPSAwO1xuICAgICAgICAgICAgICAgIHJlY2hEaXN0YW5jZS52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvY3JlbmVhdXMvJytwcm9wcy5wYXJhbS5vcGVyYXRpb24rJy8nK2FnZW50X2lkKycvJysgcG9pbnQgKycvcmVzZXQvMC8wJyk7IC8vIFZvdHJlIGVuZHBvaW50IEFQSSBTeW1mb255XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVkaXJlY3Rpb24gZm9yY8OpZSB2ZXJzIGxhIHBhZ2UgZGUgbG9naW5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9qZSByZW52b2llIGxlcyBhZ2VudHNcbiAgICAgICAgICAgICAgICByYXdEYXRhLnZhbHVlID0gZGF0YTtcbiAgICAgICAgICAgICAgICBzaG93LnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgbG9ycyBkZSBsYSByw6ljdXDDqXJhdGlvbiBkZXMgcG9pbnRzOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgLy93aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGFidmFsdWUudmFsdWUgPSAnMSc7XG4gICAgICAgICAgICBjaGVja2VkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9O1xuXG4gICAgICAgLy8gMS4gTGlzdGUgZGUgdG91cyBsZXMgYWdlbnRzIChDb2xvbm5lcylcbmNvbnN0IHRvdXNMZXNBZ2VudHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiByYXdEYXRhLnZhbHVlLm1hcChhID0+ICh7XG4gICAgaWQ6IGEuaWQsXG4gICAgbm9tOiBhLm5vbSxcbiAgICBwcmVub206IGEucHJlbm9tLFxuICAgIHRvdGFsQ3JlbmVhdUhvcmFpcmU6IGEudG90YWxDcmVuZWF1SG9yYWlyZVxuICB9KSk7XG59KTtcblxuLy8gMi4gTGlzdGUgZGUgdG91dGVzIGxlcyBkYXRlcyB1bmlxdWVzIHRyacOpZXMgKExpZ25lcylcbmNvbnN0IHRvdXRlc0xlc0RhdGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICBjb25zdCBkYXRlcyA9IG5ldyBTZXQoKTtcbiAgcmF3RGF0YS52YWx1ZS5mb3JFYWNoKGFnZW50ID0+IHtcbiAgICBhZ2VudC5jcmVuZWF1cy5mb3JFYWNoKGMgPT4gZGF0ZXMuYWRkKGMuZGF0ZSkpO1xuICB9KTtcbiAgXG4gIHJldHVybiBBcnJheS5mcm9tKGRhdGVzKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgZDEgPSBuZXcgRGF0ZShhLnNwbGl0KCctJykucmV2ZXJzZSgpLmpvaW4oJy0nKSk7XG4gICAgY29uc3QgZDIgPSBuZXcgRGF0ZShiLnNwbGl0KCctJykucmV2ZXJzZSgpLmpvaW4oJy0nKSk7XG4gICAgcmV0dXJuIGQxIC0gZDI7XG4gIH0pO1xufSk7XG5cbi8vIDMuIEhlbHBlciBwb3VyIHLDqWN1cMOpcmVyIGxlcyBjcsOpbmVhdXggZCd1biBhZ2VudCBwcsOpY2lzIMOgIHVuZSBkYXRlIHByw6ljaXNlXG5jb25zdCBnZXRTbG90c0ZvckFnZW50QW5kRGF0ZSA9IChhZ2VudElkLCBkYXRlKSA9PiB7XG4gIGNvbnN0IGFnZW50ID0gcmF3RGF0YS52YWx1ZS5maW5kKGEgPT4gYS5pZCA9PT0gYWdlbnRJZCk7XG4gIGlmICghYWdlbnQpIHJldHVybiBbXTtcbiAgcmV0dXJuIGFnZW50LmNyZW5lYXVzLmZpbHRlcihjID0+IGMuZGF0ZSA9PT0gZGF0ZSk7XG59O1xuXG4vLyA0LiBIZWxwZXIgcG91ciBhZmZpY2hlciBsZSBqb3VyIGRlIGxhIHNlbWFpbmUgKGV4OiBMdW5kaSlcbmNvbnN0IGdldEpvdXJTZW1haW5lID0gKGRhdGVTdHIpID0+IHtcbiAgLy8gT24gcsOpY3Vww6hyZSBsZSBub20gZHUgam91ciBkZXB1aXMgbGUgcHJlbWllciBjcsOpbmVhdSB0cm91dsOpIHBvdXIgY2V0dGUgZGF0ZVxuICBmb3IgKGxldCBhZ2VudCBvZiByYXdEYXRhLnZhbHVlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBhZ2VudC5jcmVuZWF1cy5maW5kKGMgPT4gYy5kYXRlID09PSBkYXRlU3RyKTtcbiAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaC5qb3VyU2VtYWluZUZyO1xuICB9XG4gIHJldHVybiBcIlwiO1xufTtcblxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVDYXJ0ZSgpe1xuICAgICAgICAgICAgdGFidmFsdWUudmFsdWUgPSAnMCc7XG4gICAgICAgICAgICBjaGVja2VkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgY29uc3QgYWdlbnRzRmlsdGVyZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRvdXNMZXNBZ2VudHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWFyY2hBZ2VudC52YWx1ZSAhPT0gJ1RvdXMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvdXNMZXNBZ2VudHMudmFsdWUuZmlsdGVyKGEgPT4gYS5pZCA9PT0gcGFyc2VJbnQoc2VhcmNoQWdlbnQudmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge3JldHVybiB0b3VzTGVzQWdlbnRzLnZhbHVlO31cblxuICAgICAgICB9KVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlc2V0Q3JlbmVhdSgpIHtcbiAgICAgICAgICAgIC8vcG9pbnQgPSAwO1xuICAgICAgICAgICAgZGlzdGFuY2UgPSAncmVzZXQnO1xuICAgICAgICAgICAgZGF0ZSAgPSAnJztcbiAgICAgICAgICAgIGZldGNoQ3JlbmVhdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlc2FjdGl2ZXIgPSBhc3luYyhhZ2VudF9pZCxpZCkgPT4geyBcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvY3JlbmVhdS9hY3RpdmVyLycraWQsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWdlbnQgPSByYXdEYXRhLnZhbHVlLmZpbmQoYSA9PiBhLmlkID09PSBhZ2VudF9pZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBhZ2VudC5jcmVuZWF1cy5maW5kKGMgPT4gYy5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgIC8vbGV0IGNyZW5lYXVJbmRleCA9IGFnZW50cy52YWx1ZVthZ2VudF9pZF0uY3JlbmVhdXMuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgIG1hdGNoLmFjdGlmID0gIW1hdGNoLmFjdGlmO1xuXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzdGFydERyYWcoZXZ0LCBpdGVtLCBhZ2VudCwgYWN0aWYsIHRvdGFsQ3JlbmVhdSkge1xuICAgICAgICBpZighYWN0aWYpe2FsZXJ0KCdDcsOpbmVhdSBpbmFjdGlmIDogT3DDqXJhdGlvbiBpbXBvc3NpYmxlJyk7cmV0dXJuO31cbiAgICAgICAgY29uc29sZS5sb2coJ2NyZW5lYXUnK2l0ZW0rJ2FnZW50JythZ2VudClcbiAgICAgICAgICBldnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSdcbiAgICAgICAgICBldnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSdcbiAgICAgICAgICBldnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RvdGFsQ3JlbmVhdScsIHRvdGFsQ3JlbmVhdSlcbiAgICAgICAgICBldnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ2l0ZW1JRCcsIGl0ZW0pXG4gICAgICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5zZXREYXRhKCdhZ2VudElEJywgYWdlbnQpXG4gICAgICAgICAgY29uc3QgaXRlbUlEID0gZXZ0LmRhdGFUcmFuc2Zlci5nZXREYXRhKCdpdGVtSUQnKVxuICAgICAgICB9XG5cbiAgICAgICAgd2F0Y2goY2hlY2tlZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIEZlbjEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9pbnRzJyk7XG4gICAgICAgICAgICB2YXIgRmVuMiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZW51LWJhcycpO1xuICAgICAgICAgICAgaWYoY2hlY2tlZC52YWx1ZSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICBGZW4xLnN0eWxlLmhlaWdodCA9ICdjYWxjKDEwMHZoIC0gNTAwcHgpJztcbiAgICAgICAgICAgICAgICBpZihGZW4yKXtGZW4yLnN0eWxlLmhlaWdodCA9ICc0MDBweCc7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBGZW4xLnN0eWxlLmhlaWdodCA9ICdjYWxjKDEwMHZoIC0gMTAwcHgpJztcbiAgICAgICAgICAgICAgICBpZihGZW4yKXtGZW4yLnN0eWxlLmhlaWdodCA9JzBweCc7fVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVQb2ludFNlbGVjdGlvbihwb2ludERhdGEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDYXJ0ZTogw4l2w6luZW1lbnQgcG9pbnQtc2VsZWN0ZWQgcmXDp3UgIScsIHBvaW50RGF0YSk7XG4gICAgICAgICAgICAvLyBMb2dpcXVlIGRlIGxhIGNhcnRlIDogY2VudHJlciBzdXIgbGUgcG9pbnQsIG91dnJpciB1bmUgcG9wdXAsIGV0Yy5cbiAgICAgICAgICAgIC8vIHBhciBleGVtcGxlIDogbWFwLmZseVRvKFtwb2ludERhdGEubGF0LCBwb2ludERhdGEubG5nXSwgMTUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcmVzZXREYXRhKCl7XG4gICAgICAgICAgICByYXdEYXRhLnZhbHVlID0gW107XG4gICAgICAgICAgICBjaGVja2VkLnZhbHVlPWZhbHNlO1xuICAgICAgICAgICAgc2hvdy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgICAgICAgIC8vZmV0Y2hDcmVuZWF1cygpO1xuICAgICAgICAgICAgY2hlY2tlZC52YWx1ZT1mYWxzZTtcbiAgICAgICAgICAgIHNob3cudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb2ludHMnKS5zdHlsZS5oZWlnaHQgPSAnY2FsYygxMDB2aCAtIDEwMHB4KSc7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnY2hlY2tlZCcrY2hlY2tlZC52YWx1ZSlcbiAgICAgICAgICAgIGJ1cy5vbignY3JlbmVhdS11cGRhdGVkJywgZmV0Y2hDcmVuZWF1cyk7XG4gICAgICAgICAgICBidXMub24oJ2NyZW5lYXUtdG9VcGRhdGUnLCB1cGRhdGVDcmVuZWF1cyk7XG4gICAgICAgICAgICBidXMub24oJ2NhcnRlLXRvVXBkYXRlJywgdXBkYXRlQ2FydGUpO1xuICAgICAgICAgICAgYnVzLm9uKCdyZXNldC1zdGFuZGFyZCcsIHJlc2V0RGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBldmVudFNvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgb25Vbm1vdW50ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvYnNlcnZlcikgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgdG91c0xlc0FnZW50cy52YWx1ZT0gW107XG4gICAgICAgICAgICByYXdEYXRhLnZhbHVlPSBbXTtcbiAgICAgICAgICAgIHRhYnZhbHVlLnZhbHVlID0gJzAnO1xuICAgICAgICAgICAgYnVzLm9mZignY3JlbmVhdS11cGRhdGVkJywgZmV0Y2hDcmVuZWF1cyk7XG4gICAgICAgICAgICBidXMub2ZmKCdjcmVuZWF1LXRvVXBkYXRlJywgdXBkYXRlQ3JlbmVhdXMpO1xuICAgICAgICAgICAgYnVzLm9mZignY2FydGUtdG9VcGRhdGUnKTtcbiAgICAgICAgICAgIGJ1cy5vZmYoJ3Jlc2V0LXN0YW5kYXJkJywgcmVzZXREYXRhKTtcbiAgICAgICAgfSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbjxkaXYgaWQ9XCJtZW51LWJhc1wiIHN0eWxlPVwiaGVpZ2h0OiAwcHg7XCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXJcIiBzdHlsZT1cImZsb2F0OiByaWdodDttYXJnaW46IDIwcHggMjBweCAwIDA7XCIgdi1pZj1cInNob3dcIj5cbiAgICAgICAgPHNwYW4gdi1pZj1cInRhYnZhbHVlID09IDFcIj5cbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJldGF0LWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hBZ2VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3VzXCI+VG91czwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJhZ2VudE4gaW4gdG91c0xlc0FnZW50c1wiIDprZXk9XCJhZ2VudE4uaWRcIiA6dmFsdWU9XCJhZ2VudE4uaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWdlbnROLm5vbSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAmbmJzcDsmbmJzcDtcbiAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwicmVzZXRDcmVuZWF1KCk7XCI+VG91cyBjcsOpbmVhdXg8L2J1dHRvbj48L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PFRvZ2dsZVN3aXRjaCB2LW1vZGVsPVwiY2hlY2tlZFwiIC8+XG4gICAgPC9kaXY+XG48ZGl2IGlkPVwiYWdlbnRzXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCBibGFjaztcIiBjbGFzcz1cIm0tMFwiID5cbjxkaXYgdi1pZj1cImFnZW50c0ZpbHRlcmVkLmxlbmd0aCA9PSAwXCI+IFBhcyBkZSBjcsOpbmVhdSB0cm91dsOpLiA8L2Rpdj5cbjxkaXYgdi1lbHNlIGNsYXNzPVwiY2FsZW5kYXItY29udGFpbmVyXCI+XG4gICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlXCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDwhLS0gRW4tdMOqdGUgOiBMZXMgbm9tcyBkZXMgYWdlbnRzIGVuIGNvbG9ubmVzIC0tPlxuICAgICAgICAgICAgPHRoIHYtZm9yPVwiYWdlbnQgaW4gYWdlbnRzRmlsdGVyZWRcIiA6a2V5PVwiYWdlbnQuaWRcIiBjbGFzcz1cInN0aWNreS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gIDpjbGFzcz1cIlthZ2VudFNlbCA9PSBhZ2VudC5pZCA/ICdncmVlbicgOiAnJ11cIj57eyBhZ2VudC5ub20gfX0ge3sgYWdlbnQucHJlbm9tIH19PC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPCEtLSBVbmUgbGlnbmUgcGFyIERhdGUgdW5pcXVlIC0tPlxuICAgICAgICAgIDx0ciB2LWZvcj1cImRhdGUgaW4gdG91dGVzTGVzRGF0ZXNcIiA6a2V5PVwiZGF0ZVwiPlxuICAgICAgICAgICAgPHRkIHYtZm9yPVwiYWdlbnQgaW4gYWdlbnRzRmlsdGVyZWRcIiA6a2V5PVwiYWdlbnQuaWRcIiBjbGFzcz1cInNsb3QtY2VsbFwiPlxuICA8ZGl2IHYtaWY9XCJnZXRTbG90c0ZvckFnZW50QW5kRGF0ZShhZ2VudC5pZCwgZGF0ZSkubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgdi1mb3I9XCJzbG90IGluIGdldFNsb3RzRm9yQWdlbnRBbmREYXRlKGFnZW50LmlkLCBkYXRlKVwiIDprZXk9XCJzbG90LmlkXCIgIGNsYXNzPVwic2xvdC1iYWRnZSBlbC1kcmFnXCIgICBkcmFnZ2FibGU9XCJ0cnVlXCIgXG4gIEBkcmFnc3RhcnQ9XCJzdGFydERyYWcoJGV2ZW50LCBzbG90LmlkLCBhZ2VudC5pZCwgc2xvdC5hY3RpZiwgc2xvdC50b3RhbENyZW5lYXVIb3JhaXJlKVwiIDpjbGFzcz1cIltzbG90LmNvbXBsZXQgPyAnY3JlbmVhdS1jb21wbGV0JyA6ICcnXVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNsb3QtaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdj48c3BhbiBjbGFzcz1cInRpbWVcIj57eyBzbG90LmpvdXJTZW1haW5lRnIgfX0ge3sgc2xvdC5kYXRlIH19PGJyPnt7IHNsb3QuY3JlbmVhdUhvcmFpcmUubm9tIH19PC9zcGFuPjwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgIDxwIEBjbGljaz1cImRlc2FjdGl2ZXIoYWdlbnQuaWQsc2xvdC5pZClcIj57eyBzbG90LmFjdGlmID8gJ+KchScgOiAn4p2MJyB9fTwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNsb3QtZm9vdGVyXCIgdi1pZj1cInNsb3QucG9pbnRzLmxlbmd0aCAhPT0gMFwiID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmZvLXRyaWdnZXJcIj7ihLnvuI88L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLXBvcHVwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiB2LWZvcj1cInBvaW50IGluIHNsb3QucG9pbnRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAtIDxzdHJvbmc+e3twb2ludC5ub219fTwvc3Ryb25nPiA6IHt7cG9pbnQudGl0cmVSdWV9fSB7e3BvaW50Lm51bWVyb1J1ZX19IHt7cG9pbnQudGl0cmVSdWV9fSB7e3BvaW50Lm5vbVJ1ZX19IHt7cG9pbnQudmlsbGV9fSAoe3twb2ludC5pZH19KTxicj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2xvdC1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdC1pdGVtXCI+XG4gICAgICAgIDxzcGFuIDpjbGFzcz1cIltzbG90LnRvdGFsID4gMCA/ICdncmVlbicgOiAnJ11cIj57eyBzbG90LnRvdGFsIH19IFJWPC9zcGFuPlxuICAgICAgICA8c3BhbiB0aXRsZT1cIlRvdGFsIHBvdXIgY2V0dGUgdHJhbmNoZSBob3JhaXJlXCIgOmNsYXNzPVwiW3Nsb3QudG90YWxDcmVuZWF1SG9yYWlyZSAgPj0gYWdlbnQudG90YWxDcmVuZWF1SG9yYWlyZSA/ICdhbGVydGUtcm91Z2UnIDogJ3RyYW5jaGUtdG90YWwnXVwiPih7eyBzbG90LnRvdGFsQ3JlbmVhdUhvcmFpcmUgfX0pPC9zcGFuPlxuICAgICAgICA8c3BhbiB2LWlmPVwic2xvdC5kaXN0YW5jZSA+PSAwICYmIHNsb3QudG90YWwgPiAwXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJncmVlblwiPjxzdHJvbmc+e3sgc2xvdC5kaXN0YW5jZSB9fW08L3N0cm9uZz48L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gZWxzZT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj4mbmJzcDs8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PiAgICBcbiAgICA8L2Rpdj5cbiAgICA8L2Rpdj48L2Rpdj5cbjwvdGQ+XG5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgIFxuPC90ZW1wbGF0ZT5cbjxzdHlsZT5cbi5ibG9jLWNyZW5lYXUtZGF0ZSB7ZGlzcGxheTogZmxleDtmbGV4LWRpcmVjdGlvbjogY29sdW1uO31cbi5wLXRhYiB7cGFkZGluZy1ib3R0b206IDJweCAhaW1wb3J0YW50O3BhZGRpbmctdG9wOiAycHggIWltcG9ydGFudDt9XG4uZmxleGNvbHVtbiB7ZGlzcGxheTogZmxleCAhaW1wb3J0YW50O2ZsZXgtZGlyZWN0aW9uOiByb3cgIWltcG9ydGFudDt9XG4uY3JlbmVhdS1pZGVudCB7aGVpZ2h0OiA1MnB4O31cbi5hZ2VudC1ub20ge3Bvc2l0aW9uOiBzdGlja3kgIWltcG9ydGFudDt9XG4uY3JlbmVhdS1kZXNhY3RpdmVyIHtwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMnB4OyByaWdodDoycHg7fVxuXG4uY2FsZW5kYXItY29udGFpbmVyIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIG1heC1oZWlnaHQ6IDgwdmg7IC8qIFNjcm9sbCB2ZXJ0aWNhbCBzaSBiZWF1Y291cCBkZSBkYXRlcyAqL1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICB3aWR0aDogMTAwJTtcbn1cblxudGFibGUge1xuICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyAvKiBJbXBvcnRhbnQgcG91ciBsZSBzdGlja3kgKi9cbiAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uY2FsZW5kYXItY29udGFpbmVyIHRoLCAuY2FsZW5kYXItY29udGFpbmVyIHRkIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2VlZTtcbiAgcGFkZGluZzogMnB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gIG1pbi13aWR0aDogMTAwcHg7XG59XG5cbi8qIEZpeGVyIGwnZW4tdMOqdGUgZW4gaGF1dCAqL1xuLnN0aWNreS1oZWFkZXIge1xuICBwb3NpdGlvbjogc3RpY2t5ICFpbXBvcnRhbnQ7XG4gIHRvcDogMDtcbiAgYmFja2dyb3VuZDogI2Y4ZjlmYSAhaW1wb3J0YW50O1xuICB6LWluZGV4OiAxMDtcbiAgYm94LXNoYWRvdzogMCAycHggMnB4IC0xcHggcmdiYSgwLDAsMCwwLjEpO1xufVxuXG4vKiBGaXhlciBsYSBjb2xvbm5lIGRlcyBkYXRlcyDDoCBnYXVjaGUgKi9cbi5zdGlja3ktY29sIHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgbGVmdDogMDtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgei1pbmRleDogMTE7XG4gIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICNkZGQ7XG59XG5cbi8qIENlbGx1bGUgZCdhbmdsZSAoaGF1dC1nYXVjaGUpIDogZG9pdCDDqnRyZSBhdSBkZXNzdXMgZGUgdG91dCAqL1xudGguc3RpY2t5LWNvbC5zdGlja3ktaGVhZGVyIHtcbiAgei1pbmRleDogMjA7XG4gIGJhY2tncm91bmQ6ICNlY2VjZWM7XG59XG5cbi5kYXRlLWNvbHVtbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG59XG5cbi5kYXRlLWxhYmVsIHtcbiAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogIzY2NjtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG4uZGF0ZS12YWx1ZSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogIzMzMztcbn1cbi8qIFN0cnVjdHVyZSBkZSBsYSBjYXJ0ZSBkZSBjcsOpbmVhdSAqL1xuLnNsb3QtY2VsbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogTsOpY2Vzc2FpcmUgcG91ciBsZSB6LWluZGV4ICovXG4gIHRyYW5zaXRpb246IHotaW5kZXggMC4ycztcbn1cblxuLnNsb3QtY2VsbDpob3ZlciB7XG4gIHotaW5kZXg6IDUwOyAvKiBQYXNzZSBhdS1kZXNzdXMgZGVzIGF1dHJlcyBjZWxsdWxlcyBldCBkZXMgaGVhZGVycyBzdGlja3kgKi9cbn1cbi8qIC0tLSBGSVggVklTSUJJTElUw4kgLS0tICovXG4uc2xvdC1jZWxsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBOw6ljZXNzYWlyZSBwb3VyIGxlIHotaW5kZXggKi9cbiAgdHJhbnNpdGlvbjogei1pbmRleCAwLjJzO1xufVxuXG4uc2xvdC1jZWxsOmhvdmVyIHtcbiAgei1pbmRleDogNTA7IC8qIFBhc3NlIGF1LWRlc3N1cyBkZXMgYXV0cmVzIGNlbGx1bGVzIGV0IGRlcyBoZWFkZXJzIHN0aWNreSAqL1xufVxuXG4vKiAtLS0gREVTSUdOIERFIExBIENBUlRFIC0tLSAqL1xuLnNsb3QtYmFkZ2Uge1xuICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTVlN2ViO1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIHBhZGRpbmc6IDRweDtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLDAsMCwwLjUpO1xuICBtaW4td2lkdGg6IDEzMHB4O1xuICBoZWlnaHQ6IDkwcHg7XG59XG5cbi5zbG90LWhlYWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgbWFyZ2luLWJvdHRvbTogMnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICNjY2M7XG4gIHBhZGRpbmctYm90dG9tOiAycHg7XG59XG5cbi50aW1lIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcbiAgY29sb3I6ICMyNTYzZWI7XG59XG5cbi50cmFuY2hlLXRvdGFsIHtcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xuICBiYWNrZ3JvdW5kOiAjZjNmNGY2O1xuICBwYWRkaW5nOiAwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICM0YjU1NjM7XG59XG5cbi5zbG90LWJvZHkge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyAvKiBPcmdhbmlzYXRpb24gdmVydGljYWxlIGRlcyBzdGF0cyAqL1xuICBnYXA6IDJweDtcbiAgbWFyZ2luLWJvdHRvbTogMHB4O1xufVxuXG4uc3RhdC1pdGVtIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA1cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbn1cblxuLmljb24ge1xuICBmb250LXNpemU6IDAuOXJlbTtcbn1cblxuLnZhbHVlIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgY29sb3I6ICMxZjI5Mzc7XG59XG5cbi5zbG90LWZvb3RlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnNsb3QtZGF0ZSB7XG4gIGZvbnQtc2l6ZTogMC43cmVtO1xuICBjb2xvcjogIzljYTNhZjtcbn1cblxuLyogLS0tIFNUWUxFIERVIFBPUFVQIC0tLSAqL1xuLmluZm8td3JhcHBlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgY3Vyc29yOiBoZWxwO1xufVxuXG4uaW5mby10cmlnZ2VyIHtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBvcGFjaXR5OiAwLjY7XG59XG5cbi5pbmZvLXRyaWdnZXI6aG92ZXIge1xuICBvcGFjaXR5OiAxO1xufVxuXG4uaW5mby1wb3B1cCB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBvc2l0aW9uOiBmaXhlZCAhaW1wb3J0YW50O1xuICB0b3A6IGNhbGMoMTAwdmggLSA0MDBweCk7IC8qIFMnYWZmaWNoZSBhdS1kZXNzdXMgZGUgbCdpY8O0bmUgKi9cbiAgbGVmdDogMTBweDtcbiAgd2lkdGg6IDI1MHB4ICFpbXBvcnRhbnQ7XG4gIGhlaWdodDogYXV0bztcbiAgYmFja2dyb3VuZDogIzFmMjkzNzsgLyogRm9uZCBzb21icmUgbW9kZXJuZSAqL1xuICBjb2xvcjogd2hpdGU7XG4gIHBhZGRpbmc6IDEwcHggIWltcG9ydGFudDtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBib3gtc2hhZG93OiAwIDEwcHggMTVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgei1pbmRleDogMTAwMDA7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyAvKiBQb3VyIG5lIHBhcyBnw6puZXIgbGEgc291cmlzICovXG4gIGZvbnQtc2l6ZTogMC44cmVtO1xuICBsaW5lLWhlaWdodDogMS40O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xufVxuXG4ucG9wdXAtdGl0bGUge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xuICBjb2xvcjogIzYwYTVmYTtcbn1cblxuLmluZm8tcG9wdXAgaHIge1xuICBib3JkZXI6IDA7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMzc0MTUxO1xuICBtYXJnaW46IDVweCAwO1xufVxuXG4uaW5mby13cmFwcGVyOmhvdmVyIC5pbmZvLXBvcHVwIHtcbiAgZGlzcGxheTogYmxvY2s7IC8qIEFmZmljaGUgbGEgYnVsbGUgYXUgc3Vydm9sICovXG59XG5cbi8qIFBldGl0IHRyaWFuZ2xlIGVuIGJhcyBkZSBsYSBidWxsZSAqL1xuLmluZm8tcG9wdXAyOjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxMDAlO1xuICByaWdodDogMTBweDtcbiAgYm9yZGVyLXdpZHRoOiA2cHg7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1jb2xvcjogIzFmMjkzNyB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcbn1cbi5ncmVlbiB7Zm9udC1zaXplOiAxNHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7Y29sb3I6IHJnYigzLCAyNTMsIDc0KSAhaW1wb3J0YW50O2ZvbnQtd2VpZ2h0OiBib2xkO31cbi5lbXB0eS1jZWxsIHtcbiAgY29sb3I6ICNkZGQ7XG59XG4uY3JlbmVhdS1jb21wbGV0IHtiYWNrZ3JvdW5kLWNvbG9yOiAjZDdkN2Q3ICFpbXBvcnRhbnQ7fVxuXG4uYWxlcnRlLXJvdWdlIHtmb250LXNpemU6IDE0cHggIWltcG9ydGFudDsgY29sb3I6IHJlZCAhaW1wb3J0YW50O3BhZGRpbmc6IDBweDt9XG48L3N0eWxlPiIsIjxzY3JpcHQgc2V0dXA+XG5cbmltcG9ydCB7IGNyZWF0ZUFwcCwgcmVmLCBvbk1vdW50ZWQsIG9uQmVmb3JlVW5tb3VudCwgb25Vbm1vdW50ZWQsIGdldEN1cnJlbnRJbnN0YW5jZSwgY29tcHV0ZWR9ICBmcm9tICd2dWUnO1xuaW1wb3J0IHsgRmlsdGVyTWF0Y2hNb2RlLCBGaWx0ZXJPcGVyYXRvciB9IGZyb20gJ0BwcmltZXZ1ZS9jb3JlL2FwaSc7XG5cbmltcG9ydCB7IGJ1cyB9IGZyb20gJy4uL2J1cy5qcyc7IFxuaW1wb3J0IHsgRnVuY3Rpb25zIH0gZnJvbSAnLi9zZXJ2aWNlL0Z1bmN0aW9ucyc7XG5cbmltcG9ydCB7IFZ1ZURhdGVQaWNrZXIgfSBmcm9tICdAdnVlcGljL3Z1ZS1kYXRlcGlja2VyJztcbmltcG9ydCAnQHZ1ZXBpYy92dWUtZGF0ZXBpY2tlci9kaXN0L21haW4uY3NzJ1xuXG5pbXBvcnQgUHJvZ3Jlc3NCYXIgZnJvbSAncHJpbWV2dWUvcHJvZ3Jlc3NiYXInO1xuaW1wb3J0IERhdGFUYWJsZSBmcm9tICdwcmltZXZ1ZS9kYXRhdGFibGUnO1xuaW1wb3J0IENvbHVtbiBmcm9tICdwcmltZXZ1ZS9jb2x1bW4nO1xuaW1wb3J0IENvbHVtbkdyb3VwIGZyb20gJ3ByaW1ldnVlL2NvbHVtbmdyb3VwJzsgICBcbmltcG9ydCBSb3cgZnJvbSAncHJpbWV2dWUvcm93JzsgICAgIFxuaW1wb3J0IFRvZ2dsZVN3aXRjaCBmcm9tICdwcmltZXZ1ZS90b2dnbGVzd2l0Y2gnO1xuXG5cbmltcG9ydCBUb29sYmFyIGZyb20gJ3ByaW1ldnVlL3Rvb2xiYXInO1xuaW1wb3J0IHsgdXNlVG9hc3QgfSBmcm9tICdwcmltZXZ1ZS91c2V0b2FzdCc7XG5cbmltcG9ydCBJbnB1dFRleHQgZnJvbSAncHJpbWV2dWUvaW5wdXR0ZXh0JztcbmltcG9ydCBTZWxlY3QgZnJvbSAncHJpbWV2dWUvc2VsZWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAncHJpbWV2dWUvYnV0dG9uJztcbmltcG9ydCBUZXh0YXJlYSBmcm9tICdwcmltZXZ1ZS90ZXh0YXJlYSc7XG5pbXBvcnQgQ2hlY2tib3ggZnJvbSAncHJpbWV2dWUvY2hlY2tib3gnO1xuaW1wb3J0IENoZWNrYm94R3JvdXAgZnJvbSAncHJpbWV2dWUvY2hlY2tib3hncm91cCc7XG5cbmltcG9ydCBEaWFsb2cgZnJvbSAncHJpbWV2dWUvZGlhbG9nJztcblxuaW1wb3J0IEljb25GaWVsZCBmcm9tICdwcmltZXZ1ZS9pY29uZmllbGQnO1xuaW1wb3J0IElucHV0SWNvbiBmcm9tICdwcmltZXZ1ZS9pbnB1dGljb24nO1xuXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcbiAgcGFyYW06ICB7XG4gICAgdHlwZTogT2JqZWN0LCBcbiAgICByZXF1aXJlZDogdHJ1ZSBcbiAgfVxufSk7XG5cbiAgICAgICAgY29uc3QgZXRhdHMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbGlzdGVhZ2VudHMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSByZWYoMzAwKTtcbiAgICAgICAgY29uc3QgbWlzc2lvbklEID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklEID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXRlbXAgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXNfdHlwZXMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXNUeXBlID0gcmVmKFtdKTsgXG5cbiAgICAgICAgY29uc3QgcG9pbnRzID0gcmVmKFtdKTsgLy8gTGEgbGlzdGUgc2VyYSBjaGFyZ8OpZSBldCBtaXNlIMOgIGpvdXIgdmlhIE1lcmN1cmUvQVBJXG4gICAgICAgIGNvbnN0IG1lc3NhZ2V1ciA9IHJlZignJyk7XG4gICAgICAgIGNvbnN0IG5vbWJyZSA9IHJlZigpO1xuICAgICAgICBjb25zdCB0b3RhbCA9IHJlZigpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZigpO1xuICAgICAgICBjb25zdCBwb3VyY2VudCA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlU01TPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZUV4Y2VsPSByZWYoKTtcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gcmVmKFtdKTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IDA7XG4gICAgICAgIGxldCBzZWwgPSAwO1xuICAgICAgICBsZXQgc2VhcmNoID0gMDtcbiAgICAgICAgY29uc3QgbWFWYWxldXIgPSByZWYoMClcbiAgICAgICAgY29uc3Qgc2hvd1dpdGhSViA9IHJlZih0cnVlKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkID0gJyc7XG4gICAgICAgIGNvbnN0IG1vaXMgPSByZWYoKTtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IGRhdGUgPSByZWYobmV3IERhdGUoKSk7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJJRCA9IHJlZigpO1xuICAgICAgICBjb25zdCBsb2FkaW5nID1yZWYoKTtcbiAgICAgICAgbG9hZGluZy52YWx1ZSA9IHRydWU7XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoTm9tID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU3RhdHVzID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNlYXJjaE51bWVyb1BoeXNpcXVlID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaE51bWVyb0NsaWVudCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hOb21SdWUgPSByZWYoJ1RvdXRlcycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoRGF0ZVJWID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFBsYW5pZlJWID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFF1YXJ0aWVyID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNlYXJjaFZpbGxlID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaEV0YXQgPSByZWYoJ1RvdXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFRlbCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMiA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMyA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyNCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyNSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hFbXBsYWNlbWVudCA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoQWxlcnRlID0gcmVmKCdUb3VzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hBZ2VudCA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoTWlzc2lvbiA9IHJlZigpO1xuICAgICAgICBjb25zdCBsaXN0ZW1pc3Npb25zID0gcmVmKFtdKTtcbiAgICAgICAgY29uc3Qgc2xvdFByb3BzID0gcmVmKCk7IFxuXG4gICAgICAgIGNvbnN0IGNsaWNrZWRSb3dJZCA9IHJlZihudWxsKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWJsZVBvaW50cyA9IHJlZihbXSk7IFxuICAgICAgICBjb25zdCBzZWxlY3RlZFRhYiA9IHJlZihbXSk7XG5cbiAgICAgICAgY29uc3QgQ29sb3JzID0gcmVmKFtdKTsgXG5cbiAgICAgICAgY29uc3QgZXhwYW5kZWRSb3dzID0gcmVmKFtdKTtcbiAgICAgICAgY29uc3QgdG9hc3QgPSB1c2VUb2FzdCgpO1xuICAgICAgICBjb25zdCBwcm9kdWN0RGlhbG9nID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgZXhjZWxEaWFsb2cgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBwcm9kdWN0ID0gcmVmKHt9KTtcbiAgICAgICAgY29uc3Qgc3VibWl0dGVkID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWYoMCk7XG4gICAgICAgIGNvbnN0IGRhdGFDcmVuZWF1ID0ge307XG4gICAgICAgIGNvbnN0IGRhdGVFeGNlbCA9IHt9O1xuICAgICAgICBjb25zdCBkYXRhQ2FydGUgPSB7fTtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gKGRhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKTtcbiAgICAgICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSsxO1xuICAgICAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9kdWN0cyA9IHJlZih7fSk7XG4gICAgICAgIGNvbnN0IG1ldGFLZXkgPSByZWYodHJ1ZSk7XG5cbi8vQ0VOVFJBTEUgREUgQ09NTVVOSUNBVElPTlxuICAgICAgICAvLyBGb25jdGlvbiBwb3VyIHLDqWN1cMOpcmVyIGxlcyBpbml0aWF1eCBkZXB1aXMgbCdBUEkgU3ltZm9ueVxuXG4gICAgICAgIGZ1bmN0aW9uIGZldGNoUG9pbnRzKGNsdXN0ZXJfaWQpeyAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAvLyB5b3VyIG9wdGlvbnMuLi4gbWV0aG9kOiBQT1NULCBoZWFkZXJzLCBjb3JzLCBldGMuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGUudmFsdWU9JydcbiAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL2NsdXN0ZXIvJytjbHVzdGVyX2lkLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWIudmFsdWUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0YS5zdGF0dXMnK2RhdGEuc3RhdHVzKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWRpcmVjdGlvbiBmb3Jjw6llIHZlcnMgbGEgcGFnZSBkZSBsb2dpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NoYXJnZW1lbnQgcG9pbnRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlID0gZGF0YS5yZXNwb25zZS5tYXAocCA9PiAoeyAuLi5wLCBpc0VkaXRpbmc6IGZhbHNlLCBvcmlnaW5hbDoge30sIHNlbGVjdGVkOiBmYWxzZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdEl0ZW0gPSBwb2ludHMudmFsdWUuZmluZCh4PT54IT09dW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VhcmNoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gc2VhcmNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFBvaW50KHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiBjb25zb2xlLmxvZyhlcnJvcikpIC8vIGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCBlcnJvclxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGZldGNoUG9pbnRzT3BlcmF0aW9uKCl7ICAgICAgXG4gICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0NoYXJnZW1lbnQgZW4gY291cnMnO1xuICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7ICBcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC8vIHlvdXIgb3B0aW9ucy4uLiBtZXRob2Q6IFBPU1QsIGhlYWRlcnMsIGNvcnMsIGV0Yy5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0ZS52YWx1ZT0nJ1xuICAgICAgICAgICAgICAgIEZ1bmN0aW9ucy5tYWtlUmVxdWVzdCgnL2FwaS9wb2ludHMvcGxhbm5pbmcvJytvcGVyYXRpb25JRC52YWx1ZSwgb3B0aW9ucykvLytvcGVyYXRpb25JRC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWIudmFsdWUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0YS5zdGF0dXMnK2RhdGEuc3RhdHVzKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWRpcmVjdGlvbiBmb3Jjw6llIHZlcnMgbGEgcGFnZSBkZSBsb2dpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NoYXJnZW1lbnQgcG9pbnRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlID0gZGF0YS5yZXNwb25zZS5tYXAocCA9PiAoeyAuLi5wLCBpc0VkaXRpbmc6IGZhbHNlLCBvcmlnaW5hbDoge30sIHNlbGVjdGVkOiBmYWxzZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdEl0ZW0gPSBwb2ludHMudmFsdWUuZmluZCh4PT54IT09dW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VhcmNoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gc2VhcmNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFBvaW50KHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiBjb25zb2xlLmxvZyhlcnJvcikpIC8vIGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCBlcnJvclxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGNoYW5nZV9hbGVydGUocG9pbnQpeyAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAvLyB5b3VyIG9wdGlvbnMuLi4gbWV0aG9kOiBQT1NULCBoZWFkZXJzLCBjb3JzLCBldGMuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy9hbGVydGUvJytwb2ludC5pZCsnLycrcG9pbnQuYWxlcnRlLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IGNvbnNvbGUubG9nKGVycm9yKSkgLy8gZG8gc29tZXRoaW5nIHVzZWZ1bCB3aXRoIGVycm9yXG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0SW5mb3MoZGF0YSl7ICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHBvaW50czogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRlLnZhbHVlPScnXG4gICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy9nZXRWMi8nLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhdGEuc3RhdHVzJytkYXRhLnN0YXR1cylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlc3BvbnNlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXgyID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRJbmRleDIgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleDJdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleDMgPSBmaWx0ZXJlZFBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBlbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRQb2ludHMudmFsdWVbcG9pbnRJbmRleDNdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBmcm96ZW5Qb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gZWxlbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plblBvaW50cy52YWx1ZVtwb2ludEluZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNhcnRlLmNsdXN0ZXJJZCA9IGVsZW1lbnQuY2x1c3RlcjU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNhcnRlLm1pc3Npb24gPSBlbGVtZW50Lm1pc3Npb24uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NhcnRlLXJlZnJlc2gnLCBkYXRhQ2FydGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSBwcm9kdWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgnVW5lIGVycmV1ciBzXFwnZXN0IHByb2R1aXRlIG91IHZvdXMgw6p0ZXMgZMOpY29ubmVjdMOpJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZU1lcmN1cmVNZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTsgXG4gICAgICAgICAgICBkYXRhLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gZWxlbWVudC5hY3Rpb247XG4gICAgICAgICAgICAgICAgdmFyIHJlZnJlc2hfY3JlbmVhdSA9IDA7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgLy9taXNlIMOgIGpvdXIgZGVzIGNsdXN0ZXJzIGNvbXBsZXRcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2x1c3Rlcl9jb21wbGV0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NsdXN0ZXJzY29tcGxldGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogZWxlbWVudCwgLy8gUGFzcyB5b3VyIGRhdGEgaW4gdGhlICdkZXRhaWwnIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Byb2R1Y3RfdXBkYXRlZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdldEluZm9zKGVsZW1lbnQucG9pbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaF9jcmVuZWF1ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NyZW5lYXVfdXBkYXRlZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVuZWF1X3VwZGF0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaF9jcmVuZWF1ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsVXBkYXRlKGVsZW1lbnQuZG9ubmVlcy5ub21icmUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYocmVmcmVzaF9jcmVuZWF1ID09IDEpe1xuICAgICAgICAgICAgICAgIGJ1cy5lbWl0KCdjcmVuZWF1LXVwZGF0ZWQnLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuLy8gSU5URVJGQUNFXG5cbiAgICAgICAgY29uc3QgYWdlbnRzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxBZ2VudHNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gKHBvaW50LmFnZW50Lm5vbSsnICcrKHBvaW50LmFnZW50LnByZW5vbT8/JycpKSlcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUFnZW50U2V0ID0gbmV3IFNldChhbGxBZ2VudHNXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVBZ2VudFNldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB2aWxsZXMgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbENpdGllc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC52aWxsZSk7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVDaXR5U2V0ID0gbmV3IFNldChhbGxDaXRpZXNXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVDaXR5U2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHF1YXJ0aWVycyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsUXVhcnRpZXJzV2l0aER1cGxpY2F0ZXMgPSBwb2ludHMudmFsdWUubWFwKHBvaW50ID0+IHBvaW50LnF1YXJ0aWVyKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVF1YXJ0aWVyU2V0ID0gbmV3IFNldChhbGxRdWFydGllcnNXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVRdWFydGllclNldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBydWVzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxSdWVzV2l0aER1cGxpY2F0ZXMgPSBwb2ludHMudmFsdWUubWFwKHBvaW50ID0+IHBvaW50Lm5vbVJ1ZSk7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVSdWVTZXQgPSBuZXcgU2V0KGFsbFJ1ZXNXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVSdWVTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZW1wbGFjZW1lbnRzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxMaWJlbGxlc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC5lbXBsYWNlbWVudENvbXB0ZXVyKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUxpYmVsbGVzU2V0ID0gbmV3IFNldChhbGxMaWJlbGxlc1dpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZUxpYmVsbGVzU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRhdGVzUlYgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbERhdGVzUlZXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnRfUlYocG9pbnQpKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZWFsbERhdGVzUlZTZXQgPSBuZXcgU2V0KGFsbERhdGVzUlZXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVhbGxEYXRlc1JWU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBsYW5pZlJWID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcG9pbnRzVGVtcCA9IFtdXG4gICAgICAgICAgICBwb2ludHNUZW1wLnZhbHVlID0gcG9pbnRzLnZhbHVlLmZpbHRlcihwb2ludCA9PiBwb2ludC5ldGF0LmlkID09PSA1KVxuICAgICAgICAgICAgY29uc3QgbGFzdERhdGVzUGVyUG9pbnQgPSBwb2ludHNUZW1wLnZhbHVlLm1hcChwb2ludCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nc1BsYW5pZmllcyA9IChwb2ludC5sb2dldGF0cyB8fCBbXSkuZmlsdGVyKGxvZyA9PiBsb2cuZXRhdC5pZCA9PT0gNSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobG9nc1BsYW5pZmllcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgLy8gMi4gT24gcsOpY3Vww6hyZSBVTklRVUVNRU5UIGxlIGRlcm5pZXIgbG9nIGRlIGxhIGxpc3RlIChsZSBwbHVzIHLDqWNlbnQpXG4gICAgICAgICAgICAgICAgY29uc3QgZGVybmllckxvZyA9IGxvZ3NQbGFuaWZpZXNbbG9nc1BsYW5pZmllcy5sZW5ndGggLSAxXTtcblxuICAgICAgICAgICAgICAgIC8vIDMuIE9uIGV4dHJhaXQgbGEgZGF0ZSBkdSBjb21tZW50YWlyZSAoZXg6IFwiMDktMDItMjAyNlwiKVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gZGVybmllckxvZy5kYXRlY3JlYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaCA6IG51bGw7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gNC4gT24gbmV0dG9pZSA6IG9uIGVubMOodmUgbGVzIG51bGwgKHBvaW50cyBzYW5zIFJWKSBldCBvbiBkw6lkb3VibG9ubmUgYXZlYyBTZXRcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZURhdGVzID0gQXJyYXkuZnJvbShuZXcgU2V0KGxhc3REYXRlc1BlclBvaW50LmZpbHRlcihkID0+IGQgIT09IG51bGwpKSk7XG5cbiAgICAgICAgICAgIC8vIDUuIE9uIHRyaWUgcGFyIG9yZHJlIGNocm9ub2xvZ2lxdWUgKFlZWVktTU0tREQpXG4gICAgICAgICAgICByZXR1cm4gdW5pcXVlRGF0ZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVBID0gYS5zcGxpdCgnLScpLnJldmVyc2UoKS5qb2luKCcnKTsgLy8gXCIwOS0wMi0yMDI2XCIgLT4gXCIyMDI2MDIwOVwiXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZUIgPSBiLnNwbGl0KCctJykucmV2ZXJzZSgpLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlQS5sb2NhbGVDb21wYXJlKGRhdGVCKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBwb2ludF9SVihwb2ludCl7XG4gICAgICAgICAgaWYocG9pbnQuY3JlbmVhdSl7IFxuICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSl7cmV0dXJuIHBvaW50LmNyZW5lYXUuZGF0ZTt9ZWxzZXtyZXR1cm4gJ1NhbnMgUlYnO31cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZXtyZXR1cm4gJ1NhbnMgUlYnO31cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNvbmRpdGlvbl9wb2ludF9QbGFuaWYocG9pbnQsIGRhdGVSVil7XG4gICAgICAgICAgICAgIGlmKHBvaW50LmxvZ2V0YXRzKXsgXG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGxvZ2V0YXQgb2YgcG9pbnQubG9nZXRhdHMpIHtcblxuICAgICAgICAgICAgICAgICAgICAgaWYobG9nZXRhdC5kYXRlY3JlYSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZigobG9nZXRhdC5kYXRlY3JlYSA9PSBkYXRlUlYpICYmIChwb2ludC5ldGF0LmlkID09IDUpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkYXRlUlYnK2xvZ2V0YXQuZGF0ZWNyZWErJyAnK2RhdGVSVilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2V0YXQuZGF0ZWNyZWEgPT0gJ1NhbnMgUlYnKXtyZXR1cm4gdHJ1ZTt9XG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAgICAgXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBpZihkYXRlUlYgPT0gJ1NhbnMgUlYnKXtyZXR1cm4gdHJ1ZTt9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb3ByacOpdMOpIGNhbGN1bMOpZSBxdWkgcmVudmVycmEgbGEgbGlzdGUgZmlsdHLDqWUgw6AgbGEgRGF0YVRhYmxlXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkUG9pbnRzID0gY29tcHV0ZWQoKCkgPT4ge1xuXG4gICAgICAgICAgICAvLyBTaSBvbiBuJ2EgcGFzIGVuY29yZSBkZSBkb25uw6llcywgb24gcmVudm9pZSB1biB0YWJsZWF1IHZpZGVcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbiBjb21tZW5jZSBhdmVjIHVuZSBjb3BpZSBkZSB0b3V0ZXMgbGVzIGRvbm7DqWVzXG4gICAgICAgICAgICBsZXQgcG9pbnRzVG9GaWx0ZXIgPSBbLi4ucG9pbnRzLnZhbHVlXTtcblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBub21cbiAgICAgICAgICAgIGlmIChzZWFyY2hOb20udmFsdWUgJiYgc2VhcmNoTm9tLnZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOb20udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgLy8gQWpvdXRleiBpY2kgdG91IGxlcyBjaGFtcHMgZGFucyBsZXNxdWVscyB2b3VzIHZvdWxleiBjaGVyY2hlclxuICAgICAgICAgICAgICAgICAgICBwb2ludC5ub20udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlckNhc2VTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBOdW1lcm9QaHlzaXF1ZVxuICAgICAgICAgICAgaWYgKHNlYXJjaE51bWVyb1BoeXNpcXVlLnZhbHVlICYmIHNlYXJjaE51bWVyb1BoeXNpcXVlLnZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5udW1lcm9QaHlzaXF1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyQ2FzZVNlYXJjaClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaWx0cmUgcGFyIE51bWVyb0NsaWVudFxuICAgICAgICAgICAgaWYgKHNlYXJjaE51bWVyb0NsaWVudC52YWx1ZSAmJiBzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyQ2FzZVNlYXJjaCA9IHNlYXJjaE51bWVyb0NsaWVudC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5udW1lcm9DbGllbnQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlckNhc2VTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBOb21SdWVcbiAgICAgICAgICAgIGlmIChzZWFyY2hOb21SdWUudmFsdWUgJiYgc2VhcmNoTm9tUnVlLnZhbHVlLnRyaW0oKSAhPT0gJ1RvdXRlcycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOb21SdWUudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubm9tUnVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBWaWxsZVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygndmlsbGUnK3NlYXJjaFZpbGxlLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaFZpbGxlLnZhbHVlICYmIHNlYXJjaFZpbGxlLnZhbHVlICE9PSAnVG91dGVzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC52aWxsZSA9PT0gc2VhcmNoVmlsbGUudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgVGVsXG4gICAgICAgICAgICBpZiAoc2VhcmNoVGVsLnZhbHVlICYmIHNlYXJjaFRlbC52YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQudGVsMS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlbC52YWx1ZSl8fHBvaW50LnRlbDIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZWwudmFsdWUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIFF1YXJ0aWVyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWFydGllcicrc2VhcmNoUXVhcnRpZXIudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoUXVhcnRpZXIudmFsdWUgJiYgc2VhcmNoUXVhcnRpZXIudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5xdWFydGllciA9PT0gc2VhcmNoUXVhcnRpZXIudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIEFnZW50XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWFydGllcicrc2VhcmNoUXVhcnRpZXIudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoQWdlbnQudmFsdWUgJiYgc2VhcmNoQWdlbnQudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICAocG9pbnQuYWdlbnQubm9tKycgJysocG9pbnQuYWdlbnQucHJlbm9tPz8nJykpID09PSBzZWFyY2hBZ2VudC52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgRW1wbGFjZW1lbnRcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3F1YXJ0aWVyJytzZWFyY2hRdWFydGllci52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hFbXBsYWNlbWVudC52YWx1ZSAmJiBzZWFyY2hFbXBsYWNlbWVudC52YWx1ZSAhPT0gJ1RvdXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmVtcGxhY2VtZW50Q29tcHRldXIgPT09IHNlYXJjaEVtcGxhY2VtZW50LnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIERhdGVSVlxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncXVhcnRpZXInK3NlYXJjaFF1YXJ0aWVyLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaERhdGVSVi52YWx1ZSAmJiBzZWFyY2hEYXRlUlYudmFsdWUgIT09ICdUb3V0ZXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9wb2ludF9SVihwb2ludCwgc2VhcmNoRGF0ZVJWLnZhbHVlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWFyY2hQbGFuaWZSVi52YWx1ZSAmJiBzZWFyY2hQbGFuaWZSVi52YWx1ZSAhPT0gJ1RvdXRlcycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uX3BvaW50X1BsYW5pZihwb2ludCwgc2VhcmNoUGxhbmlmUlYudmFsdWUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiBjb25kaXRpb25fcG9pbnRfUlYocG9pbnQsIGRhdGVSVil7XG4gICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUpeyBcbiAgICAgICAgICAgICAgICAgaWYocG9pbnQuY3JlbmVhdS5kYXRlKXtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSA9PSBkYXRlUlYpe3JldHVybiB0cnVlO31cbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgaWYoZGF0ZVJWID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBpZihkYXRlUlYgPT0gJ1NhbnMgUlYnKXtyZXR1cm4gdHJ1ZTt9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBjb25kaXRpb25fcG9pbnRfUGxhbmlmKHBvaW50LCBkYXRlUlYpe1xuICAgICAgICAgICAgICBpZihwb2ludC5sb2dldGF0cyl7IFxuICAgICAgICAgICAgICAgIGZvcihjb25zdCBsb2dldGF0IG9mIHBvaW50LmxvZ2V0YXRzKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2V0YXQuZGF0ZWNyZWEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGxvZ2V0YXQuZGF0ZWNyZWEgPT0gZGF0ZVJWKSAmJiAocG9pbnQuZXRhdC5pZCA9PSA1KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0ZVJWJytsb2dldGF0LmRhdGVjcmVhKycgJytkYXRlUlYpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dldGF0LmRhdGVjcmVhID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgaWYoZGF0ZVJWID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIEV0YXRcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2V0YXQnK3NlYXJjaEV0YXQudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoRXRhdC52YWx1ZSAmJiBzZWFyY2hFdGF0LnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQuZXRhdC5pZCA9PT0gc2VhcmNoRXRhdC52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgQ2x1c3RlciAxXG4gICAgICAgICAgICBpZiAoc2VhcmNoQ2x1c3RlcjEudmFsdWUgJiYgc2VhcmNoQ2x1c3RlcjEudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNsdXN0ZXIxID09PSBzZWFyY2hDbHVzdGVyMS52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgQ2x1c3RlciAyXG4gICAgICAgICAgICBpZiAoc2VhcmNoQ2x1c3RlcjIudmFsdWUgJiYgc2VhcmNoQ2x1c3RlcjIudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNsdXN0ZXIyID09PSBzZWFyY2hDbHVzdGVyMi52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgQ2x1c3RlciAzXG4gICAgICAgICAgICBpZiAoc2VhcmNoQ2x1c3RlcjMudmFsdWUgJiYgc2VhcmNoQ2x1c3RlcjMudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNsdXN0ZXIzID09PSBzZWFyY2hDbHVzdGVyMy52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgQ2x1c3RlciA0XG4gICAgICAgICAgICBpZiAoc2VhcmNoQ2x1c3RlcjQudmFsdWUgJiYgc2VhcmNoQ2x1c3RlcjQudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNsdXN0ZXI0ID09PSBzZWFyY2hDbHVzdGVyNC52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgQ2x1c3RlciA1XG4gICAgICAgICAgICBpZiAoc2VhcmNoQ2x1c3RlcjUudmFsdWUgJiYgc2VhcmNoQ2x1c3RlcjUudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNsdXN0ZXI1ID09PSBzZWFyY2hDbHVzdGVyNS52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBEYXRlUlZcbiAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25fc2VsZWN0ZWQocG9pbnQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbmRpdGlvbl9zZWxlY3RlZChwb2ludCl7XG4gICAgICAgICAgICAgICAgIGlmKHBvaW50LmZyb3plbil7XG4gICAgICAgICAgICAgICAgICAgICAgaWYocG9pbnQuZnJvemVuID09IHRydWUpe3JldHVybiBmYWxzZTt9XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBBbGVydGVcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHNlYXJjaEFsZXJ0ZS52YWx1ZSAhPT0gJ1RvdXMnKSB7XG4gICAgICAgICAgICAgICAgaWYoc2VhcmNoQWxlcnRlLnZhbHVlID09ICd0cnVlJyl7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQuYWxlcnRlID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoc2VhcmNoQWxlcnRlLnZhbHVlID09ICdmYWxzZScpe1xuICAgICAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LmFsZXJ0ZSA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb3VudC52YWx1ZSA9IHBvaW50c1RvRmlsdGVyLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBwb2ludHNUb0ZpbHRlcjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2xlYXJGaWx0ZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBzZWFyY2hOb20udmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaEV0YXQudmFsdWUgPSAnVG91cyc7XG4gICAgICAgICAgICBzZWFyY2hRdWFydGllci52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaEVtcGxhY2VtZW50LnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgc2VhcmNoVGVsLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hWaWxsZS52YWx1ZSA9ICdUb3V0ZXMnO1xuICAgICAgICAgICAgc2VhcmNoTm9tUnVlLnZhbHVlID0gJ1RvdXRlcyc7XG4gICAgICAgICAgICBzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUgID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZSAgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaENsdXN0ZXIxLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hDbHVzdGVyMi52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoQ2x1c3RlcjMudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaENsdXN0ZXI0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hDbHVzdGVyNS52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoRGF0ZVJWLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hBbGVydGUudmFsdWUgPSAnVG91cyc7XG4gICAgICAgICAgICBzZWFyY2hBZ2VudC52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb24gcmVjb2l0IHVuIG1lc3NhZ2UgZGUgbGVhZmxldFxuICAgICAgICBjb25zdCB1cGRhdGVDbHVzdGVyID0gKGNsdXN0ZXJTZWFyY2gpID0+IHtcbiAgICAgICAgICAgIGNsZWFyRmlsdGVyKCk7XG4gICAgICAgICAgICBldmFsKCdzZWFyY2hDbHVzdGVyJytjbHVzdGVyU2VhcmNoLnR5cGUrJy52YWx1ZSA9ICcrY2x1c3RlclNlYXJjaC52YWx1ZSk7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjbGljIHJlY2lldmVkJyArIGNsdXN0ZXJTZWFyY2gudHlwZSArJ2lkJysgKyBjbHVzdGVyU2VhcmNoLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb24gcsOpaW5pdGFsaXNlIGwnYWZmaWNoYWdlLCBvbiBsw6h2ZSBsZSBsb2NrXG4gICAgICAgIGNvbnN0IGdsb2JhbEV4dGVybmFsQ2FsbCA9IChjbHVzdGVyX2lkLCBzZWwpID0+IHtcbiAgICAgICAgICAgIC8vc2VuZExvY2sobnVsbCwgMik7XG4gICAgICAgICAgICBzZWFyY2ggPSBzZWw7XG4gICAgICAgICAgICBmZXRjaFBvaW50cyhjbHVzdGVyX2lkKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UG9pbnQgPSAoaWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzLnZhbHVlLmZpbmQocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAocG9pbnQpIHtcbiAgICAgICAgICAgICAgICBwb2ludC5vcmlnaW5hbCA9IHsgLi4ucG9pbnQgfTtcbiAgICAgICAgICAgICAgICBwb2ludC5pc0VkaXRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3BvaW50QycrcG9pbnQuaWQpO1xuICAgICAgICAgICAgICAgIGlmIChwb2ludC5jcmVuZWF1ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNyZW5lYXUgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQuY3JlbmVhdS5pZCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3NlbmRMb2NrKHBvaW50LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjYW5jZWxFZGl0ID0gKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgIGlmIChwb2ludEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XSA9IHsgLi4ucG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLm9yaWdpbmFsLCBpc0VkaXRpbmc6IGZhbHNlLCBvcmlnaW5hbDoge30gfTtcbiAgICAgICAgICAgICAgICAvL3NlbmRMb2NrKHBvaW50cy52YWx1ZVtwb2ludEluZGV4XSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHNlbmRFdGF0ID0gYXN5bmMoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9wb2ludHMvdXBkYXRlVjIvJytpZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YXQ6IDZcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnTW9kaWZpY2F0aW9uIGVudm95w6llIMOgIFN5bWZvbnkuIEF0dGVudGUgZGUgbGEgbWlzZSDDoCBqb3VyIE1lcmN1cmUuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdGaWNoZSBtaXNlIMOgIGpvdXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0luZm8nLCBkZXRhaWw6IG1lc3NhZ2V1ci52YWx1ZSwgbGlmZTogMzAwMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJvZHVjdC5pc0VkaXRpbmcgPSBmYWxzZTsgLy8gU29ydGlyIGR1IG1vZGUgw6lkaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3BvaW50cy52YWx1ZVtwb2ludEluZGV4XSA9IHByb2R1Y3QudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoXCJFcnJldXIgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGR1IHByb2R1aXQ6XCIsIGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkZSBsYSBmaWNoZSA6ICcrYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0luZm8nLCBkZXRhaWw6IG1lc3NhZ2V1ci52YWx1ZSwgbGlmZTogMzAwMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciByw6lzZWF1IGxvcnMgZGUgbGEgc2F1dmVnYXJkZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZW5kSW5mb3MgPSBhc3luYyhpZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3BvaW50cy91cGRhdGVWMi8nK2lkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcHJvZHVjdC52YWx1ZS5jb21tZW50YWlyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlOiBwcm9kdWN0LnZhbHVlLmNvbXB0ZXVyQWNjZXNzaWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXZpbGl0ZTogcHJvZHVjdC52YWx1ZS5jaXZpbGl0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub206IHByb2R1Y3QudmFsdWUubm9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyb0NsaWVudDogcHJvZHVjdC52YWx1ZS5udW1lcm9DbGllbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsMTogcHJvZHVjdC52YWx1ZS50ZWwxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbDI6IHByb2R1Y3QudmFsdWUudGVsMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbDogcHJvZHVjdC52YWx1ZS5lbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGF0OiBwcm9kdWN0LnZhbHVlLmV0YXQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnQ6IHByb2R1Y3QudmFsdWUuYWdlbnQuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0ZpY2hlIG1pc2Ugw6Agam91cic7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5pc0VkaXRpbmcgPSBmYWxzZTsgLy8gU29ydGlyIGR1IG1vZGUgw6lkaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdID0gcHJvZHVjdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVEaWFsb2coKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZHUgcHJvZHVpdDpcIiwgYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdFcnJldXIgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGRlIGxhIGZpY2hlIDogJythd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIHLDqXNlYXUgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZW5kUHJvZ3JhbW1lcigpIHtcblxuICAgICAgICAgIGlmKGZyb3plblBvaW50cy52YWx1ZS5sZW5ndGggPT0gMCl7YWxlcnQoJ01lcmNpIGRlIHPDqWxlY3Rpb25uZXIgYXUgbW9pbnMgdW4gcG9pbnQnKTtyZXR1cm47fVxuXG4gICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHNlbmRFdGF0KGVsZW1lbnQuaWQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZT0gW107XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzZW5kRXhjZWwoKXtcbiAgICAgICAgICAgIGhpZGVEaWFsb2coKTtcbiAgICAgICAgICAgIGxldCBjaGFpbmUgPSAnJztcbiAgICAgICAgICAgIGZyb3plblBvaW50cy52YWx1ZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY2hhaW5lID0gY2hhaW5lICsgZWxlbWVudC5pZCArICcsJztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBmaWx0ZXJlZFBvaW50cy52YWx1ZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY2hhaW5lID0gY2hhaW5lICsgZWxlbWVudC5pZCArICcsJztcblxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNoYWluZS5zbGljZSgwLCAtMSlcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZldGNoKCcvYWRtaW4vZXhjZWwvZXhwb3J0LycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5lOiBjaGFpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uX2lkOiBvcGVyYXRpb25JRC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpLnRoZW4oZGF0YSA9PiB3aW5kb3cub3BlbihVUkwuY3JlYXRlT2JqZWN0VVJMKGRhdGEpKSlcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgZXhjZWxcIik7XG4gICAgICAgICAgICAgfSAgIFxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2VuZEV4Y2VsQ3Jvbigpe1xuICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2goJy9hZG1pbi9leGNlbC9leHBvcnRDcm9uLycrcHJvcHMucGFyYW0ub3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnRXhwb3J0IGVuIGNvdXJzJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgZXhjZWxcIik7XG4gICAgICAgICAgICAgfSAgIFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VuZExvY2sgPSBhc3luYyhwb2ludCwgbG9ja2luZykgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVudm95ZXIgbGVzIG1vZGlmaWNhdGlvbnMgw6AgbCdBUEkgU3ltZm9ueVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAvYXBpL3BvaW50cy9sb2NraW5nL2ArcG9pbnQuaWQrJy8nK2xvY2tpbmcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHt9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkdSBwcm9kdWl0OlwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciByw6lzZWF1IGxvcnMgZGUgbGEgc2F1dmVnYXJkZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXN0YW5jZVVwZGF0ZSA9IChwb2ludCwgZGlzdGFuY2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IHBvaW50KTtcbiAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1Lm9wZXJhdGlvbiA9IHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5vcGVydGFpb24uaWQ7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUucG9pbnQgPSBwb2ludDtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LmRhdGUgPSAwO1xuICAgICAgICAgICAgICAgIGJ1cy5lbWl0KCdjcmVuZWF1LXRvVXBkYXRlJywgZGF0YUNyZW5lYXUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FydGVVcGRhdGUgPSAocG9pbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IHBvaW50KTtcbiAgICAgICAgICAgICAgICBkYXRhQ2FydGUuY2x1c3RlcklkID0gcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmNsdXN0ZXI1O1xuICAgICAgICAgICAgICAgIGJ1cy5lbWl0KCdjYXJ0ZS10b1VwZGF0ZScsIGRhdGFDYXJ0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbFVwZGF0ZSA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWN1bm9tYnJlJytkYXRhKTtcbiAgICAgICAgICAgICAgIHZhbHVlLnZhbHVlID0gTWF0aC5yb3VuZChkYXRhKjEwMCAvIHRvdGFsLnZhbHVlKTtcbiAgICAgICAgICAgICAgIG5vbWJyZS52YWx1ZSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGZ1bmN0aW9uIHNlbGVjdGVkUG9pbnRzKCkge1xuICAgICAgICAgIHJldHVybiBwb2ludHMudmFsdWUuZmlsdGVyKHBvaW50ID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cocG9pbnQuc2VsZWN0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuIChwb2ludC5zZWxlY3RlZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gc2VhcmNoRGF0ZUNyZW5lYXUoaWQpIHtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5wb2ludCA9IGlkO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LmRpc3RhbmNlID0gJ3Jlc2V0JztcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5kYXRlID0gZm9ybWF0RGF0ZShkYXRlLnZhbHVlKTtcbiAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NyZW5lYXUtdG9VcGRhdGUnLCBkYXRhQ3JlbmVhdSk7XG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJMYSBkYXRlIGEgw6l0w6kgc8OpbGVjdGlvbm7DqWUgOlwiLCBmb3JtYXREYXRlKGRhdGUudmFsdWUpKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlVG9Gb3JtYXQpe1xuICAgICAgICAgIGlmICghZGF0ZVRvRm9ybWF0KSByZXR1cm4gJyc7XG4gICAgICAgICAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGVUb0Zvcm1hdC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZVRvRm9ybWF0LmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOyAvLyBMZXMgbW9pcyBzb250IGluZGV4w6lzIMOgIHBhcnRpciBkZSAwXG4gICAgICAgICAgY29uc3QgeWVhciA9IGRhdGVUb0Zvcm1hdC5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb25DaGFuZ2VNaXNzaW9uKCl7XG4gICAgICAgICAgICBpZiAoc2VhcmNoTWlzc2lvbi52YWx1ZSAmJiBzZWFyY2hNaXNzaW9uLnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgbWlzc2lvbklELnZhbHVlID0gc2VhcmNoTWlzc2lvbi52YWx1ZTtcbiAgICAgICAgICAgICAgIGZldGNoUG9pbnRzTWlzc2lvbihtaXNzaW9uSUQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb25Ecm9wID0gYXN5bmMoZXZ0LCBsaXN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbUlEID0gZXZ0LmRhdGFUcmFuc2Zlci5nZXREYXRhKCdpdGVtSUQnKVxuICAgICAgICAgIGNvbnN0IGFnZW50SUQgPSBldnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ2FnZW50SUQnKVxuICAgICAgICAgIGNvbnN0IHRvdGFsQ3JlbmVhdSA9IGV2dC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndG90YWxDcmVuZWF1JylcbiAgICAgICAgICBpZih0b3RhbENyZW5lYXUgPj0zMCl7XG4gICAgICAgICAgICBpZiAoIXdpbmRvdy5jb25maXJtKFwiQXR0ZW50aW9uLCBtYXggMzAgcGFyIGNyw6luZWF1IGhvcmFpcmUgOiBzb3VoYWl0ZXogdm91cyBjb25maXJtZXIgP1wiKSl7cmV0dXJuO31cbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IGNvbmZpcm0gPSAwO1xuICAgICAgICAgIHNlbGVjdGVkID0gJ1wic2VsZWN0ZWRcIiA6IFsnO1xuICAgICAgICAgIGlmKGZyb3plblBvaW50cy52YWx1ZS5sZW5ndGggPT0gMCl7YWxlcnQoJ01lcmNpIGRlIHPDqWxlY3Rpb25uZXIgYXUgbW9pbnMgdW4gcG9pbnQnKTtyZXR1cm47fVxuICAgICAgICAgIGZyb3plblBvaW50cy52YWx1ZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkICsgZWxlbWVudC5pZCArIFwiLFwiO1xuICAgICAgICAgICAgaWYoZWxlbWVudC5hZ2VudC5pZCAhPSBhZ2VudElEKXtjb25maXJtID0gMTt9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2VsZWN0ZWQgPSBzZWxlY3RlZC5zbGljZSgwLCAtMSkgKyAnXSc7XG4gICAgICAgICAgc2VsZWN0ZWQgPSAne1wiaWRcIjonKyBpdGVtSUQgKyAnLCcgKyBzZWxlY3RlZCArJ30nO1xuICAgICAgICAgIGlmKGNvbmZpcm0gPT0gMSl7XG4gICAgICAgICAgICBpZiAoIXdpbmRvdy5jb25maXJtKFwiQXR0ZW50aW9uLCBhZ2VudHMgZGlmZsOpcmVudHMgOiBzb3VoYWl0ZXogdm91cyBjb25maXJtZXIgP1wiKSl7cmV0dXJuO31cbiAgICAgICAgICB9XG4gICAgICAgICAgLy9jb25zb2xlLmxvZygnc2VsZWN0ZWQnICsgc2VsZWN0ZWQpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVudm95ZXIgbGVzIG1vZGlmaWNhdGlvbnMgw6AgbCdBUEkgU3ltZm9ueVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAvYXBpL3BvaW50cy9jcmVuZWF1L3VwZGF0ZS9gLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIHLDqXNlYXUgdXBkYXRlIGNlcmVuYXUgOlwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIHLDqXNlYXUgdXBkYXRlIGNlcmVuYXVcIik7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vcmVzZXQgZGVzIGZyb3plblxuICAgICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZT1bXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRUZWwgPSBhc3luYyhwb2ludCwgdGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYodGVsLmxlbmd0aCA9PSA5KXt0ZWwgPSAnMCcgKyB0ZWw7fVxuICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKCd0ZWw6Jyt0ZWwsICdfYmxhbmsnKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdGVsLycrcG9pbnQuaWQrJy9zZW5kJywge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyYW50VGVsID0gYXN5bmMocG9pbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3RlbC8nK3BvaW50LmlkKycvZW50cmFudCcsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ1RlbCBlbnRyYW50IGVucmVnaXN0csOpJztcbiAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbmRTTVMgPSBhc3luYyhwb2ludCwgdGVsLCBtZXNzYWdlSUQpID0+IHtcbiAgICAgICAgICAgICAgICBpZih0ZWwubGVuZ3RoID09IDkpe3RlbCA9ICcwJyArIHRlbDt9XG4gICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSBtZXNzYWdlcy52YWx1ZS5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmlkID09PSBtZXNzYWdlSURcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgbWVzc2FnZXRlbXAudmFsdWUgPSBtZXNzYWdlLnZhbHVlWzBdLnRleHRlLnJlcGxhY2UoXCJOT01cIiwgcG9pbnQuY2l2aWxpdGUrJyAnK3BvaW50Lm5vbSk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXRlbXAudmFsdWUgPSBtZXNzYWdldGVtcC52YWx1ZS5yZXBsYWNlKFwiQURSRVNTRVwiLCBwb2ludC5udW1lcm9SdWUrJyAnKyBwb2ludC50aXRyZVJ1ZSsnICcrcG9pbnQubm9tUnVlKycgJytwb2ludC5jb2RlUG9zdGFsKycgJytwb2ludC52aWxsZSk7XG4gICAgICAgICAgICAgICAgbGV0IGxpZW4gPSAgJ2h0dHBzOi8vJyt3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUrJy9lYWUvY29ubmVjdC8nK29wZXJhdGlvbklELnZhbHVlKycvJytwb2ludC5pZDtcbiAgICAgICAgICAgICAgICBtZXNzYWdldGVtcC52YWx1ZSA9IG1lc3NhZ2V0ZW1wLnZhbHVlLnJlcGxhY2UoXCJMSUVOXCIsIGxpZW4pO1xuICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUpe1xuICAgICAgICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXRlbXAudmFsdWUgPSBtZXNzYWdldGVtcC52YWx1ZS5yZXBsYWNlKFwiREFURVwiLCBwb2ludC5jcmVuZWF1LmRhdGUrJyAnKyBwb2ludC5jcmVuZWF1LmNyZW5lYXVIb3JhaXJlLm5vbSArJyBBZ2VudCA6ICcrcG9pbnQuY3JlbmVhdS5hZ2VudC5ub20pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBlbmNvZGVkVGV4dCA9IGVuY29kZVVSSUNvbXBvbmVudChtZXNzYWdldGVtcC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQXN0dWNlIHBvdXIgY29tcGF0aWJpbGl0w6kgaU9TIHZzIEFuZHJvaWRcbiAgICAgICAgICAgICAgICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdmFyIGlzaU9TID0gL2lwaG9uZXxpcGFkfGlwb2QvLnRlc3QodWEpO1xuICAgICAgICAgICAgICAgIHZhciBzZXBhcmF0b3IgPSBpc2lPUyA/ICcmJyA6ICc/JztcblxuICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKCdzbXM6JyArIHRlbCArIHNlcGFyYXRvciArICdib2R5PScgKyBlbmNvZGVkVGV4dCwgJ19ibGFuaycpLmZvY3VzKCk7XG5cbiAgICAgICAgICAgICAgICAvKiovXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9zbXMvJytwb2ludC5pZCsnLycrbWVzc2FnZS52YWx1ZVswXS5pZCsnL3NlbmQnLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgLy8gbWVzc2FnZXVyPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZW5kRW1haWwgPSBhc3luYyhpZCwgbWVzc2FnZV9JRCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL21haWwvJytpZCsnLycrbWVzc2FnZV9JRCsnL21haWxzZW5kJywge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHttZXNzYWdldXIudmFsdWUgPSBcIkVycmV1ciBlbnZvaSBtYWlsXCI7fVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSBkYXRhLmRhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIHLDqXNlYXVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJldXIgcsOpc2VhdVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlbGV0ZV9sb2c9IGFzeW5jKGlkKSA9PiB7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9sb2cvZGVsZXRlLycraWQsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7bWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgZW52b2kgZGVsZXRlXCI7fVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnZGVsZXRlIG9rJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciByw6lzZWF1XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93Q2xhc3MgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7ICdjdXN0b20tZnJvemVuLXJvdyc6IGRhdGEuZnJvemVuIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2hlY2tUZWwgPSAodGVsKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghdGVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gL14oNnwwNnw3fDA3KS87IFxuICAgICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdChTdHJpbmcodGVsKSk7XG4gICAgICAgIH1cblxuLy9sZXMgcG9pbnRzIHPDqWxlY3Rpb25uw6lzXG5cbi8vRVZFTlQgSU5URVJGQUNFICBcbiAgICAgICAgICAgIGNvbnN0IGdldExhc3RQbGFuaWZpZWREYXRlID0gKHBvaW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmICghcG9pbnQubG9nZXRhdHMgfHwgcG9pbnQubG9nZXRhdHMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcblxuICAgICAgICAgICAgICAvLyAxLiBGaWx0cmVyIGxlcyBsb2dzIHBhciBpZCBkJ8OpdGF0IDVcbiAgICAgICAgICAgICAgY29uc3QgcGxhbmlmaWVzID0gcG9pbnQubG9nZXRhdHMuZmlsdGVyKGxvZyA9PiBsb2cuZXRhdC5pZCA9PT0gNSk7XG5cbiAgICAgICAgICAgICAgLy8gMi4gVsOpcmlmaWVyIHMnaWwgeSBlbiBhIGF1IG1vaW5zIHVuXG4gICAgICAgICAgICAgIGlmIChwbGFuaWZpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJKYW1haXMgcGxhbmlmacOpXCI7XG5cbiAgICAgICAgICAgICAgLy8gMy4gUsOpY3Vww6lyZXIgbGUgZGVybmllciAoZW4gc3VwcG9zYW50IHF1ZSBsZSBKU09OIGVzdCB0cmnDqSBwYXIgZGF0ZS9JRCBjcm9pc3NhbnQpXG4gICAgICAgICAgICAgIC8vIFNpIHZvdXMgbifDqnRlcyBwYXMgc8O7ciBkdSB0cmksIHZvdXMgcG91dmV6IGFqb3V0ZXIgLnNvcnQoKGEsIGIpID0+IGIuaWQgLSBhLmlkKSBhdmFudCBsZSBbMF1cbiAgICAgICAgICAgICAgY29uc3QgZGVybmllckxvZyA9IHBsYW5pZmllc1twbGFuaWZpZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGRlcm5pZXJMb2cuZGF0ZWNyZWE7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyZWRQb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvLyBPbiB2w6lyaWZpZSBzaSBjaGFxdWUgcHJvZHVpdCBkZSBsYSBsaXN0ZSBhIHNhIGNsw6kgw6AgJ3RydWUnIGRhbnMgbCdvYmpldCBkZSBzw6lsZWN0aW9uXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRQb2ludHMudmFsdWUuZXZlcnkocCA9PiBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlW3AuaWRdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdG9nZ2xlQWxsID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbHRlcmVkUG9pbnRzLnZhbHVlLmxlbmd0aCA+IDEwMCkge1xuICAgICAgICAgICAgICAgIGFsZXJ0KFwiSW1wb3NzaWJsZSBkZSB0b3V0IHPDqWxlY3Rpb25uZXIgOiB0cm9wIGRlIHLDqXN1bHRhdHMgKD4xMDApLlwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47IFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNBbGxTZWxlY3RlZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJvZHVjdHMudmFsdWUgPSB7fTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2lub24gLT4gb24gY29uc3RydWl0IHVuIG9iamV0IGF2ZWMgdG91cyBsZXMgSURzIChTw6lsZWN0aW9uIHRvdGFsZSlcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB7fTtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFBvaW50cy52YWx1ZS5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgICAgICAgICBuZXdTZWxlY3Rpb25bcC5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJvZHVjdHMudmFsdWUgPSBuZXdTZWxlY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdG9nZ2xlUm93ID0gKHByb2R1Y3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gcHJvZHVjdC5pZDtcbiAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSAhIXNlbGVjdGVkUHJvZHVjdHMudmFsdWVbaWRdO1xuXG4gICAgICAgICAgICAvLyBDcsOpYXRpb24gZCd1bmUgY29waWUgcG91ciBsYSByw6lhY3Rpdml0w6lcbiAgICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHsgLi4uc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZSB9O1xuXG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdTZWxlY3Rpb25baWRdOyAvLyBPbiByZXRpcmUgbGEgY2zDqVxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVGFiLnZhbHVlW2lkXSA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdTZWxlY3Rpb25baWRdID0gdHJ1ZTsgLy8gT24gYWpvdXRlIGxhIGNsw6lcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRhYi52YWx1ZVtpZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlID0gbmV3U2VsZWN0aW9uO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIDEuIExlcyDDqWzDqW1lbnRzIGZpZ8OpcyAoY2V1eCBzw6lsZWN0aW9ubsOpcylcbiAgICAgICAgY29uc3QgZnJvemVuUG9pbnRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkUG9pbnRzLnZhbHVlLmZpbHRlcihwID0+IHNlbGVjdGVkUHJvZHVjdHMudmFsdWVbcC5pZF0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyAyLiBMZXMgw6lsw6ltZW50cyByZXN0YW50cyAoY2V1eCBOT04gc8OpbGVjdGlvbm7DqXMpXG4gICAgICAgIGNvbnN0IHVuc2VsZWN0ZWRQb2ludHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRQb2ludHMudmFsdWUuZmlsdGVyKHAgPT4gIXNlbGVjdGVkUHJvZHVjdHMudmFsdWVbcC5pZF0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBvblJvd0V4cGFuZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgZXhwYW5kZWRSb3dzLnZhbHVlID0geyBbZXZlbnQuZGF0YS5pZF06IHRydWUgfTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2RlcGxveSBpZCcgKyBldmVudC5kYXRhLmlkKVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGVkaXRQcm9kdWN0ID0gKHByb2QpID0+IHtcbiAgICAgICAgICAgIHByb2R1Y3QudmFsdWUgPSB7Li4ucHJvZH07XG4gICAgICAgICAgICBwcm9kdWN0RGlhbG9nLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXhwb3J0RXhjZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICBleGNlbERpYWxvZy52YWx1ZSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhpZGVEaWFsb2cgPSAoKSA9PiB7XG4gICAgICAgICAgICBleGNlbERpYWxvZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgcHJvZHVjdERpYWxvZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgc3VibWl0dGVkLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIH07XG5cbi8vREVNQVJSQUdFXG4gICAgICAgIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0ZXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoXCJodHRwczovL2FkMTFjNjAwLWVmNGEtNDgxNS1hM2RjLWEzMjY4Mjc0NWExNC5tZXJjdXJlLnJvY2tzLy53ZWxsLWtub3duL21lcmN1cmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJ0b3BpY1wiLCBcIi9jYXJ0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGhhbmRsZU1lcmN1cmVNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NhcnRlJywgaGFuZGxlTWVyY3VyZU1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIEV2ZW50U291cmNlOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvYWRpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgbW9pcy52YWx1ZSA9IHByb3BzLnBhcmFtLm1vaXM7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsLnZhbHVlID0gcHJvcHMucGFyYW0udG90YWw7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZS52YWx1ZSA9IHByb3BzLnBhcmFtLnN0YXJ0RGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9tYnJlLnZhbHVlID0gcHJvcHMucGFyYW0ubm9tYnJlO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbC52YWx1ZSA9IHByb3BzLnBhcmFtLnRvdGFsO1xuICAgICAgICAgICAgICAgICAgICBwb3VyY2VudC52YWx1ZSA9IE1hdGgucm91bmQocHJvcHMucGFyYW0ubm9tYnJlKjEwMCAvIHByb3BzLnBhcmFtLnRvdGFsKTtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uSUQudmFsdWUgPSBwcm9wcy5wYXJhbS5vcGVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIG1pc3Npb25JRC52YWx1ZSA9IHByb3BzLnBhcmFtLm1pc3Npb247XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaE1pc3Npb24udmFsdWUgPSBtaXNzaW9uSUQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJJRC52YWx1ZSA9IHByb3BzLnBhcmFtLmNsdXN0ZXJJZDtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVNNUy52YWx1ZSA9IHByb3BzLnBhcmFtLm1lc3NhZ2VTTVM7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlYWdlbnRzLnZhbHVlID0gcHJvcHMucGFyYW0uYWdlbnRzO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW1pc3Npb25zLnZhbHVlID0gcHJvcHMucGFyYW0ubWlzc2lvbnM7XG4gICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlLnZhbHVlID0gcHJvcHMucGFyYW0uZGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgIGV0YXRzLnZhbHVlID0gcHJvcHMucGFyYW0uZXRhdHM7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnZhbHVlID0gcHJvcHMucGFyYW0ubWVzc2FnZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgYnVzLm9uKCdjbHVzdGVyLXNlbGVjdGVkJywgdXBkYXRlQ2x1c3Rlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hQb2ludHNPcGVyYXRpb24oKTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcblxuICAgICAgICAgICAgYnVzLm9mZignY2x1c3Rlci1zZWxlY3RlZCcsIHVwZGF0ZUNsdXN0ZXIpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJNZXJjdXJlIEV2ZW50U291cmNlIGNsb3NlZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvLyBvbkJlZm9yZVVubW91bnQgZXN0IGFwcGVsw6kganVzdGUgYXZhbnQgcXVlIGxlIGNvbXBvc2FudCBuZSBzb2l0IHJldGlyw6kgZHUgRE9NLlxuICAgICAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgICAgIGJ1cy5vZmYoJ2NsdXN0ZXItc2VsZWN0ZWQnKTtcbiAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbjwvc2NyaXB0PlxuPHRlbXBsYXRlPlxuICAgICAgICA8ZGl2IGlkPVwicG9pbnRzXCIgQGRyb3A9XCJvbkRyb3AoJGV2ZW50LCAxKVwiIEBkcmFnb3Zlci5wcmV2ZW50IEBkcmFnZW50ZXIucHJldmVudCBzdHlsZT1cImhlaWdodDogY2FsYygxMDB2aCAtIDUwMHB4KTtcIiB0YWJsZVN0eWxlPVwibWF4LXdpZHRoOiAxMjAwcHhcIj5cbiAgICAgICAgICAgIDxEYXRhVGFibGUgXG4gICAgICAgICAgICA6dmFsdWU9XCJmaWx0ZXJlZFBvaW50c1wiIFxuICAgICAgICAgICAgdi1tb2RlbDpleHBhbmRlZFJvd3M9XCJleHBhbmRlZFJvd3NcIiBcbiAgICAgICAgICAgIEByb3dFeHBhbmQ9XCJvblJvd0V4cGFuZFwiXG4gICAgICAgICAgICBzY3JvbGxhYmxlIFxuICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0PVwiZmxleFwiXG4gICAgICAgICAgICBwYWdpbmF0b3IgOnJvd3M9XCIxMDBcIiBcbiAgICAgICAgICAgIGRhdGFLZXk9XCJpZFwiIFxuICAgICAgICAgICAgZmlsdGVyRGlzcGxheT1cInJvd1wiIFxuICAgICAgICAgICAgOmxvYWRpbmc9XCJsb2FkaW5nXCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICA6cm93LWNsYXNzPVwicm93Q2xhc3NcIiBcbiAgICAgICAgICAgIDpjbGFzcz1cInsgJ2hpZGUtc2VsZWN0LWFsbCc6IGZpbHRlcmVkUG9pbnRzLmxlbmd0aCA+IDEwMCB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktZmlsdGVyLXNsYXNoXCIgbGFiZWw9XCJDbGVhciBGaWx0cmVcIiB2YXJpYW50PVwib3V0bGluZWRcIiBAY2xpY2s9XCJjbGVhckZpbHRlcigpXCIgc3R5bGU9XCJoZWlnaHQ6NDBweDtcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiaGVhZGVyLWFwcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6IDYyMHB4O2NvbG9yOiMwMDA7XCI+PHRib2R5Pjx0cj48dGQgc3R5bGU9XCJ3aWR0aDogMTIwcHg7dGV4dC1hbGlnbjpyaWdodFwiPiZuYnNwO3t7IGNvdW50IH19IHLDqXN1bHRhdHM8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PiBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVuZCBwYi00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBpY29uPVwicGkgcGktZXh0ZXJuYWwtbGlua1wiIGxhYmVsPVwiUHJvZ3JhbW1lciBsZXMgc8OpbGVjdGlvbm7DqXNcIiBAY2xpY2s9XCJzZW5kUHJvZ3JhbW1lcigpXCIgLz4mbmJzcDsmbmJzcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIGljb249XCJwaSBwaS1leHRlcm5hbC1saW5rXCIgbGFiZWw9XCJFeHBvcnRcIiBAY2xpY2s9XCJleHBvcnRFeGNlbCgpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjZW1wdHk+IFBhcyBkZSBwb2ludCB0cm91dsOpIG91IGF1dHJlIG1pc3Npb24uIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNsb2FkaW5nPiBMb2FkaW5nIC4gPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiaWRcIiBoZWFkZXI9XCJJRFwiIC8+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBleHBhbmRlciBzdHlsZT1cIndpZHRoOiAyMHB4XCIgLz5cbiAgICAgICAgICAgICAgICA8Q29sdW1uPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrLnN0b3A9XCJ0b2dnbGVBbGxcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzcz1cInsgJ2Rpc2FibGVkLXdyYXBwZXInOiBmaWx0ZXJlZFBvaW50cy5sZW5ndGggPiAxMDAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJUb3V0IHPDqWxlY3Rpb25uZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGVja2JveCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1vZGVsVmFsdWU9XCJpc0FsbFNlbGVjdGVkXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpiaW5hcnk9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImZpbHRlcmVkUG9pbnRzLmxlbmd0aCA+IDEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmU7XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cInRvZ2dsZVJvdyhkYXRhKVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtd3JhcHBlclwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hlY2tib3ggXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptb2RlbFZhbHVlPVwiISFzZWxlY3RlZFByb2R1Y3RzW2RhdGEuaWRdXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpiaW5hcnk9XCJ0cnVlXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmU7XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbHM9XCJub21cIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cInsgJ2ZvbnQtYmx1ZSc6IHNlbGVjdGVkVGFiW2RhdGEuaWRdID09IHRydWUgfVwiPnt7IGRhdGEuY2l2aWxpdGUgfX0ge3sgZGF0YS5ub20gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCB2LW1vZGVsPVwic2VhcmNoTm9tXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk5vbVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+ICAgICAgXG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVscz1cImFsZXJ0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRvZ2dsZVN3aXRjaCB2LW1vZGVsPVwiZGF0YS5hbGVydGVcIiBAY2hhbmdlPVwiY2hhbmdlX2FsZXJ0ZShkYXRhKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJldGF0LWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hBbGVydGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91c1wiPlRvdXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidHJ1ZVwiPk91aTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYWxzZVwiPk5vbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+ICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJudW1lcm9DbGllbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLm51bWVyb0NsaWVudCB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgdi1tb2RlbD1cInNlYXJjaE51bWVyb0NsaWVudFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJOwrAgY2xpZW50XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gIFxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJudW1lcm9QaHlzaXF1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEubnVtZXJvUGh5c2lxdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IHYtbW9kZWw9XCJzZWFyY2hOdW1lcm9QaHlzaXF1ZVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJOwrAgcGh5c1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+ICBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwidGVsMFwiIHN0eWxlPVwibWluLXdpZHRoOiA4MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bnRlbDJcIiBAY2xpY2s9XCJlbnRyYW50VGVsKGRhdGEpXCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1waG9uZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPjwvYnV0dG9uPjxicj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIEVudHJhbnRcbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwidGVsXCIgc3R5bGU9XCJtaW4td2lkdGg6IDgwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICB2LWZvcj1cIm1lc3NhZ2UgaW4gbWVzc2FnZXNcIiA6a2V5PVwibWVzc2FnZS5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEudGVsMSAmJiBjaGVja1RlbChkYXRhLnRlbDEpICYmIG1lc3NhZ2UudHlwZSA9PSAyICYmIG1lc3NhZ2Uuc3VqZXQuaW5jbHVkZXMoJ1JlbmRlei12b3VzJylcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvIGJ0bnNtc1wiIEBjbGljaz1cInNlbmRTTVMoZGF0YSxkYXRhLnRlbDEsbWVzc2FnZS5pZClcIiBzdHlsZT1cIndpZHRoOiAyNTBweCAhaW1wb3J0YW50OyBoZWlnaHQ6NTBweDtcIj48c3BhbiBjbGFzcz1cInBpIHBpLW1vYmlsZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwOyZuYnNwO3t7IG1lc3NhZ2Uubm9tIH19L3t7IG1lc3NhZ2Uuc3VqZXQgfX08YnI+e3sgZGF0YS50ZWwxIH19PC9idXR0b24+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLnRlbDIgJiYgY2hlY2tUZWwoZGF0YS50ZWwyKSAmJiBtZXNzYWdlLnR5cGUgPT0gMiAmJiBtZXNzYWdlLnN1amV0LmluY2x1ZGVzKCdSZW5kZXotdm91cycpXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mbyBidG5zbXNcIiBAY2xpY2s9XCJzZW5kU01TKGRhdGEsZGF0YS50ZWwyLG1lc3NhZ2UuaWQpXCIgc3R5bGU9XCJ3aWR0aDogMjUwcHggIWltcG9ydGFudDsgaGVpZ2h0OjUwcHg7XCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1tb2JpbGVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj4mbmJzcDsmbmJzcDt7eyBtZXNzYWdlLm5vbSB9fS97eyBtZXNzYWdlLnN1amV0IH19PGJyPnt7IGRhdGEudGVsMiB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLnRlbDFcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvIGJ0bnRlbFwiIEBjbGljaz1cInNlbmRUZWwoZGF0YSxkYXRhLnRlbDEpXCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1waG9uZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwO1RFTCB7eyBkYXRhLnRlbDEgfX08L2J1dHRvbj48L3NwYW4+PGJyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS50ZWwyXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mbyBidG50ZWxcIiBAY2xpY2s9XCJzZW5kVGVsKGRhdGEsZGF0YS50ZWwyKVwiPjxzcGFuIGNsYXNzPVwicGkgcGktcGhvbmVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj4mbmJzcDtURUwge3sgZGF0YS50ZWwyIH19PC9idXR0b24+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgdi1tb2RlbD1cInNlYXJjaFRlbFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJUZWxcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gIGZpZWxkPVwiZXRhdFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5ldGF0ICYmIGRhdGEuZXRhdC5pZFwiIDpzdHlsZT1cInsgXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcycHggOHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjY2NjJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzE2MHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZicsIC8qIENvdWxldXIgZGUgdGV4dGUgYmxhbmNoZSBwb3VyIHVuIG1laWxsZXVyIGNvbnRyYXN0ZSAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBkYXRhLmV0YXQuY291bGV1ciBcbiAgICAgICAgICAgICAgICAgICAgfVwiIEBjbGljaz1cInNlbmRFdGF0KGRhdGEuaWQpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuZXRhdC5ub20gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV0YXQtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaEV0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91c1wiPlRvdXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwiZXRhdCBpbiBldGF0c1wiIDprZXk9XCJldGF0XCIgOnZhbHVlPVwiZXRhdC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBldGF0Lm5vbSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImVtcGxhY2VtZW50Q29tcHRldXJcIiBzdHlsZT1cIm1pbi13aWR0aDogMTAwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5lbXBsYWNlbWVudENvbXB0ZXVyIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwibGliZWxsZS1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoRW1wbGFjZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3VzXCI+VG91cyBsZXMgZW1wbGFjLjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cImVtcGxhY2VtZW50IGluIGVtcGxhY2VtZW50c1wiIDprZXk9XCJlbXBsYWNlbWVudFwiIDp2YWx1ZT1cImVtcGxhY2VtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZW1wbGFjZW1lbnQgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm1vZHVsZVNldWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5tb2R1bGVTZXVsXCI+TW9kdWxlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cIiFkYXRhLm1vZHVsZVNldWxcIj5Db21wdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBzdHlsZT1cIndpZHRoOiA0MHB4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInNsb3RQcm9wc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpY29uPVwicGkgcGktcGVuY2lsXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgcm91bmRlZCBjbGFzcz1cIm1yLTJcIiBAY2xpY2s9XCJkaXN0YW5jZVVwZGF0ZShzbG90UHJvcHMuZGF0YS5pZCwgZGlzdGFuY2UpXCI+e3tkaXN0YW5jZX19bTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJub21SdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLm51bWVyb1J1ZSB9fSB7eyBkYXRhLnRpdHJlUnVlICB9fSB7eyBkYXRhLm5vbVJ1ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cIm5vbVJ1ZS1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoTm9tUnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91dGVzXCI+VG91dGVzIGxlcyBydWVzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwicnVlIGluIHJ1ZXNcIiA6a2V5PVwicnVlXCIgOnZhbHVlPVwicnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcnVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cInZpbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5jb2RlUG9zdGFsIH19IHt7IGRhdGEudmlsbGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwidmlsbGUtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaFZpbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXRlc1wiPlRvdXRlcyB2aWxsZXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwidmlsbGUgaW4gdmlsbGVzXCIgOmtleT1cInZpbGxlXCIgOnZhbHVlPVwidmlsbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdmlsbGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJhZ2VudFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmFnZW50XCI+e3sgZGF0YS5hZ2VudC5ub20gfX0gPHNwYW4gdi1pZj1cImRhdGEuYWdlbnQucHJlbm9tXCI+e3sgZGF0YS5hZ2VudC5wcmVub20gfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJhZ2VudC1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoQWdlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91c1wiPlRvdXMgYWdlbnRzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cImFnZW50IGluIGFnZW50c1wiIDprZXk9XCJhZ2VudFwiIDp2YWx1ZT1cImFnZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFnZW50IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiUGxhbmlmXCIgc3R5bGU9XCJtaW4td2lkdGg6IDUwcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmNyZW5lYXVcIj57eyBnZXRMYXN0UGxhbmlmaWVkRGF0ZShkYXRhKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImRhdGVQbGFuaWYtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaFBsYW5pZlJWXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXRlc1wiPlBsYW5pZjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJwbGFuUlYgaW4gcGxhbmlmUlZcIiA6a2V5PVwicGxhblJWXCIgOnZhbHVlPVwicGxhblJWXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHBsYW5SViB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImRhdGVSVlwiIHN0eWxlPVwibWluLXdpZHRoOiAxNTBweFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEuY3JlbmVhdVwiPnt7IGRhdGEuY3JlbmVhdS5kYXRlIH19IHt7IGRhdGEuY3JlbmVhdS5jcmVuZWF1SG9yYWlyZS5ub20gfX08YnI+QWdlbnQgOiB7eyBkYXRhLmNyZW5lYXUuYWdlbnQubm9tIH19IDxzcGFuIHYtaWY9XCJkYXRhLmNyZW5lYXUuYWdlbnQucHJlbm9tXCI+e3sgZGF0YS5jcmVuZWF1LmFnZW50LnByZW5vbSB9fTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImRhdGVSVi1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoRGF0ZVJWXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXRlc1wiPlJWIC8gVG91dGVzIGRhdGVzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cImRhdGVSViBpbiBkYXRlc1JWXCIgOmtleT1cImRhdGVSVlwiIDp2YWx1ZT1cImRhdGVSVlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRlUlYgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgICA8Q29sdW1uIGhlYWRlcj1cIkVkaXRcIiBzdHlsZT1cIndpZHRoOiA1MHB4XCI+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwic2xvdFByb3BzXCI+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBpY29uPVwicGkgcGktcGVuY2lsXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgcm91bmRlZCBjbGFzcz1cIm1yLTJcIiBAY2xpY2s9XCJlZGl0UHJvZHVjdChzbG90UHJvcHMuZGF0YSlcIj5FZGl0PC9CdXR0b24+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2V4cGFuc2lvbj1cInNsb3RQcm9wc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiA4MDBweDtcIj5DcsOpbmVhdXggOiA8YnV0dG9uIEBjbGljaz1cImRpc3RhbmNlVXBkYXRlKHNsb3RQcm9wcy5kYXRhLmlkLCA1MClcIiBjbGFzcz1cIm1iLTEwXCI+NTAgbTwvYnV0dG9uPiZuYnNwOyZuYnNwOzxidXR0b24gQGNsaWNrPVwiZGlzdGFuY2VVcGRhdGUoc2xvdFByb3BzLmRhdGEuaWQsIDIwMClcIiBjbGFzcz1cIm1iLTEwXCI+MjAwIG08L2J1dHRvbj4mbmJzcDsmbmJzcDs8YnV0dG9uIEBjbGljaz1cImRpc3RhbmNlVXBkYXRlKHNsb3RQcm9wcy5kYXRhLmlkLCA1MDApXCIgY2xhc3M9XCJtYi0xMFwiPjUwMCBtPC9idXR0b24+Jm5ic3A7Jm5ic3A7PGJ1dHRvbiBAY2xpY2s9XCJkaXN0YW5jZVVwZGF0ZShzbG90UHJvcHMuZGF0YS5pZCAsICdyZXNldCcpXCIgY2xhc3M9XCJtYi0xMFwiPlRvdXM8L2J1dHRvbj4mbmJzcDsmbmJzcDs8dnVlLWRhdGUtcGlja2VyIHYtbW9kZWw9XCJkYXRlXCIgIHBsYWNlaG9sZGVyPVwiRGF0ZVwiIDp0ZWxlcG9ydD1cInRydWVcIiA6c3RhcnQtZGF0ZT1cInN0YXJ0RGF0ZVwiIGF1dG8tYXBwbHkgQHVwZGF0ZTptb2RlbC12YWx1ZT1cInNlYXJjaERhdGVDcmVuZWF1KHNsb3RQcm9wcy5kYXRhLmlkKVwiPjwvdnVlLWRhdGUtcGlja2VyPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImluZm9zVGFic1wiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm9zVGFiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPk1lc3NhZ2VzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgIHYtZm9yPVwibWVzc2FnZSBpbiBtZXNzYWdlc1wiIDprZXk9XCJtZXNzYWdlLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwic2xvdFByb3BzLmRhdGEuZW1haWwubGVuZ3RoID4gNiAmJiBtZXNzYWdlLnR5cGUgPT0gMVwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm9cIiBAY2xpY2s9XCJzZW5kRW1haWwoc2xvdFByb3BzLmRhdGEuaWQsbWVzc2FnZS5pZClcIiBzdHlsZT1cIndpZHRoOiAyNTBweCAhaW1wb3J0YW50XCI+e3sgbWVzc2FnZS5ub20gfX0ve3sgbWVzc2FnZS5zdWpldCB9fTxicj57eyBzbG90UHJvcHMuZGF0YS5lbWFpbCB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJzbG90UHJvcHMuZGF0YS50ZWwxICYmIGNoZWNrVGVsKHNsb3RQcm9wcy5kYXRhLnRlbDEpICYmIG1lc3NhZ2UudHlwZSA9PSAyXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mb1wiIEBjbGljaz1cInNlbmRTTVMoc2xvdFByb3BzLmRhdGEsc2xvdFByb3BzLmRhdGEudGVsMSxtZXNzYWdlLmlkKVwiIHN0eWxlPVwid2lkdGg6IDI1MHB4ICFpbXBvcnRhbnRcIj48c3BhbiBjbGFzcz1cInBpIHBpLW1vYmlsZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwOyZuYnNwO3t7IG1lc3NhZ2Uubm9tIH19L3t7IG1lc3NhZ2Uuc3VqZXQgfX08YnI+e3sgc2xvdFByb3BzLmRhdGEudGVsMSB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJzbG90UHJvcHMuZGF0YS50ZWwyICYmIGNoZWNrVGVsKHNsb3RQcm9wcy5kYXRhLnRlbDIpICYmIG1lc3NhZ2UudHlwZSA9PSAyXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mb1wiIEBjbGljaz1cInNlbmRTTVMoc2xvdFByb3BzLmRhdGEsc2xvdFByb3BzLmRhdGEudGVsMixtZXNzYWdlLmlkKVwiIHN0eWxlPVwid2lkdGg6IDI1MHB4ICFpbXBvcnRhbnRcIj48c3BhbiBjbGFzcz1cInBpIHBpLW1vYmlsZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwOyZuYnNwO3t7IG1lc3NhZ2Uubm9tIH19L3t7IG1lc3NhZ2Uuc3VqZXQgfX08YnI+e3sgc2xvdFByb3BzLmRhdGEudGVsMiB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJzbG90UHJvcHMuZGF0YS5lbWFpbC5sZW5ndGggPiA2ICYmIG1lc3NhZ2UudHlwZSA9PSA1XCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mb1wiIEBjbGljaz1cInNlbmRFbWFpbChzbG90UHJvcHMuZGF0YS5pZCxtZXNzYWdlLmlkKVwiIHN0eWxlPVwid2lkdGg6IDI1MHB4ICFpbXBvcnRhbnRcIj57eyBtZXNzYWdlLm5vbSB9fS97eyBtZXNzYWdlLnN1amV0IH19PGJyPnt7IHNsb3RQcm9wcy5kYXRhLmVtYWlsIH19PC9idXR0b24+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cInNsb3RQcm9wcy5kYXRhLnRlbDEgJiYgY2hlY2tUZWwoc2xvdFByb3BzLmRhdGEudGVsMSkgJiYgbWVzc2FnZS50eXBlID09IDVcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvXCIgQGNsaWNrPVwic2VuZFNNUyhzbG90UHJvcHMuZGF0YSxzbG90UHJvcHMuZGF0YS50ZWwxLG1lc3NhZ2UuaWQpXCIgc3R5bGU9XCJ3aWR0aDogMjUwcHggIWltcG9ydGFudFwiPjxzcGFuIGNsYXNzPVwicGkgcGktbW9iaWxlXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj48L3NwYW4+Jm5ic3A7Jm5ic3A7e3sgbWVzc2FnZS5ub20gfX0ve3sgbWVzc2FnZS5zdWpldCB9fTxicj57eyBzbG90UHJvcHMuZGF0YS50ZWwxIH19PC9idXR0b24+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cInNsb3RQcm9wcy5kYXRhLnRlbDIgJiYgY2hlY2tUZWwoc2xvdFByb3BzLmRhdGEudGVsMikgJiYgbWVzc2FnZS50eXBlID09IDVcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvXCIgQGNsaWNrPVwic2VuZFNNUyhzbG90UHJvcHMuZGF0YSxzbG90UHJvcHMuZGF0YS50ZWwyLG1lc3NhZ2UuaWQpXCIgc3R5bGU9XCJ3aWR0aDogMjUwcHggIWltcG9ydGFudFwiPjxzcGFuIGNsYXNzPVwicGkgcGktbW9iaWxlXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj48L3NwYW4+Jm5ic3A7Jm5ic3A7e3sgbWVzc2FnZS5ub20gfX0ve3sgbWVzc2FnZS5zdWpldCB9fTxicj57eyBzbG90UHJvcHMuZGF0YS50ZWwyIH19PC9idXR0b24+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mb3NUYWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Q29tbWVudGFpcmU8L3A+PEJ1dHRvbiBpY29uPVwicGkgcGktcGVuY2lsXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgcm91bmRlZCBjbGFzcz1cIm1yLTIgdG9wLXJpZ2h0XCIgQGNsaWNrPVwiZWRpdFByb2R1Y3Qoc2xvdFByb3BzLmRhdGEpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICBzbG90UHJvcHMuZGF0YS5jb21tZW50YWlyZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvc1RhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5IaXN0b3JpcXVlPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGVcIiBzdHlsZT1cIndpZHRoOiAxMDAlO21heC13aWR0aDogNDAwcHg7cGFkZGluZzogMnB4ICFpbXBvcnRhbnQ7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XCJsb2cgaW4gc2xvdFByb3BzLmRhdGEubG9ncG9pbnRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IGxvZy5kYXRlY3JlYSB9fTwvdGQ+PHRkPnt7IGxvZy5hY3Rpb24ubm9tIH19PC90ZD48dGQ+e3sgbG9nLmNvbW1lbnRhaXJlIH19PC90ZD48dGQ+PHNwYW4gY2xhc3M9XCJwLWJ1dHRvbi1pY29uIHBpIHBpLXRyYXNoXCIgZGF0YS1wPVwibGVmdFwiIGRhdGEtcGMtc2VjdGlvbj1cImljb25cIiBAY2xpY2s9XCJkZWxldGVfbG9nKGxvZy5pZClcIj48L3NwYW4+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvc1RhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5FdGF0czwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTttYXgtd2lkdGg6IDQwMHB4O3BhZGRpbmc6IDJweCAhaW1wb3J0YW50O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHYtZm9yPVwibG9nIGluIHNsb3RQcm9wcy5kYXRhLmxvZ2V0YXRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IGxvZy5kYXRlY3JlYSB9fTwvdGQ+PHRkPnt7IGxvZy5ldGF0Lm5vbSB9fTwvdGQ+PHRkPnt7IGxvZy5jb21tZW50YWlyZSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvRGF0YVRhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8RGlhbG9nIHYtbW9kZWw6dmlzaWJsZT1cInByb2R1Y3REaWFsb2dcIiA6c3R5bGU9XCJ7IHdpZHRoOiAnNDUwcHgnIH1cIiBoZWFkZXI9XCJEw6l0YWlscyBkdSBwb2ludFwiIDptb2RhbD1cInRydWVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC02XCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm51bWVyb0NsaWVudFwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5OdW3DqXJvIENsaWVudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJudW1lcm9DbGllbnRcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0Lm51bWVyb0NsaWVudFwiIHJlcXVpcmVkPVwidHJ1ZVwiIGF1dG9mb2N1cyA6aW52YWxpZD1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5udW1lcm9DbGllbnRcIiBmbHVpZCAvPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgdi1pZj1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5udW1lcm9DbGllbnRcIiBjbGFzcz1cInRleHQtcmVkLTUwMFwiPk51bcOpcm8gQ2xpZW50IHJlcXVpcy48L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb21wdGV1ckFjY2Vzc2libGVcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+QWNjZXNzaWJsZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiY29tcHRldXJBY2Nlc3NpYmxlXCIgdi1tb2RlbD1cInByb2R1Y3QuY29tcHRldXJBY2Nlc3NpYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiA6dmFsdWU9XCJ0cnVlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiBncmVlblwiPk91aTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gOnZhbHVlPVwiZmFsc2VcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHJlZFwiPk5vbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+IFxuICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXRhdFwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5FdGF0PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdCB2LW1vZGVsPVwicHJvZHVjdC5ldGF0XCIgOm9wdGlvbnM9XCJldGF0c1wiIG9wdGlvbkxhYmVsPVwibm9tXCIgIDppbml0aWFsVmFsdWVzPVwicHJvZHVjdC5ldGF0LmlkXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3Rpb25uZXIgdW4gw6l0YXRcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PiBcbiAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZ2VudFwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5BZ2VudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3Qgdi1tb2RlbD1cInByb2R1Y3QuYWdlbnRcIiA6b3B0aW9ucz1cImxpc3RlYWdlbnRzXCIgb3B0aW9uTGFiZWw9XCJub21cIiAgOmluaXRpYWxWYWx1ZXM9XCJwcm9kdWN0LmFnZW50LmlkXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3Rpb25uZXIgdW4gYWdlbnRcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2l2aWxpdGVcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+Q2l2aWxpdMOpPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cImNpdmlsaXRlXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5jaXZpbGl0ZVwiIHJlcXVpcmVkPVwidHJ1ZVwiIGF1dG9mb2N1cyA6aW52YWxpZD1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5jaXZpbGl0ZVwiIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCB2LWlmPVwic3VibWl0dGVkICYmICFwcm9kdWN0LmNpdmlsaXRlXCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDBcIj5DaXZpbGl0w6kgcmVxdWlzZS48L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPk5vbTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJuYW1lXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5ub21cIiByZXF1aXJlZD1cInRydWVcIiBhdXRvZm9jdXMgOmludmFsaWQ9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3Qubm9tXCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHYtaWY9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3Qubm9tXCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDBcIj5Ob20gcmVxdWlzLjwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRlbDFcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+VGVsIDE8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwidGVsMVwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QudGVsMVwiIHJlcXVpcmVkPVwiZmFsc2VcIiBhdXRvZm9jdXMgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGVsMlwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5UZWwgMjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJ0ZWwyXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC50ZWwyXCIgcmVxdWlyZWQ9XCJmYWxzZVwiIGF1dG9mb2N1cyBmbHVpZCAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlbWFpbFwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5FbWFpbDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJlbWFpbFwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QuZW1haWxcIiByZXF1aXJlZD1cImZhbHNlXCIgYXV0b2ZvY3VzIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvbW1lbnRhaXJlXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkNvbW1lbnRhaXJlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPFRleHRhcmVhIGlkPVwiY29tbWVudGFpcmVcIiB2LW1vZGVsPVwicHJvZHVjdC5jb21tZW50YWlyZVwiIHJlcXVpcmVkPVwiZmFsc2VcIiByb3dzPVwiM1wiIGNvbHM9XCIyMFwiIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJBbm51bGVyXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgdGV4dCBAY2xpY2s9XCJoaWRlRGlhbG9nXCIgLz5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiU2F1dmVyXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgQGNsaWNrPVwic2VuZEluZm9zKHByb2R1Y3QuaWQpXCIgLz5cbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvRGlhbG9nPlxuICAgICAgICA8RGlhbG9nIHYtbW9kZWw6dmlzaWJsZT1cImV4Y2VsRGlhbG9nXCIgOnN0eWxlPVwieyB3aWR0aDogJzQ1MHB4JyB9XCIgaGVhZGVyPVwiRXhwb3J0IEV4Y2VsXCIgOm1vZGFsPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHA+Vm91cyBwb3V2ZXogY3LDqWVyIHVuIHJhcHBvcnQgcGFydGllbCBsaW1pdMOpIMOgIDUwMCBsaWduZXMgw6AgcGFydGlyIGRlIHZvcyBjcml0w6hyZXMuPC9wPlxuICAgICAgICAgICAgPHA+T3UgbGFuY2VyIHVuIGV4cG9ydCBjb21wbGV0IGRlIGxhIG1pc3Npb24gKGVudm9pIHBhciBtYWlsKTwvcD5cbiAgICAgICAgICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJBbm51bGVyXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgdGV4dCBAY2xpY2s9XCJoaWRlRGlhbG9nXCIgLz5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiRXhwb3J0IGNvbXBsZXRcIiBpY29uPVwicGkgcGktY2hlY2tcIiBAY2xpY2s9XCJzZW5kRXhjZWxDcm9uKClcIiAvPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJFeHBvcnRlciBtYSBzw6lsZWN0aW9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgQGNsaWNrPVwic2VuZEV4Y2VsKClcIiAvPlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9EaWFsb2c+XG48L3RlbXBsYXRlPlxuPHN0eWxlPlxuOmRlZXAodHIubXktY3VzdG9tLWhpZ2hsaWdodCkge1xuICAgIC8qYmFja2dyb3VuZDogI2ZjZDlhNSAhaW1wb3J0YW50OyovXG4gICAgLypmb250LXdlaWdodDogYm9sZDsqL1xufVxuLnAtZGF0YXRhYmxlLXRoZWFkID4gdHIgPiB0aCAge1xuICAgIHBhZGRpbmctdG9wOiA0cHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWJvdHRvbTogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1sZWZ0OiA0cHggIWltcG9ydGFudDtcbn1cbi5wLWRhdGF0YWJsZS1oZWFkZXItY2VsbCAgIHtcbiAgICBwYWRkaW5nLXRvcDogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctbGVmdDogNHB4ICFpbXBvcnRhbnQ7XG59XG4ucC1kYXRhdGFibGUtZnJvemVuLXRib2R5ID4gdHIgPiB0ZCB7XG4gIC8qYmFja2dyb3VuZC1jb2xvcjogI2M4ZTNmZSAhaW1wb3J0YW50OyAqL1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6IGJsdWUgIWltcG9ydGFudDtcbn1cbi5kcF9faW5wdXQsIC5kcF9fbWFpbnt3aWR0aDogMjUwcHggIWltcG9ydGFudDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7fVxuI2luZm9zVGFicyB7YmFja2dyb3VuZC1jb2xvcjogZ3JleTtwYWRkaW5nOiA1cHg7fVxuLmluZm9zVGFiIHtoZWlnaHQ6MzAwcHg7IG92ZXJmbG93LXk6IGF1dG87YmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjt9XG5cbi5oaWRlLXNlbGVjdC1hbGwgdGggPiAucC1jaGVja2JveCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5wLXRvZ2dsZXN3aXRjaC1zbGlkZXJbZGF0YS1wPVwiY2hlY2tlZFwiXSB7YmFja2dyb3VuZC1jb2xvcjogcmVkICFpbXBvcnRhbnQ7fVxuXG4uZHJvcGRvd24tY29udGVudCB7YmFja2dyb3VuZC1jb2xvcjogI2ZmZjsgei1pbmRleDogMTAwMCAhaW1wb3J0YW50O31cblxuc2VsZWN0IHttYXgtd2lkdGg6IDEyMHB4O31cbmJ1dHRvbiB7fVxuLmJ0bnRlbCB7d2lkdGg6IDE1MHB4ICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZToxMnB4O2hlaWdodCA6IDIwcHggIWltcG9ydGFudDtwYWRkaW5nOiAycHggIWltcG9ydGFudDt9XG4uYnRudGVsMiB7d2lkdGg6IDQwcHggIWltcG9ydGFudDsgbGluZS1oZWlnaHQ6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtmb250LXNpemU6MTJweDtoZWlnaHQgOiAyMHB4ICFpbXBvcnRhbnQ7cGFkZGluZzogMnB4ICFpbXBvcnRhbnQ7fVxuLmJ0bnNtcyB7d2lkdGg6IDE1MHB4ICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZToxMnB4O2hlaWdodCA6IDUwcHggIWltcG9ydGFudDtwYWRkaW5nOiAycHggIWltcG9ydGFudDt9XG4uZm9udC1ibHVlIHtmb250LXdlaWdodDogYm9sZDsgY29sb3I6IHJnYigzLCAyNTMsIDc0KTt9XG4ucC1kYXRhdGFibGUtY29sdW1uLWhlYWRlci1jb250ZW50IGlucHV0W3R5cGU9XCJ0ZXh0XCJdIHttYXgtd2lkdGg6IDEwMHB4ICFpbXBvcnRhbnQ7fVxuPC9zdHlsZT4iLCI8c2NyaXB0IHNldHVwPlxuXG5pbXBvcnQgeyBjcmVhdGVBcHAsIHJlZiwgb25Nb3VudGVkLCBvblVubW91bnRlZCwgZ2V0Q3VycmVudEluc3RhbmNlLCBjb21wdXRlZCwgd2F0Y2h9ICBmcm9tICd2dWUnO1xuaW1wb3J0IHsgYnVzIH0gZnJvbSAnLi4vYnVzLmpzJzsgXG5pbXBvcnQgTGVhZmxldFN0YW5kYXJkIGZyb20gJy4vTGVhZmxldFN0YW5kYXJkLnZ1ZSc7XG5pbXBvcnQgVGFicyBmcm9tICdwcmltZXZ1ZS90YWJzJztcbmltcG9ydCBUYWJMaXN0IGZyb20gJ3ByaW1ldnVlL3RhYmxpc3QnO1xuaW1wb3J0IFRhYiBmcm9tICdwcmltZXZ1ZS90YWInO1xuaW1wb3J0IFRhYlBhbmVscyBmcm9tICdwcmltZXZ1ZS90YWJwYW5lbHMnO1xuaW1wb3J0IFRhYlBhbmVsIGZyb20gJ3ByaW1ldnVlL3RhYnBhbmVsJztcbmltcG9ydCBUb2dnbGVTd2l0Y2ggZnJvbSAncHJpbWV2dWUvdG9nZ2xlc3dpdGNoJztcbmltcG9ydCB7IHVzZVRvYXN0IH0gZnJvbSAncHJpbWV2dWUvdXNldG9hc3QnO1xuXG4gICAgICAgIGNvbnN0IGFnZW50cyA9IHJlZihbXSk7IC8vIExhIGxpc3RlIHNlcmEgY2hhcmfDqWUgZXQgbWlzZSDDoCBqb3VyIHZpYSBNZXJjdXJlL0FQSVxuICAgICAgICB2YXIgYWdlbnRzMiA9IHJlZihbXSk7XG4gICAgICAgIGNvbnN0IGNvdW50Y3JlbmVhdSA9IHJlZignMCcpO1xuICAgICAgICBjb25zdCBkb25uZWVzID0gW107XG4gICAgICAgIGNvbnN0IHRvYXN0ID0gdXNlVG9hc3QoKTtcbiAgICAgICAgY29uc3QgYWdlbnRzX21haiA9IFtdO1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCBpbml0aWFsQWdlbnRzID0gW107XG4gICAgICAgIGNvbnN0IHNlYXJjaEFnZW50ID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNob3dDb21wbGV0ZWQgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBsb2FkaW5nID0gcmVmKHRydWUpO1xuICAgICAgICBjb25zdCBwYXJhbSA9IHJlZihudWxsKTtcbiAgICAgICAgY29uc3QgcGFyYW1MZWFmbGV0ID0gcmVmKG51bGwpO1xuICAgICAgICBjb25zdCBhZ2VudFNlbCA9IHJlZihudWxsKTtcbiAgICAgICAgdmFyIHBvaW50ID0gMDtcbiAgICAgICAgdmFyIGRpc3RhbmNlID0gJ3Jlc2V0JztcbiAgICAgICAgdmFyIGRhdGUgID0gJyc7XG4gICAgICAgIGNvbnN0IHRhYnZhbHVlID0gcmVmKCcwJyk7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IHJlY2hEaXN0YW5jZSA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IHJhd0RhdGEgPSByZWYoW10pO1xuXG4gICAgICAgIGNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICAgICAgICAgIHBhcmFtOiAge1xuICAgICAgICAgICAgdHlwZTogT2JqZWN0LCBcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlIFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBwYXJhbUxlYWZsZXQudmFsdWUgPSBwcm9wcy5wYXJhbTtcblxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVDcmVuZWF1cyhkYXRhQ3JlbmVhdSl7XG4gICAgICAgICAgICBpZihkYXRhQ3JlbmVhdS5vcGVyYXRpb24pe3Byb3BzLnBhcmFtLm9wZXJhdGlvbiA9IGRhdGFDcmVuZWF1Lm9wZXJhdGlvbjt9XG4gICAgICAgICAgICBwb2ludCA9IGRhdGFDcmVuZWF1LnBvaW50O1xuICAgICAgICAgICAgZGlzdGFuY2UgPSBkYXRhQ3JlbmVhdS5kaXN0YW5jZTtcbiAgICAgICAgICAgIGRhdGUgID0gZGF0YUNyZW5lYXUuZGF0ZTtcbiAgICAgICAgICAgIHRhYnZhbHVlLnZhbHVlID0gJzEnO1xuICAgICAgICAgICAgaWYoZGF0YUNyZW5lYXUuYWdlbnQpe2FnZW50U2VsLnZhbHVlID0gZGF0YUNyZW5lYXUuYWdlbnQ7fVxuICAgICAgICAgICAgZmV0Y2hDcmVuZWF1cygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZldGNoQ3JlbmVhdXMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBzZWFyY2hBZ2VudC52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIGlmKGRpc3RhbmNlID09ICdyZXNldCcpe3JlY2hEaXN0YW5jZS52YWx1ZSA9IGZhbHNlO31cbiAgICAgICAgICAgIGVsc2V7cmVjaERpc3RhbmNlLnZhbHVlID0gdHJ1ZTt9XG4gICAgICAgICAgICBpZihkYXRlID09ICcnKXtkYXRlID0gMDt9XG4gICAgICAgICAgICBpZihwcm9wcy5wYXJhbS5vcGVyYXRpb24pe1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvY3JlbmVhdXMvJytwcm9wcy5wYXJhbS5vcGVyYXRpb24rJy8wLycgKyBwb2ludCArICcvJyArIGRpc3RhbmNlICsgJy8wLzInKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICBpZihkYXRhLmxlbmd0aCA+IDMpe2NvdW50LnZhbHVlID0gZmFsc2U7fVxuICAgICAgICAgICAgICAgICAgIGVsc2V7Y291bnQudmFsdWUgPSB0cnVlO31cbiAgICAgICAgICAgICAgICAgICByYXdEYXRhLnZhbHVlID0gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgIGNvdW50Y3JlbmVhdS52YWx1ZSA9IGFnZW50cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICBjaGVja2VkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgcsOpY3Vww6lyYXRpb24gZGVzIHBvaW50czpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAvL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0YWJ2YWx1ZS52YWx1ZSA9ICcxJztcbiAgICAgICAgICAgICAgICBjaGVja2VkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZldGNoQ3JlbmVhdSA9IGFzeW5jIChkYXRhMikgPT4ge1xuICAgICAgICAgICAgc2VhcmNoQWdlbnQudmFsdWUgID0gJ1RvdXMnO1xuICAgICAgICAgICAgbGV0IGFnZW50X2lkID0gZGF0YTI7XG4gICAgICAgICAgICBpZihwcm9wcy5wYXJhbS5vcGVyYXRpb24pe1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkYXRlLnZhbHVlPScnO1xuICAgICAgICAgICAgICAgIHNob3dDb21wbGV0ZWQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB2YXIgcSA9IDA7XG4gICAgICAgICAgICAgICAgcmVjaERpc3RhbmNlLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9jcmVuZWF1cy8nK3Byb3BzLnBhcmFtLm9wZXJhdGlvbisnLycrYWdlbnRfaWQrJy8wL3Jlc2V0LzAvMicpOyAvLyBWb3RyZSBlbmRwb2ludCBBUEkgU3ltZm9ueVxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZGlyZWN0aW9uIGZvcmPDqWUgdmVycyBsYSBwYWdlIGRlIGxvZ2luXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vamUgcmVudm9pZSBsZXMgYWdlbnRzXG4gICAgICAgICAgICAgICAgcmF3RGF0YS52YWx1ZSA9IGRhdGE7XG4gICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgcsOpY3Vww6lyYXRpb24gZGVzIHBvaW50czpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRhYnZhbHVlLnZhbHVlID0gJzEnO1xuICAgICAgICAgICAgY2hlY2tlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfTtcblxuICAgICAgIC8vIDEuIExpc3RlIGRlIHRvdXMgbGVzIGFnZW50cyAoQ29sb25uZXMpXG5jb25zdCB0b3VzTGVzQWdlbnRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICByZXR1cm4gcmF3RGF0YS52YWx1ZS5tYXAoYSA9PiAoe1xuICAgIGlkOiBhLmlkLFxuICAgIG5vbTogYS5ub20sXG4gICAgcHJlbm9tOiBhLnByZW5vbSxcbiAgICB0b3RhbENyZW5lYXVIb3JhaXJlOiBhLnRvdGFsQ3JlbmVhdUhvcmFpcmVcbiAgfSkpO1xufSk7XG5cbi8vIDIuIExpc3RlIGRlIHRvdXRlcyBsZXMgZGF0ZXMgdW5pcXVlcyB0cmnDqWVzIChMaWduZXMpXG5jb25zdCB0b3V0ZXNMZXNEYXRlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3QgZGF0ZXMgPSBuZXcgU2V0KCk7XG4gIHJhd0RhdGEudmFsdWUuZm9yRWFjaChhZ2VudCA9PiB7XG4gICAgYWdlbnQuY3JlbmVhdXMuZm9yRWFjaChjID0+IGRhdGVzLmFkZChjLmRhdGUpKTtcbiAgfSk7XG4gIFxuICByZXR1cm4gQXJyYXkuZnJvbShkYXRlcykuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGQxID0gbmV3IERhdGUoYS5zcGxpdCgnLScpLnJldmVyc2UoKS5qb2luKCctJykpO1xuICAgIGNvbnN0IGQyID0gbmV3IERhdGUoYi5zcGxpdCgnLScpLnJldmVyc2UoKS5qb2luKCctJykpO1xuICAgIHJldHVybiBkMSAtIGQyO1xuICB9KTtcbn0pO1xuXG4vLyAzLiBIZWxwZXIgcG91ciByw6ljdXDDqXJlciBsZXMgY3LDqW5lYXV4IGQndW4gYWdlbnQgcHLDqWNpcyDDoCB1bmUgZGF0ZSBwcsOpY2lzZVxuY29uc3QgZ2V0U2xvdHNGb3JBZ2VudEFuZERhdGUgPSAoYWdlbnRJZCwgZGF0ZSkgPT4ge1xuICBjb25zdCBhZ2VudCA9IHJhd0RhdGEudmFsdWUuZmluZChhID0+IGEuaWQgPT09IGFnZW50SWQpO1xuICBpZiAoIWFnZW50KSByZXR1cm4gW107XG4gIHJldHVybiBhZ2VudC5jcmVuZWF1cy5maWx0ZXIoYyA9PiBjLmRhdGUgPT09IGRhdGUpO1xufTtcblxuLy8gNC4gSGVscGVyIHBvdXIgYWZmaWNoZXIgbGUgam91ciBkZSBsYSBzZW1haW5lIChleDogTHVuZGkpXG5jb25zdCBnZXRKb3VyU2VtYWluZSA9IChkYXRlU3RyKSA9PiB7XG4gIC8vIE9uIHLDqWN1cMOocmUgbGUgbm9tIGR1IGpvdXIgZGVwdWlzIGxlIHByZW1pZXIgY3LDqW5lYXUgdHJvdXbDqSBwb3VyIGNldHRlIGRhdGVcbiAgZm9yIChsZXQgYWdlbnQgb2YgcmF3RGF0YS52YWx1ZSkge1xuICAgIGNvbnN0IG1hdGNoID0gYWdlbnQuY3JlbmVhdXMuZmluZChjID0+IGMuZGF0ZSA9PT0gZGF0ZVN0cik7XG4gICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2guam91clNlbWFpbmVGcjtcbiAgfVxuICByZXR1cm4gXCJcIjtcbn07XG5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ2FydGUoKXtcbiAgICAgICAgICAgIHRhYnZhbHVlLnZhbHVlID0gJzAnO1xuICAgICAgICAgICAgY2hlY2tlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGNvbnN0IGFnZW50c0ZpbHRlcmVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0b3VzTGVzQWdlbnRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VhcmNoQWdlbnQudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0b3VzTGVzQWdlbnRzLnZhbHVlLmZpbHRlcihhID0+IGEuaWQgPT09IHBhcnNlSW50KHNlYXJjaEFnZW50LnZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtyZXR1cm4gdG91c0xlc0FnZW50cy52YWx1ZTt9XG5cbiAgICAgICAgfSlcblxuICAgICAgICBmdW5jdGlvbiByZXNldENyZW5lYXUoKSB7XG4gICAgICAgICAgICAvL3BvaW50ID0gMDtcbiAgICAgICAgICAgIGRpc3RhbmNlID0gJ3Jlc2V0JztcbiAgICAgICAgICAgIGRhdGUgID0gJyc7XG4gICAgICAgICAgICBmZXRjaENyZW5lYXVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXNhY3RpdmVyID0gYXN5bmMoYWdlbnRfaWQsaWQpID0+IHsgXG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2NyZW5lYXUvYWN0aXZlci8nK2lkLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFnZW50ID0gcmF3RGF0YS52YWx1ZS5maW5kKGEgPT4gYS5pZCA9PT0gYWdlbnRfaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gYWdlbnQuY3JlbmVhdXMuZmluZChjID0+IGMuaWQgPT09IGlkKTtcbiAgICAgICAgICAgICAgICAvL2xldCBjcmVuZWF1SW5kZXggPSBhZ2VudHMudmFsdWVbYWdlbnRfaWRdLmNyZW5lYXVzLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgICAgICBtYXRjaC5hY3RpZiA9ICFtYXRjaC5hY3RpZjtcblxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc3RhcnREcmFnKGV2dCwgaXRlbSwgYWdlbnQsIGFjdGlmLCB0b3RhbENyZW5lYXUpIHtcbiAgICAgICAgaWYoIWFjdGlmKXthbGVydCgnQ3LDqW5lYXUgaW5hY3RpZiA6IE9ww6lyYXRpb24gaW1wb3NzaWJsZScpO3JldHVybjt9XG4gICAgICAgIGNvbnNvbGUubG9nKCdjcmVuZWF1JytpdGVtKydhZ2VudCcrYWdlbnQpXG4gICAgICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnXG4gICAgICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnXG4gICAgICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0b3RhbENyZW5lYXUnLCB0b3RhbENyZW5lYXUpXG4gICAgICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5zZXREYXRhKCdpdGVtSUQnLCBpdGVtKVxuICAgICAgICAgIGV2dC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgnYWdlbnRJRCcsIGFnZW50KVxuICAgICAgICAgIGNvbnN0IGl0ZW1JRCA9IGV2dC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgnaXRlbUlEJylcbiAgICAgICAgfVxuXG4gICAgICAgIHdhdGNoKGNoZWNrZWQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHZhciBGZW4xID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BvaW50cycpO1xuICAgICAgICAgICAgdmFyIEZlbjIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVudS1iYXMnKTtcbiAgICAgICAgICAgIGlmKGNoZWNrZWQudmFsdWUgPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgRmVuMS5zdHlsZS5oZWlnaHQgPSAnY2FsYygxMDB2aCAtIDUwMHB4KSc7XG4gICAgICAgICAgICAgICAgRmVuMi5zdHlsZS5oZWlnaHQgPSAnNDAwcHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBGZW4xLnN0eWxlLmhlaWdodCA9ICdjYWxjKDEwMHZoIC0gMTgwcHgpJztcbiAgICAgICAgICAgICAgICBGZW4yLnN0eWxlLmhlaWdodCA9JzEwMHB4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUG9pbnRTZWxlY3Rpb24ocG9pbnREYXRhKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ2FydGU6IMOJdsOpbmVtZW50IHBvaW50LXNlbGVjdGVkIHJlw6d1ICEnLCBwb2ludERhdGEpO1xuICAgICAgICAgICAgLy8gTG9naXF1ZSBkZSBsYSBjYXJ0ZSA6IGNlbnRyZXIgc3VyIGxlIHBvaW50LCBvdXZyaXIgdW5lIHBvcHVwLCBldGMuXG4gICAgICAgICAgICAvLyBwYXIgZXhlbXBsZSA6IG1hcC5mbHlUbyhbcG9pbnREYXRhLmxhdCwgcG9pbnREYXRhLmxuZ10sIDE1KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgICAgICAgICAvL2ZldGNoQ3JlbmVhdXMoKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjaGVja2VkJytjaGVja2VkLnZhbHVlKVxuICAgICAgICAgICAgYnVzLm9uKCdjcmVuZWF1LXVwZGF0ZWQnLCBmZXRjaENyZW5lYXVzKTtcbiAgICAgICAgICAgIGJ1cy5vbignY3JlbmVhdS10b1VwZGF0ZScsIHVwZGF0ZUNyZW5lYXVzKTtcbiAgICAgICAgICAgIGJ1cy5vbignY2FydGUtdG9VcGRhdGUnLCB1cGRhdGVDYXJ0ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBldmVudFNvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgb25Vbm1vdW50ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvYnNlcnZlcikgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgdG91c0xlc0FnZW50cy52YWx1ZT0gW107XG4gICAgICAgICAgICByYXdEYXRhLnZhbHVlPSBbXTtcbiAgICAgICAgICAgIHRhYnZhbHVlLnZhbHVlID0gJzAnO1xuICAgICAgICAgICAgYnVzLm9mZignY3JlbmVhdS11cGRhdGVkJywgZmV0Y2hDcmVuZWF1cyk7XG4gICAgICAgICAgICBidXMub2ZmKCdjcmVuZWF1LXRvVXBkYXRlJywgdXBkYXRlQ3JlbmVhdXMpO1xuICAgICAgICAgICAgYnVzLm9mZignY2FydGUtdG9VcGRhdGUnKTtcbiAgICAgICAgfSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbjxkaXYgaWQ9XCJtZW51LWJhc1wiIHN0eWxlPVwiaGVpZ2h0OiA0MDBweDtcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlclwiIHN0eWxlPVwiZmxvYXQ6IHJpZ2h0O21hcmdpbjogMjBweCAyMHB4IDAgMDtcIj5cbiAgICAgICAgPHNwYW4gdi1pZj1cInRhYnZhbHVlID09IDFcIj5cbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJldGF0LWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hBZ2VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3VzXCI+VG91czwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJhZ2VudE4gaW4gdG91c0xlc0FnZW50c1wiIDprZXk9XCJhZ2VudE4uaWRcIiA6dmFsdWU9XCJhZ2VudE4uaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWdlbnROLm5vbSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAmbmJzcDsmbmJzcDtcbiAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwicmVzZXRDcmVuZWF1KCk7XCI+VG91cyBjcsOpbmVhdXg8L2J1dHRvbj48L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PFRvZ2dsZVN3aXRjaCB2LW1vZGVsPVwiY2hlY2tlZFwiIC8+XG4gICAgPC9kaXY+XG48ZGl2IGlkPVwiYWdlbnRzXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCBibGFjaztcIiBjbGFzcz1cIm0tMFwiID5cbjxkaXYgdi1pZj1cImFnZW50c0ZpbHRlcmVkLmxlbmd0aCA9PSAwXCI+IFBhcyBkZSBjcsOpbmVhdSB0cm91dsOpLiA8L2Rpdj5cbjxkaXYgdi1lbHNlIGNsYXNzPVwiY2FsZW5kYXItY29udGFpbmVyXCI+XG4gICAgICA8dGFibGU+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDwhLS0gRW4tdMOqdGUgOiBMZXMgbm9tcyBkZXMgYWdlbnRzIGVuIGNvbG9ubmVzIC0tPlxuICAgICAgICAgICAgPHRoIHYtZm9yPVwiYWdlbnQgaW4gYWdlbnRzRmlsdGVyZWRcIiA6a2V5PVwiYWdlbnQuaWRcIiBjbGFzcz1cInN0aWNreS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gIDpjbGFzcz1cIlthZ2VudFNlbCA9PSBhZ2VudC5pZCA/ICdncmVlbicgOiAnJ11cIj57eyBhZ2VudC5ub20gfX0ge3sgYWdlbnQucHJlbm9tIH19PC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPCEtLSBVbmUgbGlnbmUgcGFyIERhdGUgdW5pcXVlIC0tPlxuICAgICAgICAgIDx0ciB2LWZvcj1cImRhdGUgaW4gdG91dGVzTGVzRGF0ZXNcIiA6a2V5PVwiZGF0ZVwiPlxuICAgICAgICAgICAgPHRkIHYtZm9yPVwiYWdlbnQgaW4gYWdlbnRzRmlsdGVyZWRcIiA6a2V5PVwiYWdlbnQuaWRcIiBjbGFzcz1cInNsb3QtY2VsbFwiPlxuICA8ZGl2IHYtaWY9XCJnZXRTbG90c0ZvckFnZW50QW5kRGF0ZShhZ2VudC5pZCwgZGF0ZSkubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgdi1mb3I9XCJzbG90IGluIGdldFNsb3RzRm9yQWdlbnRBbmREYXRlKGFnZW50LmlkLCBkYXRlKVwiIDprZXk9XCJzbG90LmlkXCIgIGNsYXNzPVwic2xvdC1iYWRnZSBlbC1kcmFnXCIgICBkcmFnZ2FibGU9XCJ0cnVlXCIgXG4gIEBkcmFnc3RhcnQ9XCJzdGFydERyYWcoJGV2ZW50LCBzbG90LmlkLCBhZ2VudC5pZCwgc2xvdC5hY3RpZiwgc2xvdC50b3RhbENyZW5lYXVIb3JhaXJlKVwiIDpjbGFzcz1cIltzbG90LmNvbXBsZXQgPyAnY3JlbmVhdS1jb21wbGV0JyA6ICcnXVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNsb3QtaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdj48c3BhbiBjbGFzcz1cInRpbWVcIj57eyBzbG90LmpvdXJTZW1haW5lRnIgfX0ge3sgc2xvdC5kYXRlIH19PGJyPnt7IHNsb3QuY3JlbmVhdUhvcmFpcmUubm9tIH19PC9zcGFuPjwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgIDxwIEBjbGljaz1cImRlc2FjdGl2ZXIoYWdlbnQuaWQsc2xvdC5pZClcIj57eyBzbG90LmFjdGlmID8gJ+KchScgOiAn4p2MJyB9fTwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNsb3QtZm9vdGVyXCIgdi1pZj1cInNsb3QucG9pbnRzLmxlbmd0aCAhPT0gMFwiID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmZvLXRyaWdnZXJcIj7ihLnvuI88L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLXBvcHVwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiB2LWZvcj1cInBvaW50IGluIHNsb3QucG9pbnRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAtIDxzdHJvbmc+e3twb2ludC5ub219fTwvc3Ryb25nPiA6IHt7cG9pbnQudGl0cmVSdWV9fSB7e3BvaW50Lm51bWVyb1J1ZX19IHt7cG9pbnQudGl0cmVSdWV9fSB7e3BvaW50Lm5vbVJ1ZX19IHt7cG9pbnQudmlsbGV9fSAoe3twb2ludC5pZH19KTxicj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2xvdC1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdC1pdGVtXCI+XG4gICAgICAgIDxzcGFuIDpjbGFzcz1cIltzbG90LnRvdGFsID4gMCA/ICdncmVlbicgOiAnJ11cIj57eyBzbG90LnRvdGFsIH19IFJWPC9zcGFuPlxuICAgICAgICA8c3BhbiB0aXRsZT1cIlRvdGFsIHBvdXIgY2V0dGUgdHJhbmNoZSBob3JhaXJlXCIgOmNsYXNzPVwiW3Nsb3QudG90YWxDcmVuZWF1SG9yYWlyZSAgPj0gYWdlbnQudG90YWxDcmVuZWF1SG9yYWlyZSA/ICdhbGVydGUtcm91Z2UnIDogJ3RyYW5jaGUtdG90YWwnXVwiPih7eyBzbG90LnRvdGFsQ3JlbmVhdUhvcmFpcmUgfX0pPC9zcGFuPlxuICAgICAgICA8c3BhbiB2LWlmPVwic2xvdC5kaXN0YW5jZSA+PSAwICYmIHNsb3QudG90YWwgPiAwXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJncmVlblwiPjxzdHJvbmc+e3sgc2xvdC5kaXN0YW5jZSB9fW08L3N0cm9uZz48L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gZWxzZT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj4mbmJzcDs8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PiAgICBcbiAgICA8L2Rpdj5cbiAgICA8L2Rpdj48L2Rpdj5cbjwvdGQ+XG5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgIFxuPC90ZW1wbGF0ZT5cbjxzdHlsZT5cbi5ibG9jLWNyZW5lYXUtZGF0ZSB7ZGlzcGxheTogZmxleDtmbGV4LWRpcmVjdGlvbjogY29sdW1uO31cbi5wLXRhYiB7cGFkZGluZy1ib3R0b206IDJweCAhaW1wb3J0YW50O3BhZGRpbmctdG9wOiAycHggIWltcG9ydGFudDt9XG4uZmxleGNvbHVtbiB7ZGlzcGxheTogZmxleCAhaW1wb3J0YW50O2ZsZXgtZGlyZWN0aW9uOiByb3cgIWltcG9ydGFudDt9XG4uY3JlbmVhdS1pZGVudCB7aGVpZ2h0OiA1MnB4O31cbi5hZ2VudC1ub20ge3Bvc2l0aW9uOiBzdGlja3kgIWltcG9ydGFudDt9XG4uY3JlbmVhdS1kZXNhY3RpdmVyIHtwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMnB4OyByaWdodDoycHg7fVxuXG4uY2FsZW5kYXItY29udGFpbmVyIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIG1heC1oZWlnaHQ6IDgwdmg7IC8qIFNjcm9sbCB2ZXJ0aWNhbCBzaSBiZWF1Y291cCBkZSBkYXRlcyAqL1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xufVxuXG50YWJsZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7IC8qIEltcG9ydGFudCBwb3VyIGxlIHN0aWNreSAqL1xuICBib3JkZXItc3BhY2luZzogMDtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5jYWxlbmRhci1jb250YWluZXIgdGgsIC5jYWxlbmRhci1jb250YWluZXIgdGQge1xuICBib3JkZXI6IDFweCBzb2xpZCAjZWVlO1xuICBwYWRkaW5nOiAycHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgbWluLXdpZHRoOiAxMDBweDtcbn1cblxuLyogRml4ZXIgbCdlbi10w6p0ZSBlbiBoYXV0ICovXG4uc3RpY2t5LWhlYWRlciB7XG4gIHBvc2l0aW9uOiBzdGlja3kgIWltcG9ydGFudDtcbiAgdG9wOiAwO1xuICBiYWNrZ3JvdW5kOiAjZjhmOWZhICFpbXBvcnRhbnQ7XG4gIHotaW5kZXg6IDEwO1xuICBib3gtc2hhZG93OiAwIDJweCAycHggLTFweCByZ2JhKDAsMCwwLDAuMSk7XG59XG5cbi8qIEZpeGVyIGxhIGNvbG9ubmUgZGVzIGRhdGVzIMOgIGdhdWNoZSAqL1xuLnN0aWNreS1jb2wge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICBsZWZ0OiAwO1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICB6LWluZGV4OiAxMTtcbiAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgI2RkZDtcbn1cblxuLyogQ2VsbHVsZSBkJ2FuZ2xlIChoYXV0LWdhdWNoZSkgOiBkb2l0IMOqdHJlIGF1IGRlc3N1cyBkZSB0b3V0ICovXG50aC5zdGlja3ktY29sLnN0aWNreS1oZWFkZXIge1xuICB6LWluZGV4OiAyMDtcbiAgYmFja2dyb3VuZDogI2VjZWNlYztcbn1cblxuLmRhdGUtY29sdW1uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcbn1cblxuLmRhdGUtbGFiZWwge1xuICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjNjY2O1xuICBmb250LXNpemU6IDE0cHg7XG59XG5cbi5kYXRlLXZhbHVlIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjMzMzO1xufVxuLyogU3RydWN0dXJlIGRlIGxhIGNhcnRlIGRlIGNyw6luZWF1ICovXG4uc2xvdC1jZWxsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBOw6ljZXNzYWlyZSBwb3VyIGxlIHotaW5kZXggKi9cbiAgdHJhbnNpdGlvbjogei1pbmRleCAwLjJzO1xufVxuXG4uc2xvdC1jZWxsOmhvdmVyIHtcbiAgei1pbmRleDogNTA7IC8qIFBhc3NlIGF1LWRlc3N1cyBkZXMgYXV0cmVzIGNlbGx1bGVzIGV0IGRlcyBoZWFkZXJzIHN0aWNreSAqL1xufVxuLyogLS0tIEZJWCBWSVNJQklMSVTDiSAtLS0gKi9cbi5zbG90LWNlbGwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIE7DqWNlc3NhaXJlIHBvdXIgbGUgei1pbmRleCAqL1xuICB0cmFuc2l0aW9uOiB6LWluZGV4IDAuMnM7XG59XG5cbi5zbG90LWNlbGw6aG92ZXIge1xuICB6LWluZGV4OiA1MDsgLyogUGFzc2UgYXUtZGVzc3VzIGRlcyBhdXRyZXMgY2VsbHVsZXMgZXQgZGVzIGhlYWRlcnMgc3RpY2t5ICovXG59XG5cbi8qIC0tLSBERVNJR04gREUgTEEgQ0FSVEUgLS0tICovXG4uc2xvdC1iYWRnZSB7XG4gIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNlNWU3ZWI7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgcGFkZGluZzogNHB4O1xuICBtYXJnaW4tYm90dG9tOiA2cHg7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsMCwwLDAuNSk7XG4gIG1pbi13aWR0aDogMTMwcHg7XG4gIGhlaWdodDogOTBweDtcbn1cblxuLnNsb3QtaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAycHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQgI2NjYztcbiAgcGFkZGluZy1ib3R0b206IDJweDtcbn1cblxuLnRpbWUge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgZm9udC1zaXplOiAwLjg1cmVtO1xuICBjb2xvcjogIzI1NjNlYjtcbn1cblxuLnRyYW5jaGUtdG90YWwge1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGJhY2tncm91bmQ6ICNmM2Y0ZjY7XG4gIHBhZGRpbmc6IDBweDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBjb2xvcjogIzRiNTU2Mztcbn1cblxuLnNsb3QtYm9keSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IC8qIE9yZ2FuaXNhdGlvbiB2ZXJ0aWNhbGUgZGVzIHN0YXRzICovXG4gIGdhcDogMnB4O1xuICBtYXJnaW4tYm90dG9tOiAwcHg7XG59XG5cbi5zdGF0LWl0ZW0ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDVweDtcbiAgZm9udC1zaXplOiAxMnB4O1xufVxuXG4uaWNvbiB7XG4gIGZvbnQtc2l6ZTogMC45cmVtO1xufVxuXG4udmFsdWUge1xuICBmb250LXdlaWdodDogNTAwO1xuICBjb2xvcjogIzFmMjkzNztcbn1cblxuLnNsb3QtZm9vdGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uc2xvdC1kYXRlIHtcbiAgZm9udC1zaXplOiAwLjdyZW07XG4gIGNvbG9yOiAjOWNhM2FmO1xufVxuXG4vKiAtLS0gU1RZTEUgRFUgUE9QVVAgLS0tICovXG4uaW5mby13cmFwcGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBjdXJzb3I6IGhlbHA7XG59XG5cbi5pbmZvLXRyaWdnZXIge1xuICBmb250LXNpemU6IDFyZW07XG4gIG9wYWNpdHk6IDAuNjtcbn1cblxuLmluZm8tdHJpZ2dlcjpob3ZlciB7XG4gIG9wYWNpdHk6IDE7XG59XG5cbi5pbmZvLXBvcHVwIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7XG4gIHRvcDogY2FsYygxMDB2aCAtIDQwMHB4KTsgLyogUydhZmZpY2hlIGF1LWRlc3N1cyBkZSBsJ2ljw7RuZSAqL1xuICBsZWZ0OiAxMHB4O1xuICB3aWR0aDogMjUwcHggIWltcG9ydGFudDtcbiAgaGVpZ2h0OiBhdXRvO1xuICBiYWNrZ3JvdW5kOiAjMWYyOTM3OyAvKiBGb25kIHNvbWJyZSBtb2Rlcm5lICovXG4gIGNvbG9yOiB3aGl0ZTtcbiAgcGFkZGluZzogMTBweCAhaW1wb3J0YW50O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJveC1zaGFkb3c6IDAgMTBweCAxNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjMpO1xuICB6LWluZGV4OiAxMDAwMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7IC8qIFBvdXIgbmUgcGFzIGfDqm5lciBsYSBzb3VyaXMgKi9cbiAgZm9udC1zaXplOiAwLjhyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG59XG5cbi5wb3B1cC10aXRsZSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gIGNvbG9yOiAjNjBhNWZhO1xufVxuXG4uaW5mby1wb3B1cCBociB7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICMzNzQxNTE7XG4gIG1hcmdpbjogNXB4IDA7XG59XG5cbi5pbmZvLXdyYXBwZXI6aG92ZXIgLmluZm8tcG9wdXAge1xuICBkaXNwbGF5OiBibG9jazsgLyogQWZmaWNoZSBsYSBidWxsZSBhdSBzdXJ2b2wgKi9cbn1cblxuLyogUGV0aXQgdHJpYW5nbGUgZW4gYmFzIGRlIGxhIGJ1bGxlICovXG4uaW5mby1wb3B1cDI6OmFmdGVyIHtcbiAgY29udGVudDogXCJcIjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDEwMCU7XG4gIHJpZ2h0OiAxMHB4O1xuICBib3JkZXItd2lkdGg6IDZweDtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLWNvbG9yOiAjMWYyOTM3IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xufVxuLmdyZWVuIHtmb250LXNpemU6IDE0cHg7IGJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDtjb2xvcjogcmdiKDMsIDI1MywgNzQpICFpbXBvcnRhbnQ7Zm9udC13ZWlnaHQ6IGJvbGQ7fVxuLmVtcHR5LWNlbGwge1xuICBjb2xvcjogI2RkZDtcbn1cbi5jcmVuZWF1LWNvbXBsZXQge2JhY2tncm91bmQtY29sb3I6ICNkN2Q3ZDcgIWltcG9ydGFudDt9XG5cbi5hbGVydGUtcm91Z2Uge2ZvbnQtc2l6ZTogMTRweCAhaW1wb3J0YW50OyBjb2xvcjogcmVkICFpbXBvcnRhbnQ7cGFkZGluZzogMHB4O31cbjwvc3R5bGU+IiwiPHNjcmlwdCBzZXR1cD5cblxuaW1wb3J0IHsgY3JlYXRlQXBwLCByZWYsIG9uTW91bnRlZCwgb25CZWZvcmVVbm1vdW50LCBvblVubW91bnRlZCwgZ2V0Q3VycmVudEluc3RhbmNlLCBjb21wdXRlZCwgd2F0Y2h9ICBmcm9tICd2dWUnO1xuXG5pbXBvcnQgeyBGaWx0ZXJNYXRjaE1vZGUsIEZpbHRlck9wZXJhdG9yIH0gZnJvbSAnQHByaW1ldnVlL2NvcmUvYXBpJztcblxuaW1wb3J0IHsgYnVzIH0gZnJvbSAnLi4vYnVzLmpzJzsgXG5pbXBvcnQgeyBGdW5jdGlvbnMgfSBmcm9tICcuL3NlcnZpY2UvRnVuY3Rpb25zJztcblxuaW1wb3J0IHsgVnVlRGF0ZVBpY2tlciB9IGZyb20gJ0B2dWVwaWMvdnVlLWRhdGVwaWNrZXInO1xuaW1wb3J0ICdAdnVlcGljL3Z1ZS1kYXRlcGlja2VyL2Rpc3QvbWFpbi5jc3MnXG5cbmltcG9ydCBTZWFyY2ggZnJvbSAnLi9TZWFyY2gudnVlJztcblxuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJ3ByaW1ldnVlL3Byb2dyZXNzYmFyJztcbmltcG9ydCBEYXRhVGFibGUgZnJvbSAncHJpbWV2dWUvZGF0YXRhYmxlJztcbmltcG9ydCBDb2x1bW4gZnJvbSAncHJpbWV2dWUvY29sdW1uJztcbmltcG9ydCBDb2x1bW5Hcm91cCBmcm9tICdwcmltZXZ1ZS9jb2x1bW5ncm91cCc7ICAgXG5pbXBvcnQgUm93IGZyb20gJ3ByaW1ldnVlL3Jvdyc7ICAgICBcblxuaW1wb3J0IFRvb2xiYXIgZnJvbSAncHJpbWV2dWUvdG9vbGJhcic7XG5pbXBvcnQgeyB1c2VUb2FzdCB9IGZyb20gJ3ByaW1ldnVlL3VzZXRvYXN0JztcblxuaW1wb3J0IElucHV0VGV4dCBmcm9tICdwcmltZXZ1ZS9pbnB1dHRleHQnO1xuaW1wb3J0IFNlbGVjdCBmcm9tICdwcmltZXZ1ZS9zZWxlY3QnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdwcmltZXZ1ZS9idXR0b24nO1xuaW1wb3J0IFRleHRhcmVhIGZyb20gJ3ByaW1ldnVlL3RleHRhcmVhJztcblxuaW1wb3J0IERpYWxvZyBmcm9tICdwcmltZXZ1ZS9kaWFsb2cnO1xuXG5pbXBvcnQgSWNvbkZpZWxkIGZyb20gJ3ByaW1ldnVlL2ljb25maWVsZCc7XG5pbXBvcnQgSW5wdXRJY29uIGZyb20gJ3ByaW1ldnVlL2lucHV0aWNvbic7XG5cblxuICAgICAgICBjb25zdCBldGF0cyA9IHJlZigpO1xuICAgICAgICBjb25zdCBsaXN0ZWFnZW50cyA9IHJlZigpO1xuICAgICAgICBjb25zdCBvcGVyYXRpb25JRCA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHBhcmFtID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VTZWwgPSByZWYoJ1PDqWxlY3Rpb25uZXonKTtcbiAgICAgICAgY29uc3QgdHlwZVNlbCA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlc190eXBlcyA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlc1R5cGUgPSByZWYoW10pOyBcbiAgICAgICAgY29uc3QgcG9pbnRzID0gcmVmKFtdKTsgLy8gTGEgbGlzdGUgc2VyYSBjaGFyZ8OpZSBldCBtaXNlIMOgIGpvdXIgdmlhIE1lcmN1cmUvQVBJXG4gICAgICAgIGNvbnN0IGxvY2tlZFBvaW50cyA9IHJlZihbXSk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2V1ciA9IHJlZignJyk7XG4gICAgICAgIGNvbnN0IG5vbWJyZSA9IHJlZigpO1xuICAgICAgICBjb25zdCB0b3RhbCA9IHJlZigpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZigpO1xuICAgICAgICBjb25zdCBwb3VyY2VudCA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlU01TPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZUV4Y2VsPSByZWYoKTtcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gcmVmKFtdKTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IDA7XG4gICAgICAgIGxldCBzZWwgPSAwO1xuICAgICAgICBsZXQgc2VhcmNoID0gMDtcbiAgICAgICAgY29uc3QgbWFWYWxldXIgPSByZWYoMClcbiAgICAgICAgY29uc3Qgc2hvd1dpdGhSViA9IHJlZih0cnVlKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkID0gJyc7XG4gICAgICAgIGNvbnN0IG1vaXMgPSByZWYoKTtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IGRhdGUgPSByZWYobmV3IERhdGUoKSk7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJJRCA9IHJlZigpO1xuICAgICAgICBjb25zdCBsb2FkaW5nID1yZWYoKTtcbiAgICAgICAgbG9hZGluZy52YWx1ZSA9IHRydWU7XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoTm9tID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU3RhdHVzID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNlYXJjaE51bWVyb1BoeXNpcXVlID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaE51bWVyb0NsaWVudCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hOb21SdWUgPSByZWYoJ1RvdXRlcycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoRGF0ZVJWID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFF1YXJ0aWVyID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNlYXJjaFZpbGxlID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaEV0YXQgPSByZWYoJ1RvdXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFRlbCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMiA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMyA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyNCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyNSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hBZ2VudCA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoTGliZWxsZSA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2xvdFByb3BzID0gcmVmKCk7IFxuXG4gICAgICAgIGNvbnN0IGNsaWNrZWRSb3dJZCA9IHJlZihudWxsKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWJsZVBvaW50cyA9IHJlZihbXSk7IFxuICAgICAgICBjb25zdCBDb2xvcnMgPSByZWYoW10pOyBcblxuICAgICAgICBjb25zdCBleHBhbmRlZFJvd3NUYWIgPSByZWYoW10pO1xuICAgICAgICBjb25zdCB0b2FzdCA9IHVzZVRvYXN0KCk7XG4gICAgICAgIGNvbnN0IHByb2R1Y3REaWFsb2cgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBleGNlbERpYWxvZyA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IHByb2R1Y3QgPSByZWYoe30pO1xuICAgICAgICBjb25zdCBzdWJtaXR0ZWQgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlZigwKTtcbiAgICAgICAgY29uc3QgZGF0YUNyZW5lYXUgPSB7fTtcbiAgICAgICAgY29uc3QgZGF0ZUV4Y2VsID0ge307XG4gICAgICAgIGNvbnN0IGRhdGFDYXJ0ZSA9IHt9O1xuICAgICAgICBjb25zdCBmb3JtYXQgPSAoZGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpKzE7XG4gICAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICByZXR1cm4gYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3RzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1ldGFLZXkgPSByZWYodHJ1ZSk7XG5cbi8vQ0VOVFJBTEUgREUgQ09NTVVOSUNBVElPTlxuXG4gICAgICAgIGZ1bmN0aW9uIGZldGNoUG9pbnRzIChjbHVzdGVyX2lkKXsgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLy8geW91ciBvcHRpb25zLi4uIG1ldGhvZDogUE9TVCwgaGVhZGVycywgY29ycywgZXRjLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRlLnZhbHVlPScnXG4gICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy9jbHVzdGVyLycrY2x1c3Rlcl9pZCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhdGEuc3RhdHVzJytkYXRhLnN0YXR1cykgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkaXJlY3Rpb24gZm9yY8OpZSB2ZXJzIGxhIHBhZ2UgZGUgbG9naW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjaGFyZ2VtZW50IHBvaW50cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZSA9IGRhdGEucmVzcG9uc2UubWFwKHAgPT4gKHsgLi4ucCwgaXNFZGl0aW5nOiBmYWxzZSwgb3JpZ2luYWw6IHt9LCBzZWxlY3RlZDogZmFsc2UgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RJdGVtID0gcG9pbnRzLnZhbHVlLmZpbmQoeD0+eCE9PXVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlYXJjaCA+IDApe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IHNlYXJjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5maXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRQb2ludChwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ1VuZSBlcnJldXIgc1xcJ2VzdCBwcm9kdWl0ZSBvdSB2b3VzIMOqdGVzIGTDqWNvbm5lY3TDqScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkgLy8gZG8gc29tZXRoaW5nIHVzZWZ1bCB3aXRoIGVycm9yXG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gZmV0Y2hQb2ludHNPcGVyYXRpb24ob3BlcmF0aW9uX2lkKXsgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLy8geW91ciBvcHRpb25zLi4uIG1ldGhvZDogUE9TVCwgaGVhZGVycywgY29ycywgZXRjLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY2hhcmdlbWVudCBkZXMgcG9pbnRzJylcbiAgICAgICAgICAgICAgICBkYXRlLnZhbHVlPScnXG4gICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy9wbGFubmluZy8nK29wZXJhdGlvbl9pZCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhdGEuc3RhdHVzJytkYXRhLnN0YXR1cykgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkaXJlY3Rpb24gZm9yY8OpZSB2ZXJzIGxhIHBhZ2UgZGUgbG9naW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjaGFyZ2VtZW50IHBvaW50cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZSA9IGRhdGEucmVzcG9uc2UubWFwKHAgPT4gKHsgLi4ucCwgaXNFZGl0aW5nOiBmYWxzZSwgb3JpZ2luYWw6IHt9LCBzZWxlY3RlZDogZmFsc2UgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RJdGVtID0gcG9pbnRzLnZhbHVlLmZpbmQoeD0+eCE9PXVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZpcnN0SXRlbSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SXRlbS5zZWxlY3RlZCA9IGZhbHNlO31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZWFyY2ggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBzZWFyY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0UG9pbnQocG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KCdVbmUgZXJyZXVyIHNcXCdlc3QgcHJvZHVpdGUgb3Ugdm91cyDDqnRlcyBkw6ljb25uZWN0w6knKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pIC8vIGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCBlcnJvclxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGdldEluZm9zID0gYXN5bmMoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYXBwZWwgZ2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9pbnRzL2dldFYyLycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRwb2ludHM6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleDIgPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gZWxlbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRJbmRleDIgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXgyXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZHUgcHJvZHVpdDpcIiwgYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdFcnJldXIgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGRlIGxhIGZpY2hlIDogJythd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ1VuZSBlcnJldXIgc1xcJ2VzdCBwcm9kdWl0ZSBvdSB2b3VzIMOqdGVzIGTDqWNvbm5lY3TDqScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZU1lcmN1cmVNZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTsgXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTWVyY3VyZSBtZXNzYWdlIHJlY2VpdmVkIDpgLCBkYXRhKTtcbiAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50LmFjdGlvbjtcbiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaF9jcmVuZWF1ID0gMDtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAvL21pc2Ugw6Agam91ciBkZXMgY2x1c3RlcnMgY29tcGxldFxuICAgICAgICAgICAgICAgICAgICBjYXNlICdjbHVzdGVyX2NvbXBsZXRlZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnY2x1c3RlcnNjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBlbGVtZW50LCAvLyBQYXNzIHlvdXIgZGF0YSBpbiB0aGUgJ2RldGFpbCcgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGVhZmxldG1hcCcpLmNvbnRlbnRXaW5kb3cuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwcm9kdWN0X3VwZGF0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmZvcyhlbGVtZW50LnBvaW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfY3JlbmVhdSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NyZW5lYXVfdXBkYXRlZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY3JlbmVhdV91cGRhdGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfY3JlbmVhdSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFVwZGF0ZShlbGVtZW50LmRvbm5lZXMubm9tYnJlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHJlZnJlc2hfY3JlbmVhdSA9PSAxKXtcbiAgICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS11cGRhdGVkJywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbi8vIElOVEVSRkFDRVxuICAgICAgICBjb25zdCBhZ2VudHMgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbEFnZW50c1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiAocG9pbnQuYWdlbnQubm9tKycgJysocG9pbnQuYWdlbnQucHJlbm9tPz8nJykpKVxuICAgICAgICAgICAgY29uc3QgdW5pcXVlQWdlbnRTZXQgPSBuZXcgU2V0KGFsbEFnZW50c1dpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZUFnZW50U2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHZpbGxlcyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsQ2l0aWVzV2l0aER1cGxpY2F0ZXMgPSBwb2ludHMudmFsdWUubWFwKHBvaW50ID0+IHBvaW50LnZpbGxlKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUNpdHlTZXQgPSBuZXcgU2V0KGFsbENpdGllc1dpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZUNpdHlTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcXVhcnRpZXJzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxRdWFydGllcnNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnQucXVhcnRpZXIpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlUXVhcnRpZXJTZXQgPSBuZXcgU2V0KGFsbFF1YXJ0aWVyc1dpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZVF1YXJ0aWVyU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJ1ZXMgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbFJ1ZXNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnQubm9tUnVlKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVJ1ZVNldCA9IG5ldyBTZXQoYWxsUnVlc1dpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZVJ1ZVNldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBsaWJlbGxlcyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsTGliZWxsZXNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnQubGliZWxsZUNvbXB0ZXVyKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUxpYmVsbGVzU2V0ID0gbmV3IFNldChhbGxMaWJlbGxlc1dpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZUxpYmVsbGVzU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRhdGVzUlYgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbERhdGVzUlZXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnRfUlYocG9pbnQpKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZWFsbERhdGVzUlZTZXQgPSBuZXcgU2V0KGFsbERhdGVzUlZXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVhbGxEYXRlc1JWU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIHBvaW50X1JWKHBvaW50KXtcbiAgICAgICAgICBpZihwb2ludC5jcmVuZWF1KXsgXG4gICAgICAgICAgICAgaWYocG9pbnQuY3JlbmVhdS5kYXRlKXtyZXR1cm4gcG9pbnQuY3JlbmVhdS5kYXRlO31lbHNle3JldHVybiAnU2FucyBSVic7fVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNle3JldHVybiAnU2FucyBSVic7fVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvcHJpw6l0w6kgY2FsY3Vsw6llIHF1aSByZW52ZXJyYSBsYSBsaXN0ZSBmaWx0csOpZSDDoCBsYSBEYXRhVGFibGVcbiAgICAgICAgY29uc3QgZmlsdGVyZWRQb2ludHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZmlsdGVyIGV0YXBlJyk7XG4gICAgICAgICAgICAvLyBTaSBvbiBuJ2EgcGFzIGVuY29yZSBkZSBkb25uw6llcywgb24gcmVudm9pZSB1biB0YWJsZWF1IHZpZGVcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbiBjb21tZW5jZSBhdmVjIHVuZSBjb3BpZSBkZSB0b3V0ZXMgbGVzIGRvbm7DqWVzXG4gICAgICAgICAgICBsZXQgcG9pbnRzVG9GaWx0ZXIgPSBbLi4ucG9pbnRzLnZhbHVlXTtcblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBub21cbiAgICAgICAgICAgIGlmIChzZWFyY2hOb20udmFsdWUgJiYgc2VhcmNoTm9tLnZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOb20udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgLy8gQWpvdXRleiBpY2kgdG91IGxlcyBjaGFtcHMgZGFucyBsZXNxdWVscyB2b3VzIHZvdWxleiBjaGVyY2hlclxuICAgICAgICAgICAgICAgICAgICBwb2ludC5ub20udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlckNhc2VTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBOdW1lcm9QaHlzaXF1ZVxuICAgICAgICAgICAgaWYgKHNlYXJjaE51bWVyb1BoeXNpcXVlLnZhbHVlICYmIHNlYXJjaE51bWVyb1BoeXNpcXVlLnZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICAvLyBBam91dGV6IGljaSB0b3VzIGxlcyBjaGFtcHMgZGFucyBsZXNxdWVscyB2b3VzIHZvdWxleiBjaGVyY2hlclxuICAgICAgICAgICAgICAgICAgICBwb2ludC5udW1lcm9QaHlzaXF1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyQ2FzZVNlYXJjaClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaWx0cmUgcGFyIE51bWVyb0NsaWVudFxuICAgICAgICAgICAgaWYgKHNlYXJjaE51bWVyb0NsaWVudC52YWx1ZSAmJiBzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyQ2FzZVNlYXJjaCA9IHNlYXJjaE51bWVyb0NsaWVudC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICAvLyBBam91dGV6IGljaSB0b3VzIGxlcyBjaGFtcHMgZGFucyBsZXNxdWVscyB2b3VzIHZvdWxleiBjaGVyY2hlclxuICAgICAgICAgICAgICAgICAgICBwb2ludC5udW1lcm9DbGllbnQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlckNhc2VTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBOb21SdWVcbiAgICAgICAgICAgIGlmIChzZWFyY2hOb21SdWUudmFsdWUgJiYgc2VhcmNoTm9tUnVlLnZhbHVlLnRyaW0oKSAhPT0gJ1RvdXRlcycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOb21SdWUudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgLy8gQWpvdXRleiBpY2kgdG91cyBsZXMgY2hhbXBzIGRhbnMgbGVzcXVlbHMgdm91cyB2b3VsZXogY2hlcmNoZXJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubm9tUnVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBWaWxsZVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygndmlsbGUnK3NlYXJjaFZpbGxlLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaFZpbGxlLnZhbHVlICYmIHNlYXJjaFZpbGxlLnZhbHVlICE9PSAnVG91dGVzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC52aWxsZSA9PT0gc2VhcmNoVmlsbGUudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgVGVsXG4gICAgICAgICAgICBpZiAoc2VhcmNoVGVsLnZhbHVlICYmIHNlYXJjaFRlbC52YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQudGVsMS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlbC52YWx1ZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgUXVhcnRpZXJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3F1YXJ0aWVyJytzZWFyY2hRdWFydGllci52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hRdWFydGllci52YWx1ZSAmJiBzZWFyY2hRdWFydGllci52YWx1ZSAhPT0gJ1RvdXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnF1YXJ0aWVyID09PSBzZWFyY2hRdWFydGllci52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBMaWJlbGxlXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWFydGllcicrc2VhcmNoUXVhcnRpZXIudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoTGliZWxsZS52YWx1ZSAmJiBzZWFyY2hMaWJlbGxlLnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubGliZWxsZUNvbXB0ZXVyID09PSBzZWFyY2hMaWJlbGxlLnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIEFnZW50XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWFydGllcicrc2VhcmNoUXVhcnRpZXIudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoQWdlbnQudmFsdWUgJiYgc2VhcmNoQWdlbnQudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICAocG9pbnQuYWdlbnQubm9tKycgJysocG9pbnQuYWdlbnQucHJlbm9tPz8nJykpID09PSBzZWFyY2hBZ2VudC52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBEYXRlUlZcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3F1YXJ0aWVyJytzZWFyY2hRdWFydGllci52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hEYXRlUlYudmFsdWUgJiYgc2VhcmNoRGF0ZVJWLnZhbHVlICE9PSAnVG91dGVzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25fcG9pbnRfUlYocG9pbnQsIHNlYXJjaERhdGVSVi52YWx1ZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gY29uZGl0aW9uX3BvaW50X1JWKHBvaW50LCBkYXRlUlYpe1xuICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1KXsgXG4gICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgaWYocG9pbnQuY3JlbmVhdS5kYXRlID09IGRhdGVSVil7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICBpZihkYXRlUlYgPT0gJ1NhbnMgUlYnKXtyZXR1cm4gdHJ1ZTt9XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIGlmKGRhdGVSViA9PSAnU2FucyBSVicpe3JldHVybiB0cnVlO31cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBFdGF0XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdldGF0JytzZWFyY2hFdGF0LnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaEV0YXQudmFsdWUgJiYgc2VhcmNoRXRhdC52YWx1ZSAhPT0gJ1RvdXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmV0YXQuaWQgPT09IHNlYXJjaEV0YXQudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIERhdGVSVlxuICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9zZWxlY3RlZChwb2ludClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgZnVuY3Rpb24gY29uZGl0aW9uX3NlbGVjdGVkKHBvaW50KXtcbiAgICAgICAgICAgICAgICAgaWYocG9pbnQuZnJvemVuKXtcbiAgICAgICAgICAgICAgICAgICAgICBpZihwb2ludC5mcm96ZW4gPT0gdHJ1ZSl7cmV0dXJuIGZhbHNlO31cbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY291bnQudmFsdWUgPSBwb2ludHNUb0ZpbHRlci5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gcG9pbnRzVG9GaWx0ZXI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNsZWFyRmlsdGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgc2VhcmNoTm9tLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hFdGF0LnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgc2VhcmNoUXVhcnRpZXIudmFsdWUgPSAnVG91cyc7XG4gICAgICAgICAgICBzZWFyY2hMaWJlbGxlLnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgc2VhcmNoVGVsLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hWaWxsZS52YWx1ZSA9ICdUb3V0ZXMnO1xuICAgICAgICAgICAgc2VhcmNoTm9tUnVlLnZhbHVlID0gJ1RvdXRlcyc7XG4gICAgICAgICAgICBzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUgID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZSAgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaERhdGVSVi52YWx1ZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9vbiByZWNvaXQgdW4gbWVzc2FnZSBkZSBsZWFmbGV0XG4gICAgICAgIGNvbnN0IHVwZGF0ZUNsdXN0ZXIgPSAoY2x1c3RlclNlYXJjaCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJGaWx0ZXIoKTtcbiAgICAgICAgICAgIGV2YWwoJ3NlYXJjaENsdXN0ZXInK2NsdXN0ZXJTZWFyY2gudHlwZSsnLnZhbHVlID0gJytjbHVzdGVyU2VhcmNoLnZhbHVlKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjbGljIHJlY2lldmVkJyArIGNsdXN0ZXJTZWFyY2gudHlwZSArJ2lkJysgKyBjbHVzdGVyU2VhcmNoLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb24gcsOpaW5pdGFsaXNlIGwnYWZmaWNoYWdlLCBvbiBsw6h2ZSBsZSBsb2NrXG4gICAgICAgIGNvbnN0IGdsb2JhbEV4dGVybmFsQ2FsbCA9IChjbHVzdGVyX2lkLCBzZWwpID0+IHtcbiAgICAgICAgICAgIC8vc2VuZExvY2sobnVsbCwgMik7XG4gICAgICAgICAgICBzZWFyY2ggPSBzZWw7XG4gICAgICAgICAgICBmZXRjaFBvaW50cyhjbHVzdGVyX2lkKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UG9pbnQgPSAoaWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzLnZhbHVlLmZpbmQocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAocG9pbnQpIHtcbiAgICAgICAgICAgICAgICBwb2ludC5vcmlnaW5hbCA9IHsgLi4ucG9pbnQgfTtcbiAgICAgICAgICAgICAgICBwb2ludC5pc0VkaXRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3BvaW50QycrcG9pbnQuaWQpO1xuICAgICAgICAgICAgICAgIGlmIChwb2ludC5jcmVuZWF1ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNyZW5lYXUgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQuY3JlbmVhdS5pZCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3NlbmRMb2NrKHBvaW50LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjYW5jZWxFZGl0ID0gKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgIGlmIChwb2ludEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XSA9IHsgLi4ucG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLm9yaWdpbmFsLCBpc0VkaXRpbmc6IGZhbHNlLCBvcmlnaW5hbDoge30gfTtcbiAgICAgICAgICAgICAgICAvL3NlbmRMb2NrKHBvaW50cy52YWx1ZVtwb2ludEluZGV4XSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc2VuZEluZm9zID0gYXN5bmMoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9wb2ludHMvdXBkYXRlVjIvJytpZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHByb2R1Y3QudmFsdWUuY29tbWVudGFpcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJsZTogcHJvZHVjdC52YWx1ZS5jb21wdGV1ckFjY2Vzc2libGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2l2aWxpdGU6IHByb2R1Y3QudmFsdWUuY2l2aWxpdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9tOiBwcm9kdWN0LnZhbHVlLm5vbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcm9DbGllbnQ6IHByb2R1Y3QudmFsdWUubnVtZXJvQ2xpZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbDE6IHByb2R1Y3QudmFsdWUudGVsMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWwyOiBwcm9kdWN0LnZhbHVlLnRlbDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IHByb2R1Y3QudmFsdWUuZW1haWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhdDogcHJvZHVjdC52YWx1ZS5ldGF0LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZW50OiBwcm9kdWN0LnZhbHVlLmFnZW50LmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdNb2RpZmljYXRpb24gZW52b3nDqWUgw6AgU3ltZm9ueS4gQXR0ZW50ZSBkZSBsYSBtaXNlIMOgIGpvdXIgTWVyY3VyZS4uLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0ZpY2hlIG1pc2Ugw6Agam91cic7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5pc0VkaXRpbmcgPSBmYWxzZTsgLy8gU29ydGlyIGR1IG1vZGUgw6lkaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdID0gcHJvZHVjdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVEaWFsb2coKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZHUgcHJvZHVpdDpcIiwgYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdFcnJldXIgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGRlIGxhIGZpY2hlIDogJythd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIHLDqXNlYXUgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZW5kRXRhdCA9IGFzeW5jKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9pbnRzL3VwZGF0ZVYyLycraWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGF0OiA2XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ01vZGlmaWNhdGlvbiBlbnZvecOpZSDDoCBTeW1mb255LiBBdHRlbnRlIGRlIGxhIG1pc2Ugw6Agam91ciBNZXJjdXJlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnRmljaGUgbWlzZSDDoCBqb3VyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Byb2R1Y3QuaXNFZGl0aW5nID0gZmFsc2U7IC8vIFNvcnRpciBkdSBtb2RlIMOpZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9wb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSBwcm9kdWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkdSBwcm9kdWl0OlwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0VycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZGUgbGEgZmljaGUgOiAnK2F3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgcsOpc2VhdSBsb3JzIGRlIGxhIHNhdXZlZ2FyZGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2VuZEV4Y2VsKCl7XG4gICAgICAgICAgICBoaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvXG4gICAgICAgICAgICBsZXQgY2hhaW5lID0gJyc7XG4gICAgICAgICAgICBmaWx0ZXJlZFBvaW50cy52YWx1ZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY2hhaW5lID0gY2hhaW5lICsgZWxlbWVudC5pZCArICcsJztcblxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNoYWluZS5zbGljZSgwLCAtMSlcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZldGNoKCcvYWRtaW4vZXhjZWwvZXhwb3J0LycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5lOiBjaGFpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uX2lkOiBvcGVyYXRpb25JRC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpLnRoZW4oZGF0YSA9PiB3aW5kb3cub3BlbihVUkwuY3JlYXRlT2JqZWN0VVJMKGRhdGEpKSlcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgZXhjZWxcIik7XG4gICAgICAgICAgICAgfSAgIFxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2VsZWN0ZWRQb2ludHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHBvaW50cy52YWx1ZS5maWx0ZXIocG9pbnQgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhwb2ludC5zZWxlY3RlZCk7XG4gICAgICAgICAgICByZXR1cm4gKHBvaW50LnNlbGVjdGVkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBzZWFyY2hEYXRlQ3JlbmVhdShpZCkge1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LnBvaW50ID0gaWQ7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUuZGlzdGFuY2UgPSAncmVzZXQnO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LmRhdGUgPSBmb3JtYXREYXRlKGRhdGUudmFsdWUpO1xuICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS10b1VwZGF0ZScsIGRhdGFDcmVuZWF1KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZVRvRm9ybWF0KXtcbiAgICAgICAgICBpZiAoIWRhdGVUb0Zvcm1hdCkgcmV0dXJuICcnO1xuICAgICAgICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlVG9Gb3JtYXQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGVUb0Zvcm1hdC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTsgLy8gTGVzIG1vaXMgc29udCBpbmRleMOpcyDDoCBwYXJ0aXIgZGUgMFxuICAgICAgICAgIGNvbnN0IHllYXIgPSBkYXRlVG9Gb3JtYXQuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRTTVMgPSBhc3luYyhwb2ludCwgdGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYodGVsLmxlbmd0aCA9PSA3KXt0ZWwgPSAnMCcgKyB0ZWw7fVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWVbMF0udGV4dGUgPSBtZXNzYWdlLnZhbHVlWzBdLnRleHRlLnJlcGxhY2UoXCJOT01cIiwgcG9pbnQuY2l2aWxpdGUrJyAnK3BvaW50Lm5vbSk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZVswXS50ZXh0ZSA9IG1lc3NhZ2UudmFsdWVbMF0udGV4dGUucmVwbGFjZShcIkFEUkVTU0VcIiwgcG9pbnQubnVtZXJvUnVlKycgJysgcG9pbnQudGl0cmVSdWUrJyAnK3BvaW50Lm5vbVJ1ZSsnICcrcG9pbnQuY29kZVBvc3RhbCsnICcrcG9pbnQudmlsbGUpO1xuICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUpe1xuICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWVbMF0udGV4dGUgPSBtZXNzYWdlLnZhbHVlWzBdLnRleHRlLnJlcGxhY2UoXCJEQVRFXCIsIHBvaW50LmNyZW5lYXUuZGF0ZSsnICcrIHBvaW50LmNyZW5lYXUuY3JlbmVhdUhvcmFpcmUubm9tICsnIEFnZW50IDogJytwb2ludC5jcmVuZWF1LmFnZW50Lm5vbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZW5jb2RlZFRleHQgPSBlbmNvZGVVUklDb21wb25lbnQobWVzc2FnZS52YWx1ZVswXS50ZXh0ZSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQXN0dWNlIHBvdXIgY29tcGF0aWJpbGl0w6kgaU9TIHZzIEFuZHJvaWRcbiAgICAgICAgICAgICAgICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdmFyIGlzaU9TID0gL2lwaG9uZXxpcGFkfGlwb2QvLnRlc3QodWEpO1xuICAgICAgICAgICAgICAgIHZhciBzZXBhcmF0b3IgPSBpc2lPUyA/ICcmJyA6ICc/JztcblxuICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKCdzbXM6JyArIHRlbCArIHNlcGFyYXRvciArICdib2R5PScgKyBlbmNvZGVkVGV4dCwgJ19ibGFuaycpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvc21zLycrcG9pbnQuaWQrJy8nK21lc3NhZ2UudmFsdWVbMF0uaWQrJy9zZW5kJywge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgIC8vIG1lc3NhZ2V1cj0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VuZEVtYWlsID0gYXN5bmMoaWQpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYWlsLycraWQrJy8nK21lc3NhZ2UudmFsdWVbMF0uaWQrJy9tYWlsc2VuZCcsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7bWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgZW52b2kgbWFpbFwiO31cbiAgICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gZGF0YS5kYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSBcIkVycmV1ciByw6lzZWF1XCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyZXVyIHLDqXNlYXVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB3YXRjaChtZXNzYWdlU2VsLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gbWVzc2FnZXMudmFsdWUuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5pZCA9PT0gbWVzc2FnZVNlbC52YWx1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdHlwZVNlbC52YWx1ZSA9IG1lc3NhZ2UudmFsdWVbMF0udHlwZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0eXBlU2VsLnZhbHVlJyt0eXBlU2VsLnZhbHVlKVxuICAgICAgICB9KTtcblxuLy9sZXMgcG9pbnRzIHPDqWxlY3Rpb25uw6lzXG5cbi8vRVZFTlQgSU5URVJGQUNFICBcbiAgICAgICAgY29uc3QgTG9jayA9IChldmVudCkgPT4geyAgICAgIFxuICAgICAgICAgICAgbGV0IHBvaW50SW5kZXggPSAtMTsgICAgICBcbiAgICAgICAgICAgIGxvY2tlZFBvaW50cy52YWx1ZSA9IFtdO1xuICAgICAgICAgICAgcG9pbnRJbmRleCA9IGZpbHRlcmVkUG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGV2ZW50LmRhdGEuaWQpO1xuICAgICAgICAgICAgaWYocG9pbnRJbmRleCAhPSAtMSl7XG4gICAgICAgICAgICAgICAgLy9sb2NrZWRQb2ludHMudmFsdWUgPSBbbG9ja2VkUG9pbnRzLnZhbHVlLmZpbHRlcihwID0+IHAuaWQgIT09IGV2ZW50LmRhdGEuaWQpXTsgIFxuICAgICAgICAgICAgICAgIGZpbHRlcmVkUG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmZyb3plbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlLnB1c2goZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvaW50SW5kZXggPSBmcm96ZW5Qb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gZXZlbnQuZGF0YS5pZCk7XG4gICAgICAgICAgICAvL2V4cGFuZGVkUm93c1RhYi52YWx1ZSA9IFtdO1xuICAgICAgICAgICAgLy9leHBhbmRlZFJvd3NUYWIudmFsdWUucHVzaChmcm96ZW5Qb2ludHMudmFsdWVbcG9pbnRJbmRleF0pO1xuICAgICAgICAgICAgXG5cbiAgICAgICAgICAgIGZpbHRlcmVkUG9pbnRzLnZhbHVlLnNvcnQoKHZhbDEsIHZhbDIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsMS5pZCA8IHZhbDIuaWQgPyAtMSA6IDE7XG4gICAgICAgICAgICB9KTsgICAgICAgICAgICBcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UHJvZHVjdCA9IChwcm9kKSA9PiB7XG4gICAgICAgICAgICBwcm9kdWN0LnZhbHVlID0gey4uLnByb2R9O1xuICAgICAgICAgICAgcHJvZHVjdERpYWxvZy52YWx1ZSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV4cG9ydEV4Y2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgZXhjZWxEaWFsb2cudmFsdWUgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoaWRlRGlhbG9nID0gKCkgPT4ge1xuICAgICAgICAgICAgZXhjZWxEaWFsb2cudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHByb2R1Y3REaWFsb2cudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHN1Ym1pdHRlZC52YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZV9sb2c9IGFzeW5jKGlkKSA9PiB7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9sb2cvZGVsZXRlLycraWQsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7bWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgZW52b2kgZGVsZXRlXCI7fVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnZGVsZXRlIG9rJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciByw6lzZWF1XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hlY2tUZWwgPSAodGVsKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghdGVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gL14oNnwwNnw3fDA3KS87IFxuICAgICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdChTdHJpbmcodGVsKSk7XG4gICAgICAgIH1cblxuLy9ERU1BUlJBR0VcbiAgICAgICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChcImh0dHBzOi8vYWQxMWM2MDAtZWY0YS00ODE1LWEzZGMtYTMyNjgyNzQ1YTE0Lm1lcmN1cmUucm9ja3MvLndlbGwta25vd24vbWVyY3VyZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcInRvcGljXCIsIFwiL2NhcnRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gaGFuZGxlTWVyY3VyZU1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignY2FydGUnLCBoYW5kbGVNZXJjdXJlTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgRXZlbnRTb3VyY2U6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGxhbm5pbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcEVsZW1lbnQgJiYgYXBwRWxlbWVudC5kYXRhc2V0LnVzZXJQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb2tQbGFuJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJQcm9wc0pzb24gPSBhcHBFbGVtZW50LmRhdGFzZXQudXNlclByb3BzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0udmFsdWUgPSBKU09OLnBhcnNlKHVzZXJQcm9wc0pzb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFyYW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZXRhdHMudmFsdWUgPSBwYXJhbS52YWx1ZS5ldGF0cztcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVhZ2VudHMudmFsdWUgPSBwYXJhbS52YWx1ZS5hZ2VudHM7XG4gICAgICAgICAgICAgICAgICAgIGV0YXRzLnZhbHVlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbG9ycy52YWx1ZVtlbGVtZW50LmlkXSA9IGVsZW1lbnQuY291bGV1cjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uSUQudmFsdWUgPSBwYXJhbS52YWx1ZS5vcGVyYXRpb25JRDtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ29wSWQnK3BhcmFtLnZhbHVlLm9wZXJhdGlvbklEKVxuICAgICAgICAgICAgICAgICAgICBmZXRjaFBvaW50c09wZXJhdGlvbihvcGVyYXRpb25JRC52YWx1ZSlcblxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcblxuICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk1lcmN1cmUgRXZlbnRTb3VyY2UgY2xvc2VkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvLyBvbkJlZm9yZVVubW91bnQgZXN0IGFwcGVsw6kganVzdGUgYXZhbnQgcXVlIGxlIGNvbXBvc2FudCBuZSBzb2l0IHJldGlyw6kgZHUgRE9NLlxuICAgICAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuLy88U2VhcmNoIHYtaWY9XCJwYXJhbVwiIDpwYXJhbT1cInBhcmFtXCIvPlxuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG4gICAgICAgIDxkaXYgaWQ9XCJwb2ludHNcIiAgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoMTAwdmggLSAxMDBweCk7XCI+XG4gICAgICAgICAgICA8RGF0YVRhYmxlIFxuICAgICAgICAgICAgOnZhbHVlPVwiZmlsdGVyZWRQb2ludHNcIiBcbiAgICAgICAgICAgIHNjcm9sbGFibGUgXG4gICAgICAgICAgICBzY3JvbGxIZWlnaHQ9XCJmbGV4XCJcbiAgICAgICAgICAgIHBhZ2luYXRvciA6cm93cz1cIjEwMFwiIFxuICAgICAgICAgICAgZGF0YUtleT1cImlkXCIgXG4gICAgICAgICAgICBmaWx0ZXJEaXNwbGF5PVwicm93XCIgXG4gICAgICAgICAgICA6bG9hZGluZz1cImxvYWRpbmdcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktZmlsdGVyLXNsYXNoXCIgbGFiZWw9XCJDbGVhciBGaWx0cmVcIiB2YXJpYW50PVwib3V0bGluZWRcIiBAY2xpY2s9XCJjbGVhckZpbHRlcigpXCIgc3R5bGU9XCJoZWlnaHQ6NDBweDtcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmQgcGItNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b24gaWNvbj1cInBpIHBpLWV4dGVybmFsLWxpbmtcIiBsYWJlbD1cIkV4cG9ydFwiIEBjbGljaz1cImV4cG9ydEV4Y2VsKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNlbXB0eT4gUGFzIGRlIHBvaW50IHRyb3V2w6kuIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNsb2FkaW5nPiBMb2FkaW5nIC4uLiA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJpZFwiIGhlYWRlcj1cIklEXCIgLz5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwibm9tXCIgc3R5bGU9XCJtaW4td2lkdGg6IDEycmVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLmNpdmlsaXRlIH19IHt7IGRhdGEubm9tIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCB2LW1vZGVsPVwic2VhcmNoTm9tXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk5vbVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJudW1lcm9DbGllbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLm51bWVyb0NsaWVudCB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgdi1tb2RlbD1cInNlYXJjaE51bWVyb0NsaWVudFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJOwrAgY2xpZW50XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gXG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVscz1cInRlbFwiIHN0eWxlPVwibWluLXdpZHRoOiAxMnJlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS50ZWwxIH19PGJyPnt7IGRhdGEudGVsMiB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgdi1tb2RlbD1cInNlYXJjaFRlbFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJUZWxcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJudW1lcm9QaHlzaXF1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEubnVtZXJvUGh5c2lxdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IHYtbW9kZWw9XCJzZWFyY2hOdW1lcm9QaHlzaXF1ZVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJOwrAgcGh5c2lxdWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gIGZpZWxkPVwiZXRhdFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5ldGF0ICYmIGRhdGEuZXRhdC5pZFwiIDpzdHlsZT1cInsgXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcycHggOHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjY2NjJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzE2MHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZicsIC8qIENvdWxldXIgZGUgdGV4dGUgYmxhbmNoZSBwb3VyIHVuIG1laWxsZXVyIGNvbnRyYXN0ZSAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBDb2xvcnNbZGF0YS5ldGF0LmlkXSBcbiAgICAgICAgICAgICAgICAgICAgfVwiIEBjbGljaz1cInNlbmRFdGF0KGRhdGEuaWQpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuZXRhdC5ub20gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV0YXQtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaEV0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91c1wiPlRvdXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwiZXRhdCBpbiBldGF0c1wiIDprZXk9XCJldGF0XCIgOnZhbHVlPVwiZXRhdC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBldGF0Lm5vbSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImxpYmVsbGVDb21wdGV1clwiIHN0eWxlPVwibWluLXdpZHRoOiAxMDBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLmxpYmVsbGVDb21wdGV1ciB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImxpYmVsbGUtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaExpYmVsbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3VzXCI+VG91dGVzIGxlcyBsaWJlbGzDqXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJsaWJlbGxlIGluIGxpYmVsbGVzXCIgOmtleT1cImxpYmVsbGVcIiA6dmFsdWU9XCJsaWJlbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGliZWxsZSAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImxhc3RNZXNzYWdlXCIgc3R5bGU9XCJ3aWR0aDogMTUwcHg7XCIgaGVhZGVyPVwiRGVybmllciBNZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEubG9ncG9pbnRzLmxlbmd0aCA+IDBcIj57eyBkYXRhLmxvZ3BvaW50cy5zbGljZSgtMSlbMF0uZGF0ZWNyZWEgfX0ve3sgZGF0YS5sb2dwb2ludHMuc2xpY2UoLTEpWzBdLmNvbW1lbnRhaXJlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiAgICBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIHN0eWxlPVwid2lkdGg6IDEwMHB4ICFpbXBvcnRhbnRcIj5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJzbG90UHJvcHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJzbG90UHJvcHMuZGF0YS5lbWFpbC5sZW5ndGggPiA2ICYmIHR5cGVTZWwgPT0gMVwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm9cIiBAY2xpY2s9XCJzZW5kRW1haWwoc2xvdFByb3BzLmRhdGEuaWQpXCIgc3R5bGU9XCJ3aWR0aDogMjUwcHggIWltcG9ydGFudFwiPnt7IHNsb3RQcm9wcy5kYXRhLmVtYWlsIH19PC9idXR0b24+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cInNsb3RQcm9wcy5kYXRhLnRlbDEgJiYgY2hlY2tUZWwoc2xvdFByb3BzLmRhdGEudGVsMSkgJiYgdHlwZVNlbCA9PSAyXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mb1wiIEBjbGljaz1cInNlbmRTTVMoc2xvdFByb3BzLmRhdGEsc2xvdFByb3BzLmRhdGEudGVsMSlcIiBzdHlsZT1cIndpZHRoOiAxNjBweCAhaW1wb3J0YW50XCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1tb2JpbGVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj4mbmJzcDsmbmJzcDtTTVMge3sgc2xvdFByb3BzLmRhdGEudGVsMSB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJzbG90UHJvcHMuZGF0YS50ZWwyICYmIGNoZWNrVGVsKHNsb3RQcm9wcy5kYXRhLnRlbDIpICYmIHR5cGVTZWwgPT0gMlwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm9cIiBAY2xpY2s9XCJzZW5kU01TKHNsb3RQcm9wcy5kYXRhLHNsb3RQcm9wcy5kYXRhLnRlbDIpXCIgc3R5bGU9XCJ3aWR0aDogMTYwcHggIWltcG9ydGFudFwiPjxzcGFuIGNsYXNzPVwicGkgcGktbW9iaWxlXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj48L3NwYW4+Jm5ic3A7Jm5ic3A7U01TIHt7IHNsb3RQcm9wcy5kYXRhLnRlbDIgfX08L2J1dHRvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cblxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJub21SdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLm51bWVyb1J1ZSB9fSB7eyBkYXRhLnRpdHJlUnVlICB9fSB7eyBkYXRhLm5vbVJ1ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cIm5vbVJ1ZS1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoTm9tUnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91dGVzXCI+VG91dGVzIGxlcyBydWVzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwicnVlIGluIHJ1ZXNcIiA6a2V5PVwicnVlXCIgOnZhbHVlPVwicnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcnVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cInZpbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5jb2RlUG9zdGFsIH19IHt7IGRhdGEudmlsbGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwidmlsbGUtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaFZpbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXRlc1wiPlRvdXRlcyB2aWxsZXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwidmlsbGUgaW4gdmlsbGVzXCIgOmtleT1cInZpbGxlXCIgOnZhbHVlPVwidmlsbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdmlsbGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJhZ2VudFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmFnZW50XCI+e3sgZGF0YS5hZ2VudC5ub20gfX0gPHNwYW4gdi1pZj1cImRhdGEuYWdlbnQucHJlbm9tXCI+e3sgZGF0YS5hZ2VudC5wcmVub20gfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJhZ2VudC1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoQWdlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91c1wiPlRvdXMgYWdlbnRzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cImFnZW50IGluIGFnZW50c1wiIDprZXk9XCJhZ2VudFwiIDp2YWx1ZT1cImFnZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFnZW50IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiZGF0ZVJWXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5jcmVuZWF1XCI+e3sgZGF0YS5jcmVuZWF1LmRhdGUgfX0ge3sgZGF0YS5jcmVuZWF1LmNyZW5lYXVIb3JhaXJlLm5vbSB9fTxicj5BZ2VudCA6IHt7IGRhdGEuY3JlbmVhdS5hZ2VudC5ub20gfX0gPHNwYW4gdi1pZj1cImRhdGEuY3JlbmVhdS5hZ2VudC5wcmVub21cIj57eyBkYXRhLmNyZW5lYXUuYWdlbnQucHJlbm9tIH19PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZGF0ZVJWLWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hEYXRlUlZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91dGVzXCI+UlYgLyBUb3V0ZXMgZGF0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwiZGF0ZVJWIGluIGRhdGVzUlZcIiA6a2V5PVwiZGF0ZVJWXCIgOnZhbHVlPVwiZGF0ZVJWXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGVSViB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgIDxDb2x1bW4gaGVhZGVyPVwiRWRpdFwiIHN0eWxlPVwid2lkdGg6IDUwcHhcIj5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJzbG90UHJvcHNcIj5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGljb249XCJwaSBwaS1wZW5jaWxcIiB2YXJpYW50PVwib3V0bGluZWRcIiByb3VuZGVkIGNsYXNzPVwibXItMlwiIEBjbGljaz1cImVkaXRQcm9kdWN0KHNsb3RQcm9wcy5kYXRhKVwiPkVkaXQ8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgPC9EYXRhVGFibGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxEaWFsb2cgdi1tb2RlbDp2aXNpYmxlPVwicHJvZHVjdERpYWxvZ1wiIDpzdHlsZT1cInsgd2lkdGg6ICc0NTBweCcgfVwiIGhlYWRlcj1cIkTDqXRhaWxzIGR1IHBvaW50XCIgOm1vZGFsPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibnVtZXJvQ2xpZW50XCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPk51bcOpcm8gQ2xpZW50PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cIm51bWVyb0NsaWVudFwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QubnVtZXJvQ2xpZW50XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgYXV0b2ZvY3VzIDppbnZhbGlkPVwic3VibWl0dGVkICYmICFwcm9kdWN0Lm51bWVyb0NsaWVudFwiIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCB2LWlmPVwic3VibWl0dGVkICYmICFwcm9kdWN0Lm51bWVyb0NsaWVudFwiIGNsYXNzPVwidGV4dC1yZWQtNTAwXCI+TnVtw6lybyBDbGllbnQgcmVxdWlzLjwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvbXB0ZXVyQWNjZXNzaWJsZVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5BY2Nlc3NpYmxlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjb21wdGV1ckFjY2Vzc2libGVcIiB2LW1vZGVsPVwicHJvZHVjdC5jb21wdGV1ckFjY2Vzc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIDp2YWx1ZT1cInRydWVcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IGdyZWVuXCI+T3VpPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiA6dmFsdWU9XCJmYWxzZVwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogcmVkXCI+Tm9uPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gXG4gICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJldGF0XCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkNoYW5nZXIgbCfDqXRhdDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3Qgdi1tb2RlbD1cInByb2R1Y3QuZXRhdFwiIDpvcHRpb25zPVwiZXRhdHNcIiBvcHRpb25MYWJlbD1cIm5vbVwiICA6aW5pdGlhbFZhbHVlcz1cInByb2R1Y3QuZXRhdC5pZFwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0aW9ubmVyIHVuIMOpdGF0XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gICAgIFxuICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFnZW50XCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkFnZW50PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdCB2LW1vZGVsPVwicHJvZHVjdC5hZ2VudFwiIDpvcHRpb25zPVwibGlzdGVhZ2VudHNcIiBvcHRpb25MYWJlbD1cIm5vbVwiICA6aW5pdGlhbFZhbHVlcz1cInByb2R1Y3QuYWdlbnQuaWRcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdGlvbm5lciB1biBhZ2VudFwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+IFxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjaXZpbGl0ZVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5DaXZpbGl0w6k8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwiY2l2aWxpdGVcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0LmNpdmlsaXRlXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgYXV0b2ZvY3VzIDppbnZhbGlkPVwic3VibWl0dGVkICYmICFwcm9kdWN0LmNpdmlsaXRlXCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHYtaWY9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QuY2l2aWxpdGVcIiBjbGFzcz1cInRleHQtcmVkLTUwMFwiPkNpdmlsaXTDqSByZXF1aXNlLjwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+Tm9tPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cIm5hbWVcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0Lm5vbVwiIHJlcXVpcmVkPVwidHJ1ZVwiIGF1dG9mb2N1cyA6aW52YWxpZD1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5ub21cIiBmbHVpZCAvPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgdi1pZj1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5ub21cIiBjbGFzcz1cInRleHQtcmVkLTUwMFwiPk5vbSByZXF1aXMuPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGVsMVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5UZWwgMTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJ0ZWwxXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC50ZWwxXCIgcmVxdWlyZWQ9XCJmYWxzZVwiIGF1dG9mb2N1cyBmbHVpZCAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0ZWwyXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPlRlbCAyPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cInRlbDJcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0LnRlbDJcIiByZXF1aXJlZD1cImZhbHNlXCIgYXV0b2ZvY3VzIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkVtYWlsPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cImVtYWlsXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5lbWFpbFwiIHJlcXVpcmVkPVwiZmFsc2VcIiBhdXRvZm9jdXMgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY29tbWVudGFpcmVcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+Q29tbWVudGFpcmU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8VGV4dGFyZWEgaWQ9XCJjb21tZW50YWlyZVwiIHYtbW9kZWw9XCJwcm9kdWN0LmNvbW1lbnRhaXJlXCIgcmVxdWlyZWQ9XCJmYWxzZVwiIHJvd3M9XCIzXCIgY29scz1cIjIwXCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHRlbXBsYXRlICNmb290ZXI+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIkFubnVsZXJcIiBpY29uPVwicGkgcGktdGltZXNcIiB0ZXh0IEBjbGljaz1cImhpZGVEaWFsb2dcIiAvPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJTYXV2ZXJcIiBpY29uPVwicGkgcGktY2hlY2tcIiBAY2xpY2s9XCJzZW5kSW5mb3MocHJvZHVjdC5pZClcIiAvPlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9EaWFsb2c+XG4gICAgICAgIDxEaWFsb2cgdi1tb2RlbDp2aXNpYmxlPVwiZXhjZWxEaWFsb2dcIiA6c3R5bGU9XCJ7IHdpZHRoOiAnNDUwcHgnIH1cIiBoZWFkZXI9XCJFeHBvcnQgRXhjZWxcIiA6bW9kYWw9XCJ0cnVlXCI+XG4gICAgICAgICAgICA8dGVtcGxhdGUgI2Zvb3Rlcj5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiQW5udWxlclwiIGljb249XCJwaSBwaS10aW1lc1wiIHRleHQgQGNsaWNrPVwiaGlkZURpYWxvZ1wiIC8+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIkV4cG9ydGVyIG1hIHPDqWxlY3Rpb25cIiBpY29uPVwicGkgcGktY2hlY2tcIiBAY2xpY2s9XCJzZW5kRXhjZWwoKVwiIC8+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L0RpYWxvZz5cbjwvdGVtcGxhdGU+XG48c3R5bGU+XG46ZGVlcCh0ci5teS1jdXN0b20taGlnaGxpZ2h0KSB7XG4gICAgLypiYWNrZ3JvdW5kOiAjZmNkOWE1ICFpbXBvcnRhbnQ7Ki9cbiAgICAvKmZvbnQtd2VpZ2h0OiBib2xkOyovXG59XG4ucC1kYXRhdGFibGUtdGhlYWQgPiB0ciA+IHRoICB7XG4gICAgcGFkZGluZy10b3A6IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctYm90dG9tOiA0cHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWxlZnQ6IDRweCAhaW1wb3J0YW50O1xufVxuLnAtZGF0YXRhYmxlLWhlYWRlci1jZWxsICAge1xuICAgIHBhZGRpbmctdG9wOiA0cHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWJvdHRvbTogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1sZWZ0OiA0cHggIWltcG9ydGFudDtcbn1cbnNlbGVjdCB7bWF4LXdpZHRoOiAxMjBweDt9XG48L3N0eWxlPiIsIjxzY3JpcHQgc2V0dXA+XG5cbmltcG9ydCB7IGNyZWF0ZUFwcCwgcmVmLCBvbk1vdW50ZWQsIG9uQmVmb3JlVW5tb3VudCwgb25Vbm1vdW50ZWQsIGdldEN1cnJlbnRJbnN0YW5jZSwgY29tcHV0ZWQsIHdhdGNofSAgZnJvbSAndnVlJztcblxuaW1wb3J0IHsgRmlsdGVyTWF0Y2hNb2RlLCBGaWx0ZXJPcGVyYXRvciB9IGZyb20gJ0BwcmltZXZ1ZS9jb3JlL2FwaSc7XG5cbmltcG9ydCB7IGJ1cyB9IGZyb20gJy4uL2J1cy5qcyc7IFxuaW1wb3J0IHsgRnVuY3Rpb25zIH0gZnJvbSAnLi9zZXJ2aWNlL0Z1bmN0aW9ucyc7XG5cbmltcG9ydCB7IFZ1ZURhdGVQaWNrZXIgfSBmcm9tICdAdnVlcGljL3Z1ZS1kYXRlcGlja2VyJztcbmltcG9ydCAnQHZ1ZXBpYy92dWUtZGF0ZXBpY2tlci9kaXN0L21haW4uY3NzJ1xuXG5pbXBvcnQgU2VhcmNoIGZyb20gJy4vU2VhcmNoLnZ1ZSc7XG5cbmltcG9ydCBQcm9ncmVzc0JhciBmcm9tICdwcmltZXZ1ZS9wcm9ncmVzc2Jhcic7XG5pbXBvcnQgRGF0YVRhYmxlIGZyb20gJ3ByaW1ldnVlL2RhdGF0YWJsZSc7XG5pbXBvcnQgQ29sdW1uIGZyb20gJ3ByaW1ldnVlL2NvbHVtbic7XG5pbXBvcnQgQ29sdW1uR3JvdXAgZnJvbSAncHJpbWV2dWUvY29sdW1uZ3JvdXAnOyAgIFxuaW1wb3J0IFJvdyBmcm9tICdwcmltZXZ1ZS9yb3cnOyAgICAgXG5cbmltcG9ydCBUb29sYmFyIGZyb20gJ3ByaW1ldnVlL3Rvb2xiYXInO1xuaW1wb3J0IHsgdXNlVG9hc3QgfSBmcm9tICdwcmltZXZ1ZS91c2V0b2FzdCc7XG5cbmltcG9ydCBJbnB1dFRleHQgZnJvbSAncHJpbWV2dWUvaW5wdXR0ZXh0JztcbmltcG9ydCBTZWxlY3QgZnJvbSAncHJpbWV2dWUvc2VsZWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAncHJpbWV2dWUvYnV0dG9uJztcbmltcG9ydCBUZXh0YXJlYSBmcm9tICdwcmltZXZ1ZS90ZXh0YXJlYSc7XG5cbmltcG9ydCBEaWFsb2cgZnJvbSAncHJpbWV2dWUvZGlhbG9nJztcblxuaW1wb3J0IEljb25GaWVsZCBmcm9tICdwcmltZXZ1ZS9pY29uZmllbGQnO1xuaW1wb3J0IElucHV0SWNvbiBmcm9tICdwcmltZXZ1ZS9pbnB1dGljb24nO1xuXG5cbiAgICAgICAgY29uc3QgZXRhdHMgPSByZWYoKTtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uSUQgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHJlZigpO1xuICAgICAgICBjb25zdCBwYXJhbSA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlU2VsID0gcmVmKCdTw6lsZWN0aW9ubmV6Jyk7XG4gICAgICAgIGNvbnN0IHR5cGVTZWwgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXNfdHlwZXMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXNUeXBlID0gcmVmKFtdKTsgXG4gICAgICAgIGNvbnN0IHBvaW50cyA9IHJlZihbXSk7IC8vIExhIGxpc3RlIHNlcmEgY2hhcmfDqWUgZXQgbWlzZSDDoCBqb3VyIHZpYSBNZXJjdXJlL0FQSVxuICAgICAgICBjb25zdCBsb2NrZWRQb2ludHMgPSByZWYoW10pO1xuICAgICAgICBjb25zdCBtZXNzYWdldXIgPSByZWYoJycpO1xuICAgICAgICBjb25zdCBub21icmUgPSByZWYoKTtcbiAgICAgICAgY29uc3QgdG90YWwgPSByZWYoKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWYoKTtcbiAgICAgICAgY29uc3QgcG91cmNlbnQgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZVNNUz0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VFeGNlbD0gcmVmKCk7XG4gICAgICAgIC8vY29uc3Qgb3B0aW9ucyA9IHJlZihbXSk7XG4gICAgICAgIGxldCBzZWxlY3Rpb24gPSAwO1xuICAgICAgICBsZXQgc2VsID0gMDtcbiAgICAgICAgbGV0IHNlYXJjaCA9IDA7XG4gICAgICAgIGNvbnN0IG1hVmFsZXVyID0gcmVmKDApXG4gICAgICAgIGNvbnN0IHNob3dXaXRoUlYgPSByZWYodHJ1ZSk7XG4gICAgICAgIGxldCBzZWxlY3RlZCA9ICcnO1xuICAgICAgICBjb25zdCBtb2lzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHJlZigpO1xuICAgICAgICBjb25zdCBkYXRlID0gcmVmKG5ldyBEYXRlKCkpO1xuICAgICAgICBjb25zdCBjbHVzdGVySUQgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbG9hZGluZyA9cmVmKCk7XG4gICAgICAgIGxvYWRpbmcudmFsdWUgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaE5vbSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWxlY3RlZFN0YXR1cyA9IHJlZignVG91cycpO1xuICAgICAgICBjb25zdCBzZWFyY2hOdW1lcm9QaHlzaXF1ZSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hOdW1lcm9DbGllbnQgPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoTm9tUnVlID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaERhdGVSViA9IHJlZignVG91dGVzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hRdWFydGllciA9IHJlZignVG91cycpO1xuICAgICAgICBjb25zdCBzZWFyY2hWaWxsZSA9IHJlZignVG91dGVzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hFdGF0ID0gcmVmKCdUb3VzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hUZWwgPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoQ2x1c3RlcjEgPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoQ2x1c3RlcjIgPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoQ2x1c3RlcjMgPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoQ2x1c3RlcjQgPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoQ2x1c3RlcjUgPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoTGliZWxsZSA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2xvdFByb3BzID0gcmVmKCk7IFxuXG4gICAgICAgIGNvbnN0IGNsaWNrZWRSb3dJZCA9IHJlZihudWxsKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWJsZVBvaW50cyA9IHJlZihbXSk7IFxuICAgICAgICBjb25zdCBDb2xvcnMgPSByZWYoW10pOyBcblxuICAgICAgICBjb25zdCBleHBhbmRlZFJvd3NUYWIgPSByZWYoW10pO1xuICAgICAgICBjb25zdCB0b2FzdCA9IHVzZVRvYXN0KCk7XG4gICAgICAgIGNvbnN0IHByb2R1Y3REaWFsb2cgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBleGNlbERpYWxvZyA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IHByb2R1Y3QgPSByZWYoe30pO1xuICAgICAgICBjb25zdCBzdWJtaXR0ZWQgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlZigwKTtcbiAgICAgICAgY29uc3QgZGF0YUNyZW5lYXUgPSB7fTtcbiAgICAgICAgY29uc3QgZGF0ZUV4Y2VsID0ge307XG4gICAgICAgIGNvbnN0IGRhdGFDYXJ0ZSA9IHt9O1xuICAgICAgICBjb25zdCBmb3JtYXQgPSAoZGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpKzE7XG4gICAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICByZXR1cm4gYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3RzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1ldGFLZXkgPSByZWYodHJ1ZSk7XG5cbi8vQ0VOVFJBTEUgREUgQ09NTVVOSUNBVElPTlxuXG4gICAgICAgIGZ1bmN0aW9uIGZldGNoUG9pbnRzIChjbHVzdGVyX2lkKXsgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLy8geW91ciBvcHRpb25zLi4uIG1ldGhvZDogUE9TVCwgaGVhZGVycywgY29ycywgZXRjLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRlLnZhbHVlPScnXG4gICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy9jbHVzdGVyLycrY2x1c3Rlcl9pZCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhdGEuc3RhdHVzJytkYXRhLnN0YXR1cykgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkaXJlY3Rpb24gZm9yY8OpZSB2ZXJzIGxhIHBhZ2UgZGUgbG9naW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjaGFyZ2VtZW50IHBvaW50cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZSA9IGRhdGEucmVzcG9uc2UubWFwKHAgPT4gKHsgLi4ucCwgaXNFZGl0aW5nOiBmYWxzZSwgb3JpZ2luYWw6IHt9LCBzZWxlY3RlZDogZmFsc2UgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RJdGVtID0gcG9pbnRzLnZhbHVlLmZpbmQoeD0+eCE9PXVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlYXJjaCA+IDApe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IHNlYXJjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5maXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRQb2ludChwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ1VuZSBlcnJldXIgc1xcJ2VzdCBwcm9kdWl0ZSBvdSB2b3VzIMOqdGVzIGTDqWNvbm5lY3TDqScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkgLy8gZG8gc29tZXRoaW5nIHVzZWZ1bCB3aXRoIGVycm9yXG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gZmV0Y2hQb2ludHNPcGVyYXRpb24ob3BlcmF0aW9uX2lkKXsgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLy8geW91ciBvcHRpb25zLi4uIG1ldGhvZDogUE9TVCwgaGVhZGVycywgY29ycywgZXRjLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY2hhcmdlbWVudCBkZXMgcG9pbnRzJylcbiAgICAgICAgICAgICAgICBkYXRlLnZhbHVlPScnXG4gICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy9leGNsdXNpb24vJytvcGVyYXRpb25faWQsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZGF0YSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkYXRhLnN0YXR1cycrZGF0YS5zdGF0dXMpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZGlyZWN0aW9uIGZvcmPDqWUgdmVycyBsYSBwYWdlIGRlIGxvZ2luXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY2hhcmdlbWVudCBwb2ludHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhLnJlc3BvbnNlLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZSA9IGRhdGEucmVzcG9uc2UubWFwKHAgPT4gKHsgLi4ucCwgaXNFZGl0aW5nOiBmYWxzZSwgb3JpZ2luYWw6IHt9LCBzZWxlY3RlZDogZmFsc2UgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RJdGVtID0gcG9pbnRzLnZhbHVlLmZpbmQoeD0+eCE9PXVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZWFyY2ggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBzZWFyY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0UG9pbnQocG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KCdVbmUgZXJyZXVyIHNcXCdlc3QgcHJvZHVpdGUgb3Ugdm91cyDDqnRlcyBkw6ljb25uZWN0w6knKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pIC8vIGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCBlcnJvclxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGdldEluZm9zID0gYXN5bmMoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYXBwZWwgZ2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9pbnRzL2dldFYyLycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRwb2ludHM6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleDIgPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gZWxlbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRJbmRleDIgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXgyXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZHUgcHJvZHVpdDpcIiwgYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdFcnJldXIgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGRlIGxhIGZpY2hlIDogJythd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIHLDqXNlYXUgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZU1lcmN1cmVNZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTsgXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTWVyY3VyZSBtZXNzYWdlIHJlY2VpdmVkIDpgLCBkYXRhKTtcbiAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50LmFjdGlvbjtcbiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaF9jcmVuZWF1ID0gMDtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAvL21pc2Ugw6Agam91ciBkZXMgY2x1c3RlcnMgY29tcGxldFxuICAgICAgICAgICAgICAgICAgICBjYXNlICdjbHVzdGVyX2NvbXBsZXRlZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnY2x1c3RlcnNjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBlbGVtZW50LCAvLyBQYXNzIHlvdXIgZGF0YSBpbiB0aGUgJ2RldGFpbCcgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGVhZmxldG1hcCcpLmNvbnRlbnRXaW5kb3cuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwcm9kdWN0X3VwZGF0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmZvcyhlbGVtZW50LnBvaW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfY3JlbmVhdSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NyZW5lYXVfdXBkYXRlZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY3JlbmVhdV91cGRhdGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfY3JlbmVhdSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFVwZGF0ZShlbGVtZW50LmRvbm5lZXMubm9tYnJlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHJlZnJlc2hfY3JlbmVhdSA9PSAxKXtcbiAgICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS11cGRhdGVkJywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbi8vIElOVEVSRkFDRVxuXG4gICAgICAgIGNvbnN0IHZpbGxlcyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsQ2l0aWVzV2l0aER1cGxpY2F0ZXMgPSBwb2ludHMudmFsdWUubWFwKHBvaW50ID0+IHBvaW50LnZpbGxlKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUNpdHlTZXQgPSBuZXcgU2V0KGFsbENpdGllc1dpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZUNpdHlTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcXVhcnRpZXJzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxRdWFydGllcnNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnQucXVhcnRpZXIpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlUXVhcnRpZXJTZXQgPSBuZXcgU2V0KGFsbFF1YXJ0aWVyc1dpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZVF1YXJ0aWVyU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJ1ZXMgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbFJ1ZXNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnQubm9tUnVlKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVJ1ZVNldCA9IG5ldyBTZXQoYWxsUnVlc1dpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZVJ1ZVNldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBsaWJlbGxlcyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsTGliZWxsZXNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnQubGliZWxsZUNvbXB0ZXVyKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUxpYmVsbGVzU2V0ID0gbmV3IFNldChhbGxMaWJlbGxlc1dpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZUxpYmVsbGVzU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRhdGVzUlYgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbERhdGVzUlZXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnRfUlYocG9pbnQpKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZWFsbERhdGVzUlZTZXQgPSBuZXcgU2V0KGFsbERhdGVzUlZXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVhbGxEYXRlc1JWU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIHBvaW50X1JWKHBvaW50KXtcbiAgICAgICAgICBpZihwb2ludC5jcmVuZWF1KXsgXG4gICAgICAgICAgICAgaWYocG9pbnQuY3JlbmVhdS5kYXRlKXtyZXR1cm4gcG9pbnQuY3JlbmVhdS5kYXRlO31lbHNle3JldHVybiAnU2FucyBSVic7fVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNle3JldHVybiAnU2FucyBSVic7fVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvcHJpw6l0w6kgY2FsY3Vsw6llIHF1aSByZW52ZXJyYSBsYSBsaXN0ZSBmaWx0csOpZSDDoCBsYSBEYXRhVGFibGVcbiAgICAgICAgY29uc3QgZmlsdGVyZWRQb2ludHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZmlsdGVyIGV0YXBlJyk7XG4gICAgICAgICAgICAvLyBTaSBvbiBuJ2EgcGFzIGVuY29yZSBkZSBkb25uw6llcywgb24gcmVudm9pZSB1biB0YWJsZWF1IHZpZGVcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbiBjb21tZW5jZSBhdmVjIHVuZSBjb3BpZSBkZSB0b3V0ZXMgbGVzIGRvbm7DqWVzXG4gICAgICAgICAgICBsZXQgcG9pbnRzVG9GaWx0ZXIgPSBbLi4ucG9pbnRzLnZhbHVlXTtcblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBub21cbiAgICAgICAgICAgIGlmIChzZWFyY2hOb20udmFsdWUgJiYgc2VhcmNoTm9tLnZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOb20udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgLy8gQWpvdXRleiBpY2kgdG91IGxlcyBjaGFtcHMgZGFucyBsZXNxdWVscyB2b3VzIHZvdWxleiBjaGVyY2hlclxuICAgICAgICAgICAgICAgICAgICBwb2ludC5ub20udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlckNhc2VTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBOdW1lcm9QaHlzaXF1ZVxuICAgICAgICAgICAgaWYgKHNlYXJjaE51bWVyb1BoeXNpcXVlLnZhbHVlICYmIHNlYXJjaE51bWVyb1BoeXNpcXVlLnZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICAvLyBBam91dGV6IGljaSB0b3VzIGxlcyBjaGFtcHMgZGFucyBsZXNxdWVscyB2b3VzIHZvdWxleiBjaGVyY2hlclxuICAgICAgICAgICAgICAgICAgICBwb2ludC5udW1lcm9QaHlzaXF1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyQ2FzZVNlYXJjaClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaWx0cmUgcGFyIE51bWVyb0NsaWVudFxuICAgICAgICAgICAgaWYgKHNlYXJjaE51bWVyb0NsaWVudC52YWx1ZSAmJiBzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyQ2FzZVNlYXJjaCA9IHNlYXJjaE51bWVyb0NsaWVudC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICAvLyBBam91dGV6IGljaSB0b3VzIGxlcyBjaGFtcHMgZGFucyBsZXNxdWVscyB2b3VzIHZvdWxleiBjaGVyY2hlclxuICAgICAgICAgICAgICAgICAgICBwb2ludC5udW1lcm9DbGllbnQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlckNhc2VTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBOb21SdWVcbiAgICAgICAgICAgIGlmIChzZWFyY2hOb21SdWUudmFsdWUgJiYgc2VhcmNoTm9tUnVlLnZhbHVlLnRyaW0oKSAhPT0gJ1RvdXRlcycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOb21SdWUudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgLy8gQWpvdXRleiBpY2kgdG91cyBsZXMgY2hhbXBzIGRhbnMgbGVzcXVlbHMgdm91cyB2b3VsZXogY2hlcmNoZXJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubm9tUnVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBWaWxsZVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygndmlsbGUnK3NlYXJjaFZpbGxlLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaFZpbGxlLnZhbHVlICYmIHNlYXJjaFZpbGxlLnZhbHVlICE9PSAnVG91dGVzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC52aWxsZSA9PT0gc2VhcmNoVmlsbGUudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgVGVsXG4gICAgICAgICAgICBpZiAoc2VhcmNoVGVsLnZhbHVlICYmIHNlYXJjaFRlbC52YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQudGVsMS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlbC52YWx1ZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgUXVhcnRpZXJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3F1YXJ0aWVyJytzZWFyY2hRdWFydGllci52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hRdWFydGllci52YWx1ZSAmJiBzZWFyY2hRdWFydGllci52YWx1ZSAhPT0gJ1RvdXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnF1YXJ0aWVyID09PSBzZWFyY2hRdWFydGllci52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBMaWJlbGxlXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWFydGllcicrc2VhcmNoUXVhcnRpZXIudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoTGliZWxsZS52YWx1ZSAmJiBzZWFyY2hMaWJlbGxlLnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubGliZWxsZUNvbXB0ZXVyID09PSBzZWFyY2hMaWJlbGxlLnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIERhdGVSVlxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncXVhcnRpZXInK3NlYXJjaFF1YXJ0aWVyLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaERhdGVSVi52YWx1ZSAmJiBzZWFyY2hEYXRlUlYudmFsdWUgIT09ICdUb3V0ZXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9wb2ludF9SVihwb2ludCwgc2VhcmNoRGF0ZVJWLnZhbHVlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBjb25kaXRpb25fcG9pbnRfUlYocG9pbnQsIGRhdGVSVil7XG4gICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUpeyBcbiAgICAgICAgICAgICAgICAgaWYocG9pbnQuY3JlbmVhdS5kYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUgPT0gZGF0ZVJWKXtyZXR1cm4gdHJ1ZTt9XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGVSViA9PSAnU2FucyBSVicpe3JldHVybiB0cnVlO31cbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgaWYoZGF0ZVJWID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIEV0YXRcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2V0YXQnK3NlYXJjaEV0YXQudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoRXRhdC52YWx1ZSAmJiBzZWFyY2hFdGF0LnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQuZXRhdC5pZCA9PT0gc2VhcmNoRXRhdC52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgRGF0ZVJWXG4gICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uX3NlbGVjdGVkKHBvaW50KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmdW5jdGlvbiBjb25kaXRpb25fc2VsZWN0ZWQocG9pbnQpe1xuICAgICAgICAgICAgICAgICBpZihwb2ludC5mcm96ZW4pe1xuICAgICAgICAgICAgICAgICAgICAgIGlmKHBvaW50LmZyb3plbiA9PSB0cnVlKXtyZXR1cm4gZmFsc2U7fVxuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb3VudC52YWx1ZSA9IHBvaW50c1RvRmlsdGVyLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBwb2ludHNUb0ZpbHRlcjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2xlYXJGaWx0ZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBzZWFyY2hOb20udmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaEV0YXQudmFsdWUgPSAnVG91cyc7XG4gICAgICAgICAgICBzZWFyY2hRdWFydGllci52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaExpYmVsbGUudmFsdWUgPSAnVG91cyc7XG4gICAgICAgICAgICBzZWFyY2hUZWwudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaFZpbGxlLnZhbHVlID0gJ1RvdXRlcyc7XG4gICAgICAgICAgICBzZWFyY2hOb21SdWUudmFsdWUgPSAnVG91dGVzJztcbiAgICAgICAgICAgIHNlYXJjaE51bWVyb0NsaWVudC52YWx1ZSAgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaE51bWVyb1BoeXNpcXVlLnZhbHVlICA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoRGF0ZVJWLnZhbHVlID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICAvL29uIHJlY29pdCB1biBtZXNzYWdlIGRlIGxlYWZsZXRcbiAgICAgICAgY29uc3QgdXBkYXRlQ2x1c3RlciA9IChjbHVzdGVyU2VhcmNoKSA9PiB7XG4gICAgICAgICAgICBjbGVhckZpbHRlcigpO1xuICAgICAgICAgICAgZXZhbCgnc2VhcmNoQ2x1c3RlcicrY2x1c3RlclNlYXJjaC50eXBlKycudmFsdWUgPSAnK2NsdXN0ZXJTZWFyY2gudmFsdWUpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2NsaWMgcmVjaWV2ZWQnICsgY2x1c3RlclNlYXJjaC50eXBlICsnaWQnKyArIGNsdXN0ZXJTZWFyY2gudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9vbiByw6lpbml0YWxpc2UgbCdhZmZpY2hhZ2UsIG9uIGzDqHZlIGxlIGxvY2tcbiAgICAgICAgY29uc3QgZ2xvYmFsRXh0ZXJuYWxDYWxsID0gKGNsdXN0ZXJfaWQsIHNlbCkgPT4ge1xuICAgICAgICAgICAgLy9zZW5kTG9jayhudWxsLCAyKTtcbiAgICAgICAgICAgIHNlYXJjaCA9IHNlbDtcbiAgICAgICAgICAgIGZldGNoUG9pbnRzKGNsdXN0ZXJfaWQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGVkaXRQb2ludCA9IChpZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHMudmFsdWUuZmluZChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgIGlmIChwb2ludCkge1xuICAgICAgICAgICAgICAgIHBvaW50Lm9yaWdpbmFsID0geyAuLi5wb2ludCB9O1xuICAgICAgICAgICAgICAgIHBvaW50LmlzRWRpdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncG9pbnRDJytwb2ludC5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKHBvaW50LmNyZW5lYXUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQuY3JlbmVhdSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBwb2ludC5jcmVuZWF1LmlkID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vc2VuZExvY2socG9pbnQsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNhbmNlbEVkaXQgPSAoaWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKHBvaW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdID0geyAuLi5wb2ludHMudmFsdWVbcG9pbnRJbmRleF0ub3JpZ2luYWwsIGlzRWRpdGluZzogZmFsc2UsIG9yaWdpbmFsOiB7fSB9O1xuICAgICAgICAgICAgICAgIC8vc2VuZExvY2socG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzZW5kSW5mb3MgPSBhc3luYyhpZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3BvaW50cy91cGRhdGVWMi8nK2lkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcHJvZHVjdC52YWx1ZS5jb21tZW50YWlyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlOiBwcm9kdWN0LnZhbHVlLmNvbXB0ZXVyQWNjZXNzaWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXZpbGl0ZTogcHJvZHVjdC52YWx1ZS5jaXZpbGl0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub206IHByb2R1Y3QudmFsdWUubm9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyb0NsaWVudDogcHJvZHVjdC52YWx1ZS5udW1lcm9DbGllbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsMTogcHJvZHVjdC52YWx1ZS50ZWwxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbDI6IHByb2R1Y3QudmFsdWUudGVsMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbDogcHJvZHVjdC52YWx1ZS5lbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGF0OiBwcm9kdWN0LnZhbHVlLmV0YXQuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnTW9kaWZpY2F0aW9uIGVudm95w6llIMOgIFN5bWZvbnkuIEF0dGVudGUgZGUgbGEgbWlzZSDDoCBqb3VyIE1lcmN1cmUuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdGaWNoZSBtaXNlIMOgIGpvdXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0luZm8nLCBkZXRhaWw6IG1lc3NhZ2V1ci52YWx1ZSwgbGlmZTogMzAwMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QuaXNFZGl0aW5nID0gZmFsc2U7IC8vIFNvcnRpciBkdSBtb2RlIMOpZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XSA9IHByb2R1Y3QudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoXCJFcnJldXIgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGR1IHByb2R1aXQ6XCIsIGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkZSBsYSBmaWNoZSA6ICcrYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0luZm8nLCBkZXRhaWw6IG1lc3NhZ2V1ci52YWx1ZSwgbGlmZTogMzAwMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciByw6lzZWF1IGxvcnMgZGUgbGEgc2F1dmVnYXJkZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VuZEV0YXQgPSBhc3luYyhpZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3BvaW50cy91cGRhdGVWMi8nK2lkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhdDogOVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdNb2RpZmljYXRpb24gZW52b3nDqWUgw6AgU3ltZm9ueS4gQXR0ZW50ZSBkZSBsYSBtaXNlIMOgIGpvdXIgTWVyY3VyZS4uLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0ZpY2hlIG1pc2Ugw6Agam91cic7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9kdWN0LmlzRWRpdGluZyA9IGZhbHNlOyAvLyBTb3J0aXIgZHUgbW9kZSDDqWRpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdID0gcHJvZHVjdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVEaWFsb2coKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZHUgcHJvZHVpdDpcIiwgYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdFcnJldXIgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGRlIGxhIGZpY2hlIDogJythd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ1VuZSBlcnJldXIgc1xcJ2VzdCBwcm9kdWl0ZSBvdSB2b3VzIMOqdGVzIGTDqWNvbm5lY3TDqScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHNlbmRFeGNlbCgpe1xuICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgbGV0IGNoYWluZSA9ICcnO1xuICAgICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjaGFpbmUgPSBjaGFpbmUgKyBlbGVtZW50LmlkICsgJywnO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGZpbHRlcmVkUG9pbnRzLnZhbHVlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjaGFpbmUgPSBjaGFpbmUgKyBlbGVtZW50LmlkICsgJywnO1xuXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY2hhaW5lLnNsaWNlKDAsIC0xKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2goJy9leGNlbC9leHBvcnQvJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbmU6IGNoYWluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW9uX2lkOiBwcm9wcy5wYXJhbS5taXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KS50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmJsb2IoKSkudGhlbihkYXRhID0+IHdpbmRvdy5vcGVuKFVSTC5jcmVhdGVPYmplY3RVUkwoZGF0YSkpKVxuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KCdVbmUgZXJyZXVyIHNcXCdlc3QgcHJvZHVpdGUgb3Ugdm91cyDDqnRlcyBkw6ljb25uZWN0w6knKTtcbiAgICAgICAgICAgICB9ICAgXG4gICAgICAgICAgICAvL3dpbmRvdy5vcGVuKCcvYWRtaW4vZXhjZWwvZXhwb3J0Lz8nK2NoYWluZSwgJ19ibGFuaycpLmZvY3VzKCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGZ1bmN0aW9uIHNlbGVjdGVkUG9pbnRzKCkge1xuICAgICAgICAgIHJldHVybiBwb2ludHMudmFsdWUuZmlsdGVyKHBvaW50ID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cocG9pbnQuc2VsZWN0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuIChwb2ludC5zZWxlY3RlZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gc2VhcmNoRGF0ZUNyZW5lYXUoaWQpIHtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5wb2ludCA9IGlkO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LmRpc3RhbmNlID0gJ3Jlc2V0JztcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5kYXRlID0gZm9ybWF0RGF0ZShkYXRlLnZhbHVlKTtcbiAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NyZW5lYXUtdG9VcGRhdGUnLCBkYXRhQ3JlbmVhdSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGVUb0Zvcm1hdCl7XG4gICAgICAgICAgaWYgKCFkYXRlVG9Gb3JtYXQpIHJldHVybiAnJztcbiAgICAgICAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZVRvRm9ybWF0LmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlVG9Gb3JtYXQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7IC8vIExlcyBtb2lzIHNvbnQgaW5kZXjDqXMgw6AgcGFydGlyIGRlIDBcbiAgICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZVRvRm9ybWF0LmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZW5kU01TID0gYXN5bmMocG9pbnQsIHRlbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKHRlbC5sZW5ndGggPT0gNyl7dGVsID0gJzAnICsgdGVsO31cbiAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlWzBdLnRleHRlID0gbWVzc2FnZS52YWx1ZVswXS50ZXh0ZS5yZXBsYWNlKFwiTk9NXCIsIHBvaW50LmNpdmlsaXRlKycgJytwb2ludC5ub20pO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWVbMF0udGV4dGUgPSBtZXNzYWdlLnZhbHVlWzBdLnRleHRlLnJlcGxhY2UoXCJBRFJFU1NFXCIsIHBvaW50Lm51bWVyb1J1ZSsnICcrIHBvaW50LnRpdHJlUnVlKycgJytwb2ludC5ub21SdWUrJyAnK3BvaW50LmNvZGVQb3N0YWwrJyAnK3BvaW50LnZpbGxlKTtcbiAgICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1KXtcbiAgICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUpe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlWzBdLnRleHRlID0gbWVzc2FnZS52YWx1ZVswXS50ZXh0ZS5yZXBsYWNlKFwiREFURVwiLCBwb2ludC5jcmVuZWF1LmRhdGUrJyAnKyBwb2ludC5jcmVuZWF1LmNyZW5lYXVIb3JhaXJlLm5vbSArJyBBZ2VudCA6ICcrcG9pbnQuY3JlbmVhdS5hZ2VudC5ub20pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGVuY29kZWRUZXh0ID0gZW5jb2RlVVJJQ29tcG9uZW50KG1lc3NhZ2UudmFsdWVbMF0udGV4dGUpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFzdHVjZSBwb3VyIGNvbXBhdGliaWxpdMOpIGlPUyB2cyBBbmRyb2lkXG4gICAgICAgICAgICAgICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHZhciBpc2lPUyA9IC9pcGhvbmV8aXBhZHxpcG9kLy50ZXN0KHVhKTtcbiAgICAgICAgICAgICAgICB2YXIgc2VwYXJhdG9yID0gaXNpT1MgPyAnJicgOiAnPyc7XG5cbiAgICAgICAgICAgICAgICB3aW5kb3cub3Blbignc21zOicgKyB0ZWwgKyBzZXBhcmF0b3IgKyAnYm9keT0nICsgZW5jb2RlZFRleHQsICdfYmxhbmsnKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIC8qKi9cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3Ntcy8nK3BvaW50LmlkKycvJyttZXNzYWdlLnZhbHVlWzBdLmlkKycvc2VuZCcsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAvLyBtZXNzYWdldXI9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRFbWFpbCA9IGFzeW5jKGlkKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFpbC8nK2lkKycvJyttZXNzYWdlLnZhbHVlWzBdLmlkKycvbWFpbHNlbmQnLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge21lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIGVudm9pIG1haWxcIjt9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IGRhdGEuZGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciByw6lzZWF1XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2F0Y2gobWVzc2FnZVNlbCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS52YWx1ZSA9IG1lc3NhZ2VzLnZhbHVlLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQuaWQgPT09IG1lc3NhZ2VTZWwudmFsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHR5cGVTZWwudmFsdWUgPSBtZXNzYWdlLnZhbHVlWzBdLnR5cGU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygndHlwZVNlbC52YWx1ZScrdHlwZVNlbC52YWx1ZSlcbiAgICAgICAgfSk7XG5cbi8vbGVzIHBvaW50cyBzw6lsZWN0aW9ubsOpc1xuXG4vL0VWRU5UIElOVEVSRkFDRSAgXG4gICAgICAgIGNvbnN0IExvY2sgPSAoZXZlbnQpID0+IHsgICAgICBcbiAgICAgICAgICAgIGxldCBwb2ludEluZGV4ID0gLTE7ICAgICAgXG4gICAgICAgICAgICBsb2NrZWRQb2ludHMudmFsdWUgPSBbXTtcbiAgICAgICAgICAgIHBvaW50SW5kZXggPSBmaWx0ZXJlZFBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBldmVudC5kYXRhLmlkKTtcbiAgICAgICAgICAgIGlmKHBvaW50SW5kZXggIT0gLTEpe1xuICAgICAgICAgICAgICAgIC8vbG9ja2VkUG9pbnRzLnZhbHVlID0gW2xvY2tlZFBvaW50cy52YWx1ZS5maWx0ZXIocCA9PiBwLmlkICE9PSBldmVudC5kYXRhLmlkKV07ICBcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5mcm96ZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZyb3plblBvaW50cy52YWx1ZS5wdXNoKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwb2ludEluZGV4ID0gZnJvemVuUG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGV2ZW50LmRhdGEuaWQpO1xuICAgICAgICAgICAgLy9leHBhbmRlZFJvd3NUYWIudmFsdWUgPSBbXTtcbiAgICAgICAgICAgIC8vZXhwYW5kZWRSb3dzVGFiLnZhbHVlLnB1c2goZnJvemVuUG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdKTtcbiAgICAgICAgICAgIFxuXG4gICAgICAgICAgICBmaWx0ZXJlZFBvaW50cy52YWx1ZS5zb3J0KCh2YWwxLCB2YWwyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbDEuaWQgPCB2YWwyLmlkID8gLTEgOiAxO1xuICAgICAgICAgICAgfSk7ICAgICAgICAgICAgXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZWRpdFByb2R1Y3QgPSAocHJvZCkgPT4ge1xuICAgICAgICAgICAgcHJvZHVjdC52YWx1ZSA9IHsuLi5wcm9kfTtcbiAgICAgICAgICAgIHByb2R1Y3REaWFsb2cudmFsdWUgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBleHBvcnRFeGNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgIGV4Y2VsRGlhbG9nLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGlkZURpYWxvZyA9ICgpID0+IHtcbiAgICAgICAgICAgIGV4Y2VsRGlhbG9nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICBwcm9kdWN0RGlhbG9nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICBzdWJtaXR0ZWQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkZWxldGVfbG9nPSBhc3luYyhpZCkgPT4ge1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvbG9nL2RlbGV0ZS8nK2lkLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge21lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIGVudm9pIGRlbGV0ZVwiO31cbiAgICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ2RlbGV0ZSBvaydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIHLDqXNlYXVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJldXIgcsOpc2VhdVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoZWNrVGVsID0gKHRlbCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRlbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBjb25zdCByZWdleCA9IC9eKDZ8MDZ8N3wwNykvOyBcbiAgICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QoU3RyaW5nKHRlbCkpO1xuICAgICAgICB9XG5cbi8vREVNQVJSQUdFXG4gICAgICAgIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoXCJodHRwczovL2FkMTFjNjAwLWVmNGEtNDgxNS1hM2RjLWEzMjY4Mjc0NWExNC5tZXJjdXJlLnJvY2tzLy53ZWxsLWtub3duL21lcmN1cmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJ0b3BpY1wiLCBcIi9jYXJ0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGhhbmRsZU1lcmN1cmVNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NhcnRlJywgaGFuZGxlTWVyY3VyZU1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIEV2ZW50U291cmNlOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHBFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4Y2x1c2lvbicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwRWxlbWVudCAmJiBhcHBFbGVtZW50LmRhdGFzZXQudXNlclByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdva1BsYW4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlclByb3BzSnNvbiA9IGFwcEVsZW1lbnQuZGF0YXNldC51c2VyUHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS52YWx1ZSA9IEpTT04ucGFyc2UodXNlclByb3BzSnNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwYXJhbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25JRC52YWx1ZSA9IHBhcmFtLnZhbHVlLm9wZXJhdGlvbklEO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb3BJZCcrcGFyYW0udmFsdWUub3BlcmF0aW9uSUQpXG4gICAgICAgICAgICAgICAgICAgIGZldGNoUG9pbnRzT3BlcmF0aW9uKG9wZXJhdGlvbklELnZhbHVlKVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBldmVudFNvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgb25Vbm1vdW50ZWQoKCkgPT4ge1xuXG4gICAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTWVyY3VyZSBFdmVudFNvdXJjZSBjbG9zZWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8vIG9uQmVmb3JlVW5tb3VudCBlc3QgYXBwZWzDqSBqdXN0ZSBhdmFudCBxdWUgbGUgY29tcG9zYW50IG5lIHNvaXQgcmV0aXLDqSBkdSBET00uXG4gICAgICAgIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4vLzxTZWFyY2ggdi1pZj1cInBhcmFtXCIgOnBhcmFtPVwicGFyYW1cIi8+XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbiAgICAgICAgPGRpdiBpZD1cInBvaW50c1wiICBzdHlsZT1cImhlaWdodDogY2FsYygxMDB2aCAtIDEwMHB4KTtcIj5cbiAgICAgICAgICAgIDxEYXRhVGFibGUgXG4gICAgICAgICAgICA6dmFsdWU9XCJmaWx0ZXJlZFBvaW50c1wiIFxuICAgICAgICAgICAgc2Nyb2xsYWJsZSBcbiAgICAgICAgICAgIHNjcm9sbEhlaWdodD1cImZsZXhcIlxuICAgICAgICAgICAgcGFnaW5hdG9yIDpyb3dzPVwiMTAwXCIgXG4gICAgICAgICAgICBkYXRhS2V5PVwiaWRcIiBcbiAgICAgICAgICAgIGZpbHRlckRpc3BsYXk9XCJyb3dcIiBcbiAgICAgICAgICAgIDpsb2FkaW5nPVwibG9hZGluZ1wiXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1maWx0ZXItc2xhc2hcIiBsYWJlbD1cIkNsZWFyIEZpbHRyZVwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIEBjbGljaz1cImNsZWFyRmlsdGVyKClcIiBzdHlsZT1cImhlaWdodDo0MHB4O1wiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2VtcHR5PiBQYXMgZGUgcG9pbnQgdHJvdXbDqS4gPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2xvYWRpbmc+IExvYWRpbmcgLi4uIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImlkXCIgaGVhZGVyPVwiSURcIiAvPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbHM9XCJub21cIiBzdHlsZT1cIm1pbi13aWR0aDogMTJyZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuY2l2aWxpdGUgfX0ge3sgZGF0YS5ub20gfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IHYtbW9kZWw9XCJzZWFyY2hOb21cIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiTm9tXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm51bWVyb0NsaWVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEubnVtZXJvQ2xpZW50IH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCB2LW1vZGVsPVwic2VhcmNoTnVtZXJvQ2xpZW50XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk7CsCBjbGllbnRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwidGVsXCIgc3R5bGU9XCJtaW4td2lkdGg6IDEycmVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLnRlbDEgfX08YnI+e3sgZGF0YS50ZWwyIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCB2LW1vZGVsPVwic2VhcmNoVGVsXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlRlbFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm51bWVyb1BoeXNpcXVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5udW1lcm9QaHlzaXF1ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgdi1tb2RlbD1cInNlYXJjaE51bWVyb1BoeXNpcXVlXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk7CsCBwaHlzaXF1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiAgZmllbGQ9XCJldGF0XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmV0YXQgJiYgZGF0YS5ldGF0LmlkXCIgOnN0eWxlPVwieyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzJweCA4cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkICNjY2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTYwcHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZmZmJywgLyogQ291bGV1ciBkZSB0ZXh0ZSBibGFuY2hlIHBvdXIgdW4gbWVpbGxldXIgY29udHJhc3RlICovXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRhdGEuZXRhdC5jb3VsZXVyIFxuICAgICAgICAgICAgICAgICAgICB9XCIgQGNsaWNrPVwic2VuZEV0YXQoZGF0YS5pZClcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5ldGF0Lm5vbSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZXRhdC1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoRXRhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3VzXCI+VG91czwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJldGF0IGluIGV0YXRzXCIgOmtleT1cImV0YXRcIiA6dmFsdWU9XCJldGF0LmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGV0YXQubm9tIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibGFzdE1lc3NhZ2VcIiBzdHlsZT1cIndpZHRoOiAyMDBweCAhaW1wb3J0YW50O1wiIGhlYWRlcj1cIkRlcm5pZXIgTWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwibG9nIGluIGRhdGEubG9ncG9pbnRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbG9nLmRhdGVjcmVhIH19LzxzdHJvbmc+e3sgbG9nLmFjdGlvbi5ub20gfX08L3N0cm9uZz4ve3sgbG9nLmNvbW1lbnRhaXJlIH19PGJyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiAgICBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibm9tUnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5udW1lcm9SdWUgfX0ge3sgZGF0YS50aXRyZVJ1ZSAgfX0ge3sgZGF0YS5ub21SdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJub21SdWUtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaE5vbVJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXRlc1wiPlRvdXRlcyBsZXMgcnVlczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cInJ1ZSBpbiBydWVzXCIgOmtleT1cInJ1ZVwiIDp2YWx1ZT1cInJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJ1ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJ2aWxsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuY29kZVBvc3RhbCB9fSB7eyBkYXRhLnZpbGxlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInZpbGxlLWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hWaWxsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3V0ZXNcIj5Ub3V0ZXMgdmlsbGVzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cInZpbGxlIGluIHZpbGxlc1wiIDprZXk9XCJ2aWxsZVwiIDp2YWx1ZT1cInZpbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHZpbGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiZGF0ZVJWXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5jcmVuZWF1XCI+e3sgZGF0YS5jcmVuZWF1LmRhdGUgfX0ge3sgZGF0YS5jcmVuZWF1LmNyZW5lYXVIb3JhaXJlLm5vbSB9fTxicj5BZ2VudCA6IHt7IGRhdGEuY3JlbmVhdS5hZ2VudC5ub20gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImRhdGVSVi1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoRGF0ZVJWXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXRlc1wiPlJWIC8gVG91dGVzIGRhdGVzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cImRhdGVSViBpbiBkYXRlc1JWXCIgOmtleT1cImRhdGVSVlwiIDp2YWx1ZT1cImRhdGVSVlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRlUlYgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgICA8Q29sdW1uIGhlYWRlcj1cIkVkaXRcIiBzdHlsZT1cIndpZHRoOiA1MHB4XCI+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwic2xvdFByb3BzXCI+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBpY29uPVwicGkgcGktcGVuY2lsXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgcm91bmRlZCBjbGFzcz1cIm1yLTJcIiBAY2xpY2s9XCJlZGl0UHJvZHVjdChzbG90UHJvcHMuZGF0YSlcIj5FZGl0PC9CdXR0b24+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgIDwvRGF0YVRhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8RGlhbG9nIHYtbW9kZWw6dmlzaWJsZT1cInByb2R1Y3REaWFsb2dcIiA6c3R5bGU9XCJ7IHdpZHRoOiAnNDUwcHgnIH1cIiBoZWFkZXI9XCJEw6l0YWlscyBkdSBwb2ludFwiIDptb2RhbD1cInRydWVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC02XCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm51bWVyb0NsaWVudFwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5OdW3DqXJvIENsaWVudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJudW1lcm9DbGllbnRcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0Lm51bWVyb0NsaWVudFwiIHJlcXVpcmVkPVwidHJ1ZVwiIGF1dG9mb2N1cyA6aW52YWxpZD1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5udW1lcm9DbGllbnRcIiBmbHVpZCAvPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgdi1pZj1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5udW1lcm9DbGllbnRcIiBjbGFzcz1cInRleHQtcmVkLTUwMFwiPk51bcOpcm8gQ2xpZW50IHJlcXVpcy48L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb21wdGV1ckFjY2Vzc2libGVcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+QWNjZXNzaWJsZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiY29tcHRldXJBY2Nlc3NpYmxlXCIgdi1tb2RlbD1cInByb2R1Y3QuY29tcHRldXJBY2Nlc3NpYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiA6dmFsdWU9XCJ0cnVlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiBncmVlblwiPk91aTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gOnZhbHVlPVwiZmFsc2VcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHJlZFwiPk5vbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+IFxuICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXRhdFwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5DaGFuZ2VyIGwnw6l0YXQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0IHYtbW9kZWw9XCJwcm9kdWN0LmV0YXRcIiA6b3B0aW9ucz1cImV0YXRzXCIgb3B0aW9uTGFiZWw9XCJub21cIiAgOmluaXRpYWxWYWx1ZXM9XCJwcm9kdWN0LmV0YXQuaWRcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdGlvbm5lciB1biDDqXRhdFwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNpdmlsaXRlXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkNpdmlsaXTDqTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJjaXZpbGl0ZVwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QuY2l2aWxpdGVcIiByZXF1aXJlZD1cInRydWVcIiBhdXRvZm9jdXMgOmludmFsaWQ9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QuY2l2aWxpdGVcIiBmbHVpZCAvPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgdi1pZj1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5jaXZpbGl0ZVwiIGNsYXNzPVwidGV4dC1yZWQtNTAwXCI+Q2l2aWxpdMOpIHJlcXVpc2UuPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5Ob208L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwibmFtZVwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3Qubm9tXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgYXV0b2ZvY3VzIDppbnZhbGlkPVwic3VibWl0dGVkICYmICFwcm9kdWN0Lm5vbVwiIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCB2LWlmPVwic3VibWl0dGVkICYmICFwcm9kdWN0Lm5vbVwiIGNsYXNzPVwidGV4dC1yZWQtNTAwXCI+Tm9tIHJlcXVpcy48L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0ZWwxXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPlRlbCAxPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cInRlbDFcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0LnRlbDFcIiByZXF1aXJlZD1cImZhbHNlXCIgYXV0b2ZvY3VzIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRlbDJcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+VGVsIDI8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwidGVsMlwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QudGVsMlwiIHJlcXVpcmVkPVwiZmFsc2VcIiBhdXRvZm9jdXMgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZW1haWxcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+RW1haWw8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwiZW1haWxcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0LmVtYWlsXCIgcmVxdWlyZWQ9XCJmYWxzZVwiIGF1dG9mb2N1cyBmbHVpZCAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb21tZW50YWlyZVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5Db21tZW50YWlyZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxUZXh0YXJlYSBpZD1cImNvbW1lbnRhaXJlXCIgdi1tb2RlbD1cInByb2R1Y3QuY29tbWVudGFpcmVcIiByZXF1aXJlZD1cImZhbHNlXCIgcm93cz1cIjNcIiBjb2xzPVwiMjBcIiBmbHVpZCAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8dGVtcGxhdGUgI2Zvb3Rlcj5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiQW5udWxlclwiIGljb249XCJwaSBwaS10aW1lc1wiIHRleHQgQGNsaWNrPVwiaGlkZURpYWxvZ1wiIC8+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIlNhdXZlclwiIGljb249XCJwaSBwaS1jaGVja1wiIEBjbGljaz1cInNlbmRJbmZvcyhwcm9kdWN0LmlkKVwiIC8+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L0RpYWxvZz5cbiAgICAgICAgPERpYWxvZyB2LW1vZGVsOnZpc2libGU9XCJleGNlbERpYWxvZ1wiIDpzdHlsZT1cInsgd2lkdGg6ICc0NTBweCcgfVwiIGhlYWRlcj1cIkV4cG9ydCBFeGNlbFwiIDptb2RhbD1cInRydWVcIj5cbiAgICAgICAgICAgIDxwPlVuIGV4cG9ydCBjb21wbGV0IGVzdCBnw6luw6lyw6kgY2hhcXVlIG51aXQuIFZvdXMgcG91dmV6IGNyw6llciB1biByYXBwb3J0IHBhcnRpZWwgbGltaXTDqSDDoCA1MDAgbGlnbmVzIMOgIHBhcnRpciBkZSB2b3MgY3JpdMOocmVzLjwvcD5cbiAgICAgICAgICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJBbm51bGVyXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgdGV4dCBAY2xpY2s9XCJoaWRlRGlhbG9nXCIgLz5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiRXhwb3J0ZXJcIiBpY29uPVwicGkgcGktY2hlY2tcIiBAY2xpY2s9XCJzZW5kRXhjZWwoKVwiIC8+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L0RpYWxvZz5cbjwvdGVtcGxhdGU+XG48c3R5bGU+XG46ZGVlcCh0ci5teS1jdXN0b20taGlnaGxpZ2h0KSB7XG4gICAgLypiYWNrZ3JvdW5kOiAjZmNkOWE1ICFpbXBvcnRhbnQ7Ki9cbiAgICAvKmZvbnQtd2VpZ2h0OiBib2xkOyovXG59XG4ucC1kYXRhdGFibGUtdGhlYWQgPiB0ciA+IHRoICB7XG4gICAgcGFkZGluZy10b3A6IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctYm90dG9tOiA0cHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWxlZnQ6IDRweCAhaW1wb3J0YW50O1xufVxuLnAtZGF0YXRhYmxlLWhlYWRlci1jZWxsICAge1xuICAgIHBhZGRpbmctdG9wOiA0cHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWJvdHRvbTogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1sZWZ0OiA0cHggIWltcG9ydGFudDtcbn1cbnNlbGVjdCB7bWF4LXdpZHRoOiAxMjBweDt9XG48L3N0eWxlPiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==*/