/*!*************************************************************************************************************************************!*\
  !*** 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/InterfaceTelephone.vue?vue&type=style&index=0&id=2eff0b82&lang=css ***!
  \**********************************************************************************************************************************************************************************************************************************************************************/

.p-toast {background-color: #dddddc !important; color: #504bfd;}

/*!**********************************************************************************************************************************************************************************************************************************************************************!*\
  !*** 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmNzcyIsIm1hcHBpbmdzIjoiOzs7QUFBQSw2REFBNkQsWUFBWSxDOzs7O0FDQXpFO0lBQ0ksdUJBQXVCO0FBQzNCOzs7Ozs7QUNxR0EsVUFBVSxvQ0FBb0MsRUFBRSxjQUFjLENBQUM7Ozs7OztBQzRCL0Q7RUFDRSxnQkFBZ0I7RUFDaEIsY0FBYztFQUNkLHVCQUF1QjtBQUN6QjtBQUNBLCtCQUFjLGVBQWUsRUFBRSxxQkFBcUIsQ0FBQztBQUNyRDtFQUNFLFlBQVk7RUFDWixZQUFZO0FBQ2Q7QUFDQTtFQUNFLGdCQUFnQjtFQUNoQixrQkFBa0I7RUFDbEIsZUFBZTtBQUNqQjs7Ozs7O0FDZzFDQTtJQUNJLGtDQUFrQztJQUNsQyxxQkFBcUI7QUFDekI7QUFDQTtJQUNJLDJCQUEyQjtJQUMzQiw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtBQUNoQztBQUNBO0lBQ0ksMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5Qiw2QkFBNkI7SUFDN0IsNEJBQTRCO0FBQ2hDO0FBQ0E7RUFDRSx5Q0FBeUM7RUFDekMsaUJBQWlCO0VBQ2pCLHNCQUFzQjtBQUN4QjtBQUNBLHNCQUFzQix1QkFBdUIsQ0FBQyxxQkFBcUIsQ0FBQztBQUNwRSxZQUFZLHNCQUFzQixDQUFDLFlBQVksQ0FBQztBQUNoRCxXQUFXLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQztBQUVwRTtJQUNJLGFBQWE7QUFDakI7QUFDQSwwQ0FBMEMsZ0NBQWdDLENBQUM7QUFFM0UsbUJBQW1CLHNCQUFzQixFQUFFLHdCQUF3QixDQUFDO0FBRXBFLFFBQVEsZ0JBQWdCLENBQUM7QUFDekIsUUFBUTtBQUNSLFNBQVMsdUJBQXVCLEVBQUUsY0FBYyxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUFDO0FBQ2xHLFVBQVUsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUFDO0FBQ3hJLFlBQVksaUJBQWlCLEVBQUUsc0JBQXNCLENBQUM7Ozs7OztBQzdyQ3RELG9CQUFvQixhQUFhLENBQUMsc0JBQXNCLENBQUM7QUFDekQsUUFBUSw4QkFBOEIsQ0FBQywyQkFBMkIsQ0FBQztBQUNuRSxhQUFhLHdCQUF3QixDQUFDLDhCQUE4QixDQUFDO0FBQ3JFLGdCQUFnQixZQUFZLENBQUM7QUFDN0IsWUFBWSwyQkFBMkIsQ0FBQztBQUN4QyxxQkFBcUIsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQztBQUU3RDtFQUNFLGNBQWM7RUFDZCxnQkFBZ0IsRUFBRSx5Q0FBeUM7RUFDM0Qsc0JBQXNCO0FBQ3hCO0FBRUE7RUFDRSx5QkFBeUIsRUFBRSw2QkFBNkI7RUFDeEQsaUJBQWlCO0VBQ2pCLFdBQVc7QUFDYjtBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLGdCQUFnQjtBQUNsQjs7QUFFQSw0QkFBNEI7QUFDNUI7RUFDRSwyQkFBMkI7RUFDM0IsTUFBTTtFQUNOLDhCQUE4QjtFQUM5QixXQUFXO0VBQ1gsMENBQTBDO0FBQzVDOztBQUVBLHdDQUF3QztBQUN4QztFQUNFLGdCQUFnQjtFQUNoQixPQUFPO0VBQ1AsZ0JBQWdCO0VBQ2hCLFdBQVc7RUFDWCw0QkFBNEI7QUFDOUI7O0FBRUEsZ0VBQWdFO0FBQ2hFO0VBQ0UsV0FBVztFQUNYLG1CQUFtQjtBQUNyQjtBQUVBO0VBQ0UseUJBQXlCO0FBQzNCO0FBRUE7RUFDRSwwQkFBMEI7RUFDMUIsaUJBQWlCO0VBQ2pCLFdBQVc7RUFDWCxlQUFlO0FBQ2pCO0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsV0FBVztBQUNiO0FBQ0EscUNBQXFDO0FBQ3JDO0VBQ0Usa0JBQWtCLEVBQUUsK0JBQStCO0VBQ25ELHdCQUF3QjtBQUMxQjtBQUVBO0VBQ0UsV0FBVyxFQUFFLDhEQUE4RDtBQUM3RTtBQUNBLDJCQUEyQjtBQUMzQjtFQUNFLGtCQUFrQixFQUFFLCtCQUErQjtFQUNuRCx3QkFBd0I7QUFDMUI7QUFFQTtFQUNFLFdBQVcsRUFBRSw4REFBOEQ7QUFDN0U7O0FBRUEsK0JBQStCO0FBQy9CO0VBQ0UsbUJBQW1CO0VBQ25CLHlCQUF5QjtFQUN6QixrQkFBa0I7RUFDbEIsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixxQ0FBcUM7RUFDckMsZ0JBQWdCO0FBQ2xCO0FBRUE7RUFDRSxhQUFhO0VBQ2IsOEJBQThCO0VBQzlCLG1CQUFtQjtFQUNuQixrQkFBa0I7RUFDbEIsOEJBQThCO0VBQzlCLG1CQUFtQjtBQUNyQjtBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGtCQUFrQjtFQUNsQixjQUFjO0FBQ2hCO0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsY0FBYztBQUNoQjtBQUVBO0VBQ0UsYUFBYTtFQUNiLHNCQUFzQixFQUFFLHFDQUFxQztFQUM3RCxRQUFRO0VBQ1Isa0JBQWtCO0FBQ3BCO0FBRUE7RUFDRSxhQUFhO0VBQ2IsbUJBQW1CO0VBQ25CLFFBQVE7RUFDUixlQUFlO0FBQ2pCO0FBRUE7RUFDRSxpQkFBaUI7QUFDbkI7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixjQUFjO0FBQ2hCO0FBRUE7QUFDQSxrQkFBa0I7RUFDaEIsYUFBYTtBQUNmO0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsY0FBYztBQUNoQjs7QUFFQSwyQkFBMkI7QUFDM0I7RUFDRSxrQkFBa0I7RUFDbEIsYUFBYTtFQUNiLDhCQUE4QjtFQUM5QixZQUFZO0FBQ2Q7QUFFQTtFQUNFLGVBQWU7RUFDZixZQUFZO0FBQ2Q7QUFFQTtFQUNFLFVBQVU7QUFDWjtBQUVBO0VBQ0UsYUFBYTtFQUNiLDBCQUEwQjtFQUMxQix3QkFBd0IsRUFBRSxtQ0FBbUM7RUFDN0QsVUFBVTtFQUNWLHVCQUF1QjtFQUN2QixZQUFZO0VBQ1osbUJBQW1CLEVBQUUsd0JBQXdCO0VBQzdDLFlBQVk7RUFDWix3QkFBd0I7RUFDeEIsa0JBQWtCO0VBQ2xCLCtDQUErQztFQUMvQyxjQUFjO0VBQ2Qsb0JBQW9CLEVBQUUsZ0NBQWdDO0VBQ3RELGlCQUFpQjtFQUNqQixnQkFBZ0I7RUFDaEIsZ0JBQWdCO0VBQ2hCLHNCQUFzQjtBQUN4QjtBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGtCQUFrQjtFQUNsQixjQUFjO0FBQ2hCO0FBRUE7RUFDRSxTQUFTO0VBQ1QsNkJBQTZCO0VBQzdCLGFBQWE7QUFDZjtBQUVBO0VBQ0UsY0FBYyxFQUFFLCtCQUErQjtBQUNqRDs7QUFFQSxzQ0FBc0M7QUFDdEM7RUFDRSxXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLFNBQVM7RUFDVCxXQUFXO0VBQ1gsaUJBQWlCO0VBQ2pCLG1CQUFtQjtFQUNuQix5REFBeUQ7QUFDM0Q7QUFDQSxRQUFRLGVBQWUsRUFBRSxpQ0FBaUMsQ0FBQyxpQ0FBaUMsQ0FBQyxpQkFBaUIsQ0FBQztBQUMvRztFQUNFLFdBQVc7QUFDYjtBQUNBLGtCQUFrQixvQ0FBb0MsQ0FBQztBQUN2RCxlQUFlLDBCQUEwQixFQUFFLHFCQUFxQixDQUFDLFlBQVksQ0FBQzs7Ozs7O0FDbGE5RTtFQUNFLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2QsdUJBQXVCO0FBQ3pCO0FBQ0EsK0JBQWMscUJBQXFCLENBQUM7QUFDcEMsd0NBQXVCLFlBQVksQ0FBQztBQUNwQztFQUNFLGFBQWE7RUFDYixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLFNBQVM7QUFDWDtBQUNBO0VBQ0UsaUJBQWlCO0VBQ2pCLFdBQVc7QUFDYjtBQUNBO0VBQ0UsWUFBWTtFQUNaLFlBQVk7QUFDZDtBQUNBO0VBQ0UsZUFBZTtBQUNqQjs7Ozs7O0FDbTJCQTtJQUNJLGtDQUFrQztJQUNsQyxxQkFBcUI7QUFDekI7QUFDQTtJQUNJLDJCQUEyQjtJQUMzQiw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtBQUNoQztBQUNBO0lBQ0ksMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5Qiw2QkFBNkI7SUFDN0IsNEJBQTRCO0FBQ2hDO0FBQ0EsUUFBUSxnQkFBZ0IsQ0FBQzs7Ozs7O0FDMXJCekI7RUFDRSxrQkFBa0I7RUFDbEIsU0FBUztFQUNULGdCQUFnQjtFQUNoQixnQkFBZ0I7RUFDaEIsVUFBVTtFQUNWLFNBQVM7RUFDVCxzQkFBc0I7RUFDdEIsaUJBQWlCO0VBQ2pCLGdCQUFnQjtFQUNoQixXQUFXO0VBQ1gsV0FBVztBQUNiO0FBQ0E7RUFDRSxZQUFZO0VBQ1osZUFBZTtFQUNmLGFBQWE7QUFDZjtBQUNBO0VBQ0UsZ0JBQWdCO0FBQ2xCO0FBQ0E7RUFDRSxnQkFBZ0I7RUFDaEIsV0FBVztBQUNiO0FBQ0EseUJBQXlCLDJCQUEyQixDQUFDLHVCQUF1Qjs7Ozs7OztBQ2twQjVFO0lBQ0ksa0NBQWtDO0lBQ2xDLHFCQUFxQjtBQUN6QjtBQUNBO0lBQ0ksMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5Qiw2QkFBNkI7SUFDN0IsNEJBQTRCO0FBQ2hDO0FBQ0E7SUFDSSwyQkFBMkI7SUFDM0IsOEJBQThCO0lBQzlCLDZCQUE2QjtJQUM3Qiw0QkFBNEI7QUFDaEM7QUFDQTtFQUNFLHlDQUF5QztFQUN6QyxpQkFBaUI7RUFDakIsc0JBQXNCO0FBQ3hCO0FBQ0EsYUFBYSxXQUFXLENBQUM7QUFDekIsc0JBQXNCLHVCQUF1QixDQUFDLHFCQUFxQixDQUFDO0FBRXBFLFlBQVksc0JBQXNCLENBQUMsWUFBWSxDQUFDO0FBQ2hELFdBQVcsWUFBWSxFQUFFLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDO0FBRXBFO0lBQ0ksYUFBYTtBQUNqQjtBQUNBLGNBQWMsVUFBVSxFQUFFLGFBQWEsRUFBRSxzQkFBc0IsQ0FBQztBQUNoRSxTQUFTLHVCQUF1QixFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQztBQUNsRyxVQUFVLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQztBQUN4SSxPQUFPLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQztBQUM5QyxZQUFZLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDOzs7Ozs7O0FDMXRCdEQsb0JBQW9CLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztBQUN6RCxRQUFRLDhCQUE4QixDQUFDLDJCQUEyQixDQUFDO0FBQ25FLGFBQWEsd0JBQXdCLENBQUMsOEJBQThCLENBQUM7QUFDckUsZ0JBQWdCLFlBQVksQ0FBQztBQUM3QixZQUFZLDJCQUEyQixDQUFDO0FBQ3hDLHFCQUFxQixrQkFBa0IsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDO0FBRTdEO0VBQ0UsY0FBYztFQUNkLGdCQUFnQixFQUFFLHlDQUF5QztFQUMzRCxzQkFBc0I7RUFDdEIsV0FBVztBQUNiO0FBRUE7RUFDRSx5QkFBeUIsRUFBRSw2QkFBNkI7RUFDeEQsaUJBQWlCO0VBQ2pCLFdBQVc7QUFDYjtBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLGdCQUFnQjtBQUNsQjs7QUFFQSw0QkFBNEI7QUFDNUI7RUFDRSwyQkFBMkI7RUFDM0IsTUFBTTtFQUNOLDhCQUE4QjtFQUM5QixXQUFXO0VBQ1gsMENBQTBDO0FBQzVDOztBQUVBLHdDQUF3QztBQUN4QztFQUNFLGdCQUFnQjtFQUNoQixPQUFPO0VBQ1AsZ0JBQWdCO0VBQ2hCLFdBQVc7RUFDWCw0QkFBNEI7QUFDOUI7O0FBRUEsZ0VBQWdFO0FBQ2hFO0VBQ0UsV0FBVztFQUNYLG1CQUFtQjtBQUNyQjtBQUVBO0VBQ0UseUJBQXlCO0FBQzNCO0FBRUE7RUFDRSwwQkFBMEI7RUFDMUIsaUJBQWlCO0VBQ2pCLFdBQVc7RUFDWCxlQUFlO0FBQ2pCO0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsV0FBVztBQUNiO0FBQ0EscUNBQXFDO0FBQ3JDO0VBQ0Usa0JBQWtCLEVBQUUsK0JBQStCO0VBQ25ELHdCQUF3QjtBQUMxQjtBQUVBO0VBQ0UsV0FBVyxFQUFFLDhEQUE4RDtBQUM3RTtBQUNBLDJCQUEyQjtBQUMzQjtFQUNFLGtCQUFrQixFQUFFLCtCQUErQjtFQUNuRCx3QkFBd0I7QUFDMUI7QUFFQTtFQUNFLFdBQVcsRUFBRSw4REFBOEQ7QUFDN0U7O0FBRUEsK0JBQStCO0FBQy9CO0VBQ0UsbUJBQW1CO0VBQ25CLHlCQUF5QjtFQUN6QixrQkFBa0I7RUFDbEIsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixxQ0FBcUM7RUFDckMsZ0JBQWdCO0VBQ2hCLFlBQVk7QUFDZDtBQUVBO0VBQ0UsYUFBYTtFQUNiLDhCQUE4QjtFQUM5QixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLDhCQUE4QjtFQUM5QixtQkFBbUI7QUFDckI7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixrQkFBa0I7RUFDbEIsY0FBYztBQUNoQjtBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQixZQUFZO0VBQ1osa0JBQWtCO0VBQ2xCLGNBQWM7QUFDaEI7QUFFQTtFQUNFLGFBQWE7RUFDYixzQkFBc0IsRUFBRSxxQ0FBcUM7RUFDN0QsUUFBUTtFQUNSLGtCQUFrQjtBQUNwQjtBQUVBO0VBQ0UsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQixRQUFRO0VBQ1IsZUFBZTtBQUNqQjtBQUVBO0VBQ0UsaUJBQWlCO0FBQ25CO0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsY0FBYztBQUNoQjtBQUVBO0VBQ0UsYUFBYTtFQUNiLDhCQUE4QjtFQUM5QixtQkFBbUI7QUFDckI7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixjQUFjO0FBQ2hCOztBQUVBLDJCQUEyQjtBQUMzQjtFQUNFLGtCQUFrQjtFQUNsQixZQUFZO0FBQ2Q7QUFFQTtFQUNFLGVBQWU7RUFDZixZQUFZO0FBQ2Q7QUFFQTtFQUNFLFVBQVU7QUFDWjtBQUVBO0VBQ0UsYUFBYTtFQUNiLDBCQUEwQjtFQUMxQix3QkFBd0IsRUFBRSxtQ0FBbUM7RUFDN0QsVUFBVTtFQUNWLHVCQUF1QjtFQUN2QixZQUFZO0VBQ1osbUJBQW1CLEVBQUUsd0JBQXdCO0VBQzdDLFlBQVk7RUFDWix3QkFBd0I7RUFDeEIsa0JBQWtCO0VBQ2xCLCtDQUErQztFQUMvQyxjQUFjO0VBQ2Qsb0JBQW9CLEVBQUUsZ0NBQWdDO0VBQ3RELGlCQUFpQjtFQUNqQixnQkFBZ0I7RUFDaEIsZ0JBQWdCO0VBQ2hCLHNCQUFzQjtBQUN4QjtBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGtCQUFrQjtFQUNsQixjQUFjO0FBQ2hCO0FBRUE7RUFDRSxTQUFTO0VBQ1QsNkJBQTZCO0VBQzdCLGFBQWE7QUFDZjtBQUVBO0VBQ0UsY0FBYyxFQUFFLCtCQUErQjtBQUNqRDs7QUFFQSxzQ0FBc0M7QUFDdEM7RUFDRSxXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLFNBQVM7RUFDVCxXQUFXO0VBQ1gsaUJBQWlCO0VBQ2pCLG1CQUFtQjtFQUNuQix5REFBeUQ7QUFDM0Q7QUFDQSxRQUFRLGVBQWUsRUFBRSxpQ0FBaUMsQ0FBQyxpQ0FBaUMsQ0FBQyxpQkFBaUIsQ0FBQztBQUMvRztFQUNFLFdBQVc7QUFDYjtBQUNBLGtCQUFrQixvQ0FBb0MsQ0FBQztBQUV2RCxlQUFlLDBCQUEwQixFQUFFLHFCQUFxQixDQUFDLFlBQVksQ0FBQzs7Ozs7O0FDKzdCOUU7SUFDSSxrQ0FBa0M7SUFDbEMscUJBQXFCO0FBQ3pCO0FBQ0E7SUFDSSwyQkFBMkI7SUFDM0IsOEJBQThCO0lBQzlCLDZCQUE2QjtJQUM3Qiw0QkFBNEI7QUFDaEM7QUFDQTtJQUNJLDJCQUEyQjtJQUMzQiw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtBQUNoQztBQUNBO0VBQ0UseUNBQXlDO0VBQ3pDLGlCQUFpQjtFQUNqQixzQkFBc0I7QUFDeEI7QUFDQSxzQkFBc0IsdUJBQXVCLENBQUMscUJBQXFCLENBQUM7QUFDcEUsWUFBWSxzQkFBc0IsQ0FBQyxZQUFZLENBQUM7QUFDaEQsV0FBVyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMseUJBQXlCLENBQUM7QUFFcEU7SUFDSSxhQUFhO0FBQ2pCO0FBQ0EsMENBQTBDLGdDQUFnQyxDQUFDO0FBRTNFLG1CQUFtQixzQkFBc0IsRUFBRSx3QkFBd0IsQ0FBQztBQUVwRSxRQUFRLGdCQUFnQixDQUFDO0FBQ3pCLFFBQVE7QUFDUixTQUFTLHVCQUF1QixFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQztBQUNsRyxVQUFVLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQztBQUN4SSxTQUFTLHVCQUF1QixFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQztBQUNsRyxZQUFZLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDO0FBQ3RELHVEQUF1RCwyQkFBMkIsQ0FBQzs7Ozs7O0FDanRDbkYsb0JBQW9CLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztBQUN6RCxRQUFRLDhCQUE4QixDQUFDLDJCQUEyQixDQUFDO0FBQ25FLGFBQWEsd0JBQXdCLENBQUMsOEJBQThCLENBQUM7QUFDckUsZ0JBQWdCLFlBQVksQ0FBQztBQUM3QixZQUFZLDJCQUEyQixDQUFDO0FBQ3hDLHFCQUFxQixrQkFBa0IsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDO0FBRTdEO0VBQ0UsY0FBYztFQUNkLGdCQUFnQixFQUFFLHlDQUF5QztFQUMzRCxzQkFBc0I7QUFDeEI7QUFFQTtFQUNFLHlCQUF5QixFQUFFLDZCQUE2QjtFQUN4RCxpQkFBaUI7RUFDakIsV0FBVztBQUNiO0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsZ0JBQWdCO0FBQ2xCOztBQUVBLDRCQUE0QjtBQUM1QjtFQUNFLDJCQUEyQjtFQUMzQixNQUFNO0VBQ04sOEJBQThCO0VBQzlCLFdBQVc7RUFDWCwwQ0FBMEM7QUFDNUM7O0FBRUEsd0NBQXdDO0FBQ3hDO0VBQ0UsZ0JBQWdCO0VBQ2hCLE9BQU87RUFDUCxnQkFBZ0I7RUFDaEIsV0FBVztFQUNYLDRCQUE0QjtBQUM5Qjs7QUFFQSxnRUFBZ0U7QUFDaEU7RUFDRSxXQUFXO0VBQ1gsbUJBQW1CO0FBQ3JCO0FBRUE7RUFDRSx5QkFBeUI7QUFDM0I7QUFFQTtFQUNFLDBCQUEwQjtFQUMxQixpQkFBaUI7RUFDakIsV0FBVztFQUNYLGVBQWU7QUFDakI7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixXQUFXO0FBQ2I7QUFDQSxxQ0FBcUM7QUFDckM7RUFDRSxrQkFBa0IsRUFBRSwrQkFBK0I7RUFDbkQsd0JBQXdCO0FBQzFCO0FBRUE7RUFDRSxXQUFXLEVBQUUsOERBQThEO0FBQzdFO0FBQ0EsMkJBQTJCO0FBQzNCO0VBQ0Usa0JBQWtCLEVBQUUsK0JBQStCO0VBQ25ELHdCQUF3QjtBQUMxQjtBQUVBO0VBQ0UsV0FBVyxFQUFFLDhEQUE4RDtBQUM3RTs7QUFFQSwrQkFBK0I7QUFDL0I7RUFDRSxtQkFBbUI7RUFDbkIseUJBQXlCO0VBQ3pCLGtCQUFrQjtFQUNsQixZQUFZO0VBQ1osa0JBQWtCO0VBQ2xCLHFDQUFxQztFQUNyQyxnQkFBZ0I7RUFDaEIsWUFBWTtBQUNkO0FBRUE7RUFDRSxhQUFhO0VBQ2IsOEJBQThCO0VBQzlCLG1CQUFtQjtFQUNuQixrQkFBa0I7RUFDbEIsOEJBQThCO0VBQzlCLG1CQUFtQjtBQUNyQjtBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGtCQUFrQjtFQUNsQixjQUFjO0FBQ2hCO0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsY0FBYztBQUNoQjtBQUVBO0VBQ0UsYUFBYTtFQUNiLHNCQUFzQixFQUFFLHFDQUFxQztFQUM3RCxRQUFRO0VBQ1Isa0JBQWtCO0FBQ3BCO0FBRUE7RUFDRSxhQUFhO0VBQ2IsbUJBQW1CO0VBQ25CLFFBQVE7RUFDUixlQUFlO0FBQ2pCO0FBRUE7RUFDRSxpQkFBaUI7QUFDbkI7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixjQUFjO0FBQ2hCO0FBRUE7RUFDRSxhQUFhO0VBQ2IsOEJBQThCO0VBQzlCLG1CQUFtQjtBQUNyQjtBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGNBQWM7QUFDaEI7O0FBRUEsMkJBQTJCO0FBQzNCO0VBQ0Usa0JBQWtCO0VBQ2xCLFlBQVk7QUFDZDtBQUVBO0VBQ0UsZUFBZTtFQUNmLFlBQVk7QUFDZDtBQUVBO0VBQ0UsVUFBVTtBQUNaO0FBRUE7RUFDRSxhQUFhO0VBQ2IsMEJBQTBCO0VBQzFCLHdCQUF3QixFQUFFLG1DQUFtQztFQUM3RCxVQUFVO0VBQ1YsdUJBQXVCO0VBQ3ZCLFlBQVk7RUFDWixtQkFBbUIsRUFBRSx3QkFBd0I7RUFDN0MsWUFBWTtFQUNaLHdCQUF3QjtFQUN4QixrQkFBa0I7RUFDbEIsK0NBQStDO0VBQy9DLGNBQWM7RUFDZCxvQkFBb0IsRUFBRSxnQ0FBZ0M7RUFDdEQsaUJBQWlCO0VBQ2pCLGdCQUFnQjtFQUNoQixnQkFBZ0I7RUFDaEIsc0JBQXNCO0FBQ3hCO0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsa0JBQWtCO0VBQ2xCLGNBQWM7QUFDaEI7QUFFQTtFQUNFLFNBQVM7RUFDVCw2QkFBNkI7RUFDN0IsYUFBYTtBQUNmO0FBRUE7RUFDRSxjQUFjLEVBQUUsK0JBQStCO0FBQ2pEOztBQUVBLHNDQUFzQztBQUN0QztFQUNFLFdBQVc7RUFDWCxrQkFBa0I7RUFDbEIsU0FBUztFQUNULFdBQVc7RUFDWCxpQkFBaUI7RUFDakIsbUJBQW1CO0VBQ25CLHlEQUF5RDtBQUMzRDtBQUNBLFFBQVEsZUFBZSxFQUFFLGlDQUFpQyxDQUFDLGlDQUFpQyxDQUFDLGlCQUFpQixDQUFDO0FBQy9HO0VBQ0UsV0FBVztBQUNiO0FBQ0Esa0JBQWtCLG9DQUFvQyxDQUFDO0FBRXZELGVBQWUsMEJBQTBCLEVBQUUscUJBQXFCLENBQUMsWUFBWSxDQUFDOzs7Ozs7QUNrZjlFO0lBQ0ksa0NBQWtDO0lBQ2xDLHFCQUFxQjtBQUN6QjtBQUNBO0lBQ0ksMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5Qiw2QkFBNkI7SUFDN0IsNEJBQTRCO0FBQ2hDO0FBQ0E7SUFDSSwyQkFBMkI7SUFDM0IsOEJBQThCO0lBQzlCLDZCQUE2QjtJQUM3Qiw0QkFBNEI7QUFDaEM7QUFDQSxRQUFRLGdCQUFnQixDQUFDOzs7Ozs7QUM3RXpCO0lBQ0ksa0NBQWtDO0lBQ2xDLHFCQUFxQjtBQUN6QjtBQUNBO0lBQ0ksMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5Qiw2QkFBNkI7SUFDN0IsNEJBQTRCO0FBQ2hDO0FBQ0E7SUFDSSwyQkFBMkI7SUFDM0IsOEJBQThCO0lBQzlCLDZCQUE2QjtJQUM3Qiw0QkFBNEI7QUFDaEM7QUFDQSxRQUFRLGdCQUFnQixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vdmVuZG9yL3N5bWZvbnkvdXgtbGl2ZS1jb21wb25lbnQvYXNzZXRzL2Rpc3QvbGl2ZS5taW4uY3NzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zdHlsZXMvYXBwLmNzcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvdnVlL0ludGVyZmFjZVRlbGVwaG9uZS52dWUiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3Z1ZS9TZWFyY2gudnVlIiwid2VicGFjazovLy8uL2Fzc2V0cy92dWUvVGFibGVhdU1hcDIudnVlIiwid2VicGFjazovLy8uL2Fzc2V0cy92dWUvQ3JlbmVhdTIudnVlIiwid2VicGFjazovLy8uL2Fzc2V0cy92dWUvUGFyYW0udnVlIiwid2VicGFjazovLy8uL2Fzc2V0cy92dWUvTWVzc2FnZXMudnVlIiwid2VicGFjazovLy8uL2Fzc2V0cy92dWUvU2VhcmNoU3RhbmRhcmQudnVlIiwid2VicGFjazovLy8uL2Fzc2V0cy92dWUvVGFibGVhdVN0YW5kYXJkLnZ1ZSIsIndlYnBhY2s6Ly8vLi9hc3NldHMvdnVlL0NyZW5lYXVTdGFuZGFyZC52dWUiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3Z1ZS9UYWJsZWF1UGxhbmlmLnZ1ZSIsIndlYnBhY2s6Ly8vLi9hc3NldHMvdnVlL0NyZW5lYXVQbGFuaWYudnVlIiwid2VicGFjazovLy8uL2Fzc2V0cy92dWUvUGxhbm5pbmcudnVlIiwid2VicGFjazovLy8uL2Fzc2V0cy92dWUvRXhjbHVzaW9uLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJbZGF0YS1sb2FkaW5nPVwiXCJdLFtkYXRhLWxvYWRpbmc9c2hvd10sW2RhdGEtbG9hZGluZyo9XFx8c2hvd117ZGlzcGxheTpub25lfSIsImJvZHkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xufVxuIiwiPHNjcmlwdCBzZXR1cD5cblxuaW1wb3J0IHsgY3JlYXRlQXBwLCByZWYsIG9uTW91bnRlZCwgb25CZWZvcmVVbm1vdW50LCBvblVubW91bnRlZCwgZ2V0Q3VycmVudEluc3RhbmNlLCBjb21wdXRlZH0gIGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyBidXMgfSBmcm9tICcuLi9idXMuanMnOyBcbmltcG9ydCB7IEZ1bmN0aW9ucyB9IGZyb20gJy4vc2VydmljZS9GdW5jdGlvbnMnO1xuXG5pbXBvcnQgVG9hc3QgZnJvbSAncHJpbWV2dWUvdG9hc3QnO1xuaW1wb3J0IHsgdXNlVG9hc3QgfSBmcm9tICdwcmltZXZ1ZS91c2V0b2FzdCc7XG5cbmltcG9ydCBJY29uRmllbGQgZnJvbSAncHJpbWV2dWUvaWNvbmZpZWxkJztcbmltcG9ydCBJbnB1dEljb24gZnJvbSAncHJpbWV2dWUvaW5wdXRpY29uJztcblxuaW1wb3J0IFRvb2xiYXIgZnJvbSAncHJpbWV2dWUvdG9vbGJhcic7XG5pbXBvcnQgSW5wdXRUZXh0IGZyb20gJ3ByaW1ldnVlL2lucHV0dGV4dCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ3ByaW1ldnVlL2J1dHRvbic7XG5cblxuICAgICAgICBjb25zdCBsb2FkaW5nID1yZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBpZCA9cmVmKCk7XG4gICAgICAgIGNvbnN0IHRvYXN0ID0gdXNlVG9hc3QoKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWYoMCk7XG4gICAgICAgIGNvbnN0IHRlbCA9IHJlZignJyk7XG4gICAgICAgIGNvbnN0IHZhbHVlMSA9IHJlZignb2snKTtcbiAgICAgICAgY29uc3QgcGFyYW0gPSByZWYobnVsbCk7ICBcbiAgICAgICAgY29uc3QgbWVzc2FnZXVyID0gcmVmKCcnKTtcbiAgICAgICAgY29uc3QgYWZmaWNoYWdlID0gcmVmKHRydWUpO1xuICAgICAgICBcbi8vQ0VOVFJBTEUgREUgQ09NTVVOSUNBVElPTlxuXG4gICAgICAgIGZ1bmN0aW9uIHNlbmRJbmZvcygpe1xuICAgICAgICAgICAgICAgICAgICBpZih0ZWwudmFsdWUubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmcudmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb3VudC52YWx1ZSA9IGNvdW50LnZhbHVlICsgMTtcbiAgICAgICAgICAgICAgICAgICAgaWYoY291bnQudmFsdWUgPCA0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbC52YWx1ZSA9IHRlbC52YWx1ZS5yZXBsYWNlQWxsKCcgJywgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbC52YWx1ZS5tYXRjaCgvXFxkL2cpLmxlbmd0aCAhPSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdWb3RyZSBudW3DqXJvIGRlIHTDqWzDqXBob25lIGRvaXQgY29tcG9ydGVyIGRpeCBjaGlmZnJlcy4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnZGFuZ2VyJywgc3VtbWFyeTogJ0luZm8nLCBkZXRhaWw6IG1lc3NhZ2V1ci52YWx1ZSwgbGlmZTogMzAwMCB9KTsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUxOiAnJzsgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMTogJ29rJzsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsOiB0ZWwudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9ucy5tYWtlUmVxdWVzdCgnL2FwaS9wb2ludHMvY29tbWVudGFpcmVUZWwvJytpZC52YWx1ZSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7Y29uc29sZS5sb2coZXJyb3IpO30pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ1ZvdHJlIG51bcOpcm8gZGUgdMOpbMOpcGhvbmUgZXN0IGVucmVnaXN0csOpLiBNZXJjaS4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZmaWNoYWdlLnZhbHVlPWZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9ICBcbiAgICAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTE6ICcnOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnT3DDqXJhdGlvbiBsaW1pdMOpZSDDoCAzIGVzc2Fpcy4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnZGFuZ2VyJywgc3VtbWFyeTogJ0luZm8nLCBkZXRhaWw6IG1lc3NhZ2V1ci52YWx1ZSwgbGlmZTogMzAwMCB9KTsgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgICAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHBFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwRWxlbWVudCAmJiBhcHBFbGVtZW50LmRhdGFzZXQudXNlclByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyUHJvcHNKc29uID0gYXBwRWxlbWVudC5kYXRhc2V0LnVzZXJQcm9wcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnZhbHVlID0gSlNPTi5wYXJzZSh1c2VyUHJvcHNKc29uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZC52YWx1ZSA9IHBhcmFtLnZhbHVlLmlkO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgLy8gb25CZWZvcmVVbm1vdW50IGVzdCBhcHBlbMOpIGp1c3RlIGF2YW50IHF1ZSBsZSBjb21wb3NhbnQgbmUgc29pdCByZXRpcsOpIGR1IERPTS5cbiAgICAgICAgb25CZWZvcmVVbm1vdW50KCgpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbjwvc2NyaXB0PlxuPHRlbXBsYXRlPlxuPFRvYXN0IC8+XG4gICAgPGRpdiB2LWlmPVwiYWZmaWNoYWdlXCI+XG4gICAgPHA+U2kgdm91cyBzb3VoYWl0ZXogaW5kaXF1ZXIgdW4gbnVtw6lybyBkZSB0w6lsw6lwaG9uZSBwb3VyIHZvdXMgam9pbmRyZSBwbHVzIGZhY2lsZW1lbnQsIG1lcmNpIGRlIGwnaW5kaXF1ZXIgY2ktZGVzc291cyA6IDwvcD5cbiAgICAgICAgPElucHV0VGV4dCB0eXBlPVwidGV4dFwiIHYtbW9kZWw9XCJ0ZWxcIiAgOmludmFsaWQ9XCIhdmFsdWUxXCIgcGxhY2Vob2xkZXI9XCJUw6lsw6lwaG9uZVwiIHJlcXVpcmVkIC8+XG4gICAgICAgIDxCdXR0b24gdHlwZT1cImJ1dHRvblwiIGxhYmVsPVwiRW5yZWdpc3RyZXJcIiBpY29uPVwicGkgcGktY2hlY2tcIiBzaXplPVwic21hbGxcIiA6bG9hZGluZz1cImxvYWRpbmdcIiBAY2xpY2s9XCJzZW5kSW5mb3NcIiBjbGFzcz1cImJ0biBidG4taW5mb1wiIC8+XG4gICAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHN0eWxlPlxuLnAtdG9hc3Qge2JhY2tncm91bmQtY29sb3I6ICNkZGRkZGMgIWltcG9ydGFudDsgY29sb3I6ICM1MDRiZmQ7fVxuPC9zdHlsZT4iLCI8c2NyaXB0IHNldHVwPlxuXG5pbXBvcnQgeyBjcmVhdGVBcHAsIHJlZiwgb25Nb3VudGVkLCBvbkJlZm9yZVVubW91bnQsIG9uVW5tb3VudGVkLCBnZXRDdXJyZW50SW5zdGFuY2UsIGNvbXB1dGVkfSAgZnJvbSAndnVlJztcbmltcG9ydCB7IGJ1cyB9IGZyb20gJy4uL2J1cy5qcyc7IFxuXG5pbXBvcnQgVG9vbGJhciBmcm9tICdwcmltZXZ1ZS90b29sYmFyJztcbmltcG9ydCBJbnB1dFRleHQgZnJvbSAncHJpbWV2dWUvaW5wdXR0ZXh0JztcbmltcG9ydCBCdXR0b24gZnJvbSAncHJpbWV2dWUvYnV0dG9uJztcbmltcG9ydCBEaWFsb2cgZnJvbSAncHJpbWV2dWUvZGlhbG9nJztcblxuaW1wb3J0IEljb25GaWVsZCBmcm9tICdwcmltZXZ1ZS9pY29uZmllbGQnO1xuaW1wb3J0IElucHV0SWNvbiBmcm9tICdwcmltZXZ1ZS9pbnB1dGljb24nO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaERpYWxvZyA9IHJlZigpO1xuICAgICAgICBjb25zdCBzdWJtaXR0ZWQgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXVyID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHBhcmFtID0gcmVmKG51bGwpO1xuICAgICAgICBjb25zdCBzZWFyY2hpbmcgPSByZWYoKTtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdGF0cyA9IHJlZihbXSk7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJTZWFyY2ggPSByZWYobnVsbCk7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBwYXJhbTogIHtcbiAgICB0eXBlOiBPYmplY3QsIFxuICAgIHJlcXVpcmVkOiB0cnVlIFxuICB9XG59KTtcblxuLy9DRU5UUkFMRSBERSBDT01NVU5JQ0FUSU9OXG4gICAgICAgIGNvbnN0IHNvdW1ldHRyZUZvcm11bGFpcmUgPSBhc3luYygpID0+IHtcbiAgICAgICAgICAvL2NvbnRyb2xlclxuICAgICAgICAgIGlmICghZm9ybXVsYWlyZUVzdFZhbGlkZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdMZXMgZG9ubsOpZXMgbmUgcGV1dmVudCBwYXMgw6p0cmUgdmlkZXMnO1xuICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3NlYXJjaCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IHNlYXJjaGluZy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdGF0cy52YWx1ZSA9IGRhdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7bWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgc2F1dmVnYXJkZVwiO31cbiAgICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gcmVzdWx0YXRzLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50ID09IDApe21lc3NhZ2V1ci52YWx1ZSA9IFwiQXVjdW4gcsOpc3VsdGF0XCI7fVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXttZXNzYWdldXIudmFsdWUgPSBjb3VudCArIFwiIHLDqXN1bHRhdChzKVwiO31cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciByw6lzZWF1XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGZvcm11bGFpcmVFc3RWYWxpZGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHNlYXJjaGluZy52YWx1ZS50cmltKCkgIT09ICcnO1xuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiByZWRpcmlnZShpZCwgdHlwZSkge1xuICAgICAgICAgICAgIGNsdXN0ZXJTZWFyY2gudmFsdWUgPSBpZDtcbiAgICAgICAgICAgICBjbHVzdGVyU2VhcmNoLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgIGJ1cy5lbWl0KCdjbHVzdGVyLXNlbGVjdGVkJywgY2x1c3RlclNlYXJjaCk7XG4gICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgfVxuXG5cbi8vRVZFTlQgSU5URVJGQUNFICBcbiAgICAgICAgY29uc3QgZWRpdERpYWxvZz0gKCkgPT4ge1xuICAgICAgICAgICAgc2VhcmNoRGlhbG9nLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGlkZURpYWxvZyA9ICgpID0+IHtcbiAgICAgICAgICAgIHNlYXJjaERpYWxvZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgLy9zdWJtaXR0ZWQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfTtcblxuLy9ERU1BUlJBR0VcbiAgICAgICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLnZhbHVlID0gcHJvcHMucGFyYW0ub3BlcmF0aW9uO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJNZXJjdXJlIEV2ZW50U291cmNlIGNsb3NlZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbjwvc2NyaXB0PlxuPHRlbXBsYXRlPlxuICAgICAgICA8ZGl2IGlkPVwicGFyYW1CdXR0b25cIj5cbiAgICAgICAgICAgICA8QnV0dG9uIGljb249XCJwaSBwaS1zZWFyY2hcIiAgQGNsaWNrPVwiZWRpdERpYWxvZygpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxEaWFsb2cgdi1tb2RlbDp2aXNpYmxlPVwic2VhcmNoRGlhbG9nXCIgOnN0eWxlPVwieyB3aWR0aDogJzQ1MHB4JyB9XCIgaGVhZGVyPVwiUmVjaGVyY2hlIHBhciBub20gb3UgdMOpbMOpcGhvbmVcIiA6bW9kYWw9XCJ0cnVlXCI+XG4gICAgICAgIDxkaXY+e3sgbWVzc2FnZXVyIH19PC9kaXY+XG4gICAgICAgICAgICA8Zm9ybSBAc3VibWl0LnByZXZlbnQ9XCJzb3VtZXR0cmVGb3JtdWxhaXJlXCI+XG4gICAgICAgICAgICAgIDxkaXYgIGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXG4gICAgICAgICAgICAgICAgICB2LW1vZGVsPVwic2VhcmNoaW5nXCIgXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlJlY2hlcmNoZXJcIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCI+UmVjaGVyY2hlcjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPGJyPlxuICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCJyZXN1bHRhdCBpbiByZXN1bHRhdHNcIiA6a2V5PVwicmVzdWx0YXQuaWRcIj5cbiAgICAgICAgICAgICAgICA8cD48YSBjbGFzcz1cImxpZW4tc2VhcmNoXCIgQGNsaWNrPVwicmVkaXJpZ2UocmVzdWx0YXQuY2x1c3RlciwgcmVzdWx0YXQudHlwZSlcIj57eyByZXN1bHRhdC5ub20gfX0gOiB7eyByZXN1bHRhdC50ZWwxIH19L3t7IHJlc3VsdGF0LnRlbDIgfX08L2E+PC9wPlxuICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L0RpYWxvZz5cbjwvdGVtcGxhdGU+XG48c3R5bGUgc2NvcGVkPlxuLmNvbnRhaW5lciB7XG4gIG1heC13aWR0aDogNDAwcHg7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcbn1cbi5saWVuLXNlYXJjaCB7Zm9udC1zaXplOiAxMnB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7fVxuaW5wdXQge1xuICBwYWRkaW5nOiA1cHg7XG4gIGZsZXgtZ3JvdzogMTtcbn1cbmJ1dHRvbiB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG4gIHBhZGRpbmc6IDEwcHggMjBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuPC9zdHlsZT4iLCI8c2NyaXB0IHNldHVwPlxuXG5pbXBvcnQgeyBjcmVhdGVBcHAsIHJlZiwgb25Nb3VudGVkLCBvbkJlZm9yZVVubW91bnQsIG9uVW5tb3VudGVkLCBnZXRDdXJyZW50SW5zdGFuY2UsIGNvbXB1dGVkfSAgZnJvbSAndnVlJztcbmltcG9ydCB7IEZpbHRlck1hdGNoTW9kZSwgRmlsdGVyT3BlcmF0b3IgfSBmcm9tICdAcHJpbWV2dWUvY29yZS9hcGknO1xuaW1wb3J0IHsgdXNlRXZlbnRTb3VyY2UgfSBmcm9tICdAdnVldXNlL2NvcmUnO1xuXG5pbXBvcnQgeyBidXMgfSBmcm9tICcuLi9idXMuanMnOyBcbmltcG9ydCB7IEZ1bmN0aW9ucyB9IGZyb20gJy4vc2VydmljZS9GdW5jdGlvbnMnO1xuXG5pbXBvcnQgeyBWdWVEYXRlUGlja2VyIH0gZnJvbSAnQHZ1ZXBpYy92dWUtZGF0ZXBpY2tlcic7XG5pbXBvcnQgJ0B2dWVwaWMvdnVlLWRhdGVwaWNrZXIvZGlzdC9tYWluLmNzcydcblxuaW1wb3J0IFNlYXJjaCBmcm9tICcuL1NlYXJjaC52dWUnO1xuXG5pbXBvcnQgUHJvZ3Jlc3NCYXIgZnJvbSAncHJpbWV2dWUvcHJvZ3Jlc3NiYXInO1xuaW1wb3J0IERhdGFUYWJsZSBmcm9tICdwcmltZXZ1ZS9kYXRhdGFibGUnO1xuaW1wb3J0IENvbHVtbiBmcm9tICdwcmltZXZ1ZS9jb2x1bW4nO1xuaW1wb3J0IENvbHVtbkdyb3VwIGZyb20gJ3ByaW1ldnVlL2NvbHVtbmdyb3VwJzsgICBcbmltcG9ydCBSb3cgZnJvbSAncHJpbWV2dWUvcm93JzsgICAgIFxuaW1wb3J0IFRvZ2dsZVN3aXRjaCBmcm9tICdwcmltZXZ1ZS90b2dnbGVzd2l0Y2gnO1xuXG5cbmltcG9ydCBUb29sYmFyIGZyb20gJ3ByaW1ldnVlL3Rvb2xiYXInO1xuaW1wb3J0IHsgdXNlVG9hc3QgfSBmcm9tICdwcmltZXZ1ZS91c2V0b2FzdCc7XG5cbmltcG9ydCBJbnB1dFRleHQgZnJvbSAncHJpbWV2dWUvaW5wdXR0ZXh0JztcbmltcG9ydCBTZWxlY3QgZnJvbSAncHJpbWV2dWUvc2VsZWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAncHJpbWV2dWUvYnV0dG9uJztcbmltcG9ydCBUZXh0YXJlYSBmcm9tICdwcmltZXZ1ZS90ZXh0YXJlYSc7XG5pbXBvcnQgQ2hlY2tib3ggZnJvbSAncHJpbWV2dWUvY2hlY2tib3gnO1xuaW1wb3J0IENoZWNrYm94R3JvdXAgZnJvbSAncHJpbWV2dWUvY2hlY2tib3hncm91cCc7XG5cbmltcG9ydCBEaWFsb2cgZnJvbSAncHJpbWV2dWUvZGlhbG9nJztcblxuaW1wb3J0IEljb25GaWVsZCBmcm9tICdwcmltZXZ1ZS9pY29uZmllbGQnO1xuaW1wb3J0IElucHV0SWNvbiBmcm9tICdwcmltZXZ1ZS9pbnB1dGljb24nO1xuXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcbiAgcGFyYW06ICB7XG4gICAgdHlwZTogT2JqZWN0LCBcbiAgICByZXF1aXJlZDogdHJ1ZSBcbiAgfVxufSk7XG5cbiAgICAgICAgY29uc3QgZXRhdHMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbGlzdGVhZ2VudHMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSByZWYoMzAwKTtcbiAgICAgICAgY29uc3QgbWlzc2lvbklEID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklEID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXRlbXAgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXNfdHlwZXMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXNUeXBlID0gcmVmKFtdKTsgXG5cbiAgICAgICAgY29uc3QgcG9pbnRzID0gcmVmKFtdKTsgLy8gTGEgbGlzdGUgc2VyYSBjaGFyZ8OpZSBldCBtaXNlIMOgIGpvdXIgdmlhIE1lcmN1cmUvQVBJXG4gICAgICAgIGNvbnN0IG1lc3NhZ2V1ciA9IHJlZignJyk7XG4gICAgICAgIGNvbnN0IG5vbWJyZSA9IHJlZigpO1xuICAgICAgICBjb25zdCB0b3RhbCA9IHJlZigpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZigpO1xuICAgICAgICBjb25zdCBwb3VyY2VudCA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlU01TPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZUV4Y2VsPSByZWYoKTtcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gcmVmKFtdKTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IDA7XG4gICAgICAgIGxldCBzZWwgPSAwO1xuICAgICAgICBsZXQgc2VhcmNoID0gMDtcbiAgICAgICAgY29uc3QgbWFWYWxldXIgPSByZWYoMClcbiAgICAgICAgY29uc3Qgc2hvd1dpdGhSViA9IHJlZih0cnVlKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkID0gJyc7XG4gICAgICAgIGNvbnN0IG1vaXMgPSByZWYoKTtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IGRhdGUgPSByZWYobmV3IERhdGUoKSk7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJJRCA9IHJlZigpO1xuICAgICAgICBjb25zdCBsb2FkaW5nID1yZWYoKTtcbiAgICAgICAgbG9hZGluZy52YWx1ZSA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgZXRhdD0gcmVmKCk7IFxuICAgICAgICBjb25zdCBzZWFyY2hOb20gPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdGF0dXMgPSByZWYoJ1RvdXMnKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoTnVtZXJvUGh5c2lxdWUgPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoTnVtZXJvQ2xpZW50ID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaE5vbVJ1ZSA9IHJlZignVG91dGVzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hEYXRlUlYgPSByZWYoJ1RvdXRlcycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoUGxhbmlmUlYgPSByZWYoJ1RvdXRlcycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoUXVhcnRpZXIgPSByZWYoJ1RvdXMnKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoVmlsbGUgPSByZWYoJ1RvdXRlcycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoRXRhdCA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoVGVsID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXIxID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXIyID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXIzID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXI0ID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaENsdXN0ZXI1ID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaEVtcGxhY2VtZW50ID0gcmVmKCdUb3VzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hBbGVydGUgPSByZWYoJ1RvdXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaEFnZW50ID0gcmVmKCdUb3VzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hNaXNzaW9uID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHJlc3RyZWludCA9IHJlZigpO1xuICAgICAgICBjb25zdCBsaXN0ZW1pc3Npb25zID0gcmVmKFtdKTtcbiAgICAgICAgY29uc3Qgc2xvdFByb3BzID0gcmVmKCk7IFxuXG4gICAgICAgIGNvbnN0IGNsaWNrZWRSb3dJZCA9IHJlZihudWxsKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWJsZVBvaW50cyA9IHJlZihbXSk7IFxuICAgICAgICBjb25zdCBzZWxlY3RlZFRhYiA9IHJlZihbXSk7XG4gICAgICAgIGNvbnN0IENvbG9ycyA9IHJlZihbXSk7IFxuXG4gICAgICAgIGNvbnN0IGV4cGFuZGVkUm93cyA9IHJlZihbXSk7XG4gICAgICAgIGNvbnN0IHRvYXN0ID0gdXNlVG9hc3QoKTtcbiAgICAgICAgY29uc3QgcHJvZHVjdERpYWxvZyA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IGV4Y2VsRGlhbG9nID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgcHJvZHVjdCA9IHJlZih7fSk7XG4gICAgICAgIGNvbnN0IHN1Ym1pdHRlZCA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVmKDApO1xuICAgICAgICBjb25zdCBkYXRhQ3JlbmVhdSA9IHt9O1xuICAgICAgICBjb25zdCBkYXRlRXhjZWwgPSB7fTtcbiAgICAgICAgY29uc3QgZGF0YUNhcnRlID0ge307XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCkrMTtcbiAgICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIHJldHVybiBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUHJvZHVjdHMgPSByZWYoe30pO1xuICAgICAgICBjb25zdCBtZXRhS2V5ID0gcmVmKHRydWUpO1xuXG4vL0NFTlRSQUxFIERFIENPTU1VTklDQVRJT05cblxuICAgICAgICAvLyBGb25jdGlvbiBwb3VyIHLDqWN1cMOpcmVyIGxlcyBpbml0aWF1eCBkZXB1aXMgbCdBUEkgU3ltZm9ueVxuXG4gICAgICAgIGZ1bmN0aW9uIGZldGNoUG9pbnRzKGNsdXN0ZXJfaWQpeyAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAvLyB5b3VyIG9wdGlvbnMuLi4gbWV0aG9kOiBQT1NULCBoZWFkZXJzLCBjb3JzLCBldGMuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGUudmFsdWU9JydcbiAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL2NsdXN0ZXIvJytjbHVzdGVyX2lkLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0YS5zdGF0dXMnK2RhdGEuc3RhdHVzKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWRpcmVjdGlvbiBmb3Jjw6llIHZlcnMgbGEgcGFnZSBkZSBsb2dpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY2hhcmdlbWVudCBwb2ludHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWUgPSBkYXRhLnJlc3BvbnNlLm1hcChwID0+ICh7IC4uLnAsIGlzRWRpdGluZzogZmFsc2UsIG9yaWdpbmFsOiB7fSwgc2VsZWN0ZWQ6IGZhbHNlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0SXRlbSA9IHBvaW50cy52YWx1ZS5maW5kKHg9PnghPT11bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZWFyY2ggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBzZWFyY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0UG9pbnQocG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IGNvbnNvbGUubG9nKGVycm9yKSkgLy8gZG8gc29tZXRoaW5nIHVzZWZ1bCB3aXRoIGVycm9yXG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gZmV0Y2hQb2ludHNNaXNzaW9uKG1pc3Npb25faWQpeyAgICAgIFxuICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdDaGFyZ2VtZW50IGVuIGNvdXJzJztcbiAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pOyAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAvLyB5b3VyIG9wdGlvbnMuLi4gbWV0aG9kOiBQT1NULCBoZWFkZXJzLCBjb3JzLCBldGMuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGUudmFsdWU9JydcbiAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL29wZXJhdGlvbi8nK29wZXJhdGlvbklELnZhbHVlKycvJyttaXNzaW9uX2lkLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0YS5zdGF0dXMnK2RhdGEuc3RhdHVzKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWRpcmVjdGlvbiBmb3Jjw6llIHZlcnMgbGEgcGFnZSBkZSBsb2dpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY2hhcmdlbWVudCBwb2ludHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWUgPSBkYXRhLnJlc3BvbnNlLm1hcChwID0+ICh7IC4uLnAsIGlzRWRpdGluZzogZmFsc2UsIG9yaWdpbmFsOiB7fSwgc2VsZWN0ZWQ6IGZhbHNlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0SXRlbSA9IHBvaW50cy52YWx1ZS5maW5kKHg9PnghPT11bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZWFyY2ggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBzZWFyY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0UG9pbnQocG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtjb25zb2xlLmxvZyhlcnJvcik7Ly93aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGNoYW5nZV9hbGVydGUocG9pbnQpeyAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAvLyB5b3VyIG9wdGlvbnMuLi4gbWV0aG9kOiBQT1NULCBoZWFkZXJzLCBjb3JzLCBldGMuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy9hbGVydGUvJytwb2ludC5pZCsnLycrcG9pbnQuYWxlcnRlLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGdldEluZm9zKGRhdGEpeyAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRwb2ludHM6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0ZS52YWx1ZT0nJ1xuICAgICAgICAgICAgICAgIEZ1bmN0aW9ucy5tYWtlUmVxdWVzdCgnL2FwaS9wb2ludHMvZ2V0VjIvJywgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkYXRhLnN0YXR1cycrZGF0YS5zdGF0dXMpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yZXNwb25zZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4MiA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBlbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50SW5kZXgyICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXgyXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5lbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXgzID0gZmlsdGVyZWRQb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gZWxlbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkUG9pbnRzLnZhbHVlW3BvaW50SW5kZXgzXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gZnJvemVuUG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2ludEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5Qb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5lbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFDYXJ0ZS5jbHVzdGVySWQgPSBlbGVtZW50LmNsdXN0ZXI1O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFDYXJ0ZS5taXNzaW9uID0gZWxlbWVudC5taXNzaW9uLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYnVzLmVtaXQoJ2NhcnRlLXJlZnJlc2gnLCBkYXRhQ2FydGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSBwcm9kdWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hpZGVEaWFsb2coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaGFuZGxlTWVyY3VyZU1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpOyBcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBNZXJjdXJlIG1lc3NhZ2UgcmVjZWl2ZWQgOmAsIGRhdGEpO1xuICAgICAgICAgICAgZGF0YS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGVsZW1lbnQuYWN0aW9uO1xuICAgICAgICAgICAgICAgIHZhciByZWZyZXNoX2NyZW5lYXUgPSAwO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIC8vbWlzZSDDoCBqb3VyIGRlcyBjbHVzdGVycyBjb21wbGV0XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NsdXN0ZXJfY29tcGxldGVkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdjbHVzdGVyc2NvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGVsZW1lbnQsIC8vIFBhc3MgeW91ciBkYXRhIGluIHRoZSAnZGV0YWlsJyBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwcm9kdWN0X3VwZGF0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmZvcyhlbGVtZW50LnBvaW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNZXJjdXJlIHByb2R1Y3RfdXBkYXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfY3JlbmVhdSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjcmVuZWF1X3VwZGF0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NyZW5lYXVfdXBkYXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoX2NyZW5lYXUgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxVcGRhdGUoZWxlbWVudC5kb25uZWVzLm5vbWJyZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZihyZWZyZXNoX2NyZW5lYXUgPT0gMSl7XG4gICAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NyZW5lYXUtdXBkYXRlZCcsICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4vLyBJTlRFUkZBQ0VcbiAgICAgICAgICAgIGNvbnN0IGdldExhc3RQbGFuaWZpZWREYXRlID0gKHBvaW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmICghcG9pbnQubG9nZXRhdHMgfHwgcG9pbnQubG9nZXRhdHMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcblxuICAgICAgICAgICAgICAvLyAxLiBGaWx0cmVyIGxlcyBsb2dzIHBhciBpZCBkJ8OpdGF0IDVcbiAgICAgICAgICAgICAgY29uc3QgcGxhbmlmaWVzID0gcG9pbnQubG9nZXRhdHMuZmlsdGVyKGxvZyA9PiBsb2cuZXRhdC5pZCA9PT0gNSk7XG5cbiAgICAgICAgICAgICAgLy8gMi4gVsOpcmlmaWVyIHMnaWwgeSBlbiBhIGF1IG1vaW5zIHVuXG4gICAgICAgICAgICAgIGlmIChwbGFuaWZpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJKYW1haXMgcGxhbmlmacOpXCI7XG5cbiAgICAgICAgICAgICAgLy8gMy4gUsOpY3Vww6lyZXIgbGUgZGVybmllciAoZW4gc3VwcG9zYW50IHF1ZSBsZSBKU09OIGVzdCB0cmnDqSBwYXIgZGF0ZS9JRCBjcm9pc3NhbnQpXG4gICAgICAgICAgICAgIC8vIFNpIHZvdXMgbifDqnRlcyBwYXMgc8O7ciBkdSB0cmksIHZvdXMgcG91dmV6IGFqb3V0ZXIgLnNvcnQoKGEsIGIpID0+IGIuaWQgLSBhLmlkKSBhdmFudCBsZSBbMF1cbiAgICAgICAgICAgICAgY29uc3QgZGVybmllckxvZyA9IHBsYW5pZmllc1twbGFuaWZpZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGRlcm5pZXJMb2cuZGF0ZWNyZWE7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFnZW50cyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsQWdlbnRzV2l0aER1cGxpY2F0ZXMgPSBwb2ludHMudmFsdWUubWFwKHBvaW50ID0+IChwb2ludC5hZ2VudC5ub20rJyAnKyhwb2ludC5hZ2VudC5wcmVub20/PycnKSkpXG4gICAgICAgICAgICBjb25zdCB1bmlxdWVBZ2VudFNldCA9IG5ldyBTZXQoYWxsQWdlbnRzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlQWdlbnRTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdmlsbGVzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxDaXRpZXNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnQudmlsbGUpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlQ2l0eVNldCA9IG5ldyBTZXQoYWxsQ2l0aWVzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlQ2l0eVNldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBxdWFydGllcnMgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbFF1YXJ0aWVyc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC5xdWFydGllcik7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVRdWFydGllclNldCA9IG5ldyBTZXQoYWxsUXVhcnRpZXJzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlUXVhcnRpZXJTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcnVlcyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsUnVlc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC5ub21SdWUpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlUnVlU2V0ID0gbmV3IFNldChhbGxSdWVzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlUnVlU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGVtcGxhY2VtZW50cyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsTGliZWxsZXNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnQuZW1wbGFjZW1lbnRDb21wdGV1cik7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVMaWJlbGxlc1NldCA9IG5ldyBTZXQoYWxsTGliZWxsZXNXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVMaWJlbGxlc1NldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkYXRlc1JWICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxEYXRlc1JWV2l0aER1cGxpY2F0ZXMgPSBwb2ludHMudmFsdWUubWFwKHBvaW50ID0+IHBvaW50X1JWKHBvaW50KSk7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVhbGxEYXRlc1JWU2V0ID0gbmV3IFNldChhbGxEYXRlc1JWV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlYWxsRGF0ZXNSVlNldCkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVBID0gYS5zcGxpdCgnLScpLnJldmVyc2UoKS5qb2luKCcnKTsgLy8gXCIwOS0wMi0yMDI2XCIgLT4gXCIyMDI2MDIwOVwiXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZUIgPSBiLnNwbGl0KCctJykucmV2ZXJzZSgpLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlQS5sb2NhbGVDb21wYXJlKGRhdGVCKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlYWxsRGF0ZXNSVlNldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwbGFuaWZSViA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBvaW50c1RlbXAgPSBbXVxuICAgICAgICAgICAgcG9pbnRzVGVtcC52YWx1ZSA9IHBvaW50cy52YWx1ZS5maWx0ZXIocG9pbnQgPT4gcG9pbnQuZXRhdC5pZCA9PT0gNSlcbiAgICAgICAgICAgIGNvbnN0IGxhc3REYXRlc1BlclBvaW50ID0gcG9pbnRzVGVtcC52YWx1ZS5tYXAocG9pbnQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3NQbGFuaWZpZXMgPSAocG9pbnQubG9nZXRhdHMgfHwgW10pLmZpbHRlcihsb2cgPT4gbG9nLmV0YXQuaWQgPT09IDUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3NQbGFuaWZpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIDIuIE9uIHLDqWN1cMOocmUgVU5JUVVFTUVOVCBsZSBkZXJuaWVyIGxvZyBkZSBsYSBsaXN0ZSAobGUgcGx1cyByw6ljZW50KVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcm5pZXJMb2cgPSBsb2dzUGxhbmlmaWVzW2xvZ3NQbGFuaWZpZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICAgICAgICAvLyAzLiBPbiBleHRyYWl0IGxhIGRhdGUgZHUgY29tbWVudGFpcmUgKGV4OiBcIjA5LTAyLTIwMjZcIilcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IGRlcm5pZXJMb2cuZGF0ZWNyZWE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2ggOiBudWxsO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIDQuIE9uIG5ldHRvaWUgOiBvbiBlbmzDqHZlIGxlcyBudWxsIChwb2ludHMgc2FucyBSVikgZXQgb24gZMOpZG91Ymxvbm5lIGF2ZWMgU2V0XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVEYXRlcyA9IEFycmF5LmZyb20obmV3IFNldChsYXN0RGF0ZXNQZXJQb2ludC5maWx0ZXIoZCA9PiBkICE9PSBudWxsKSkpO1xuXG4gICAgICAgICAgICAvLyA1LiBPbiB0cmllIHBhciBvcmRyZSBjaHJvbm9sb2dpcXVlIChZWVlZLU1NLUREKVxuICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZURhdGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlQSA9IGEuc3BsaXQoJy0nKS5yZXZlcnNlKCkuam9pbignJyk7IC8vIFwiMDktMDItMjAyNlwiIC0+IFwiMjAyNjAyMDlcIlxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVCID0gYi5zcGxpdCgnLScpLnJldmVyc2UoKS5qb2luKCcnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZUEubG9jYWxlQ29tcGFyZShkYXRlQik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gcG9pbnRfUlYocG9pbnQpe1xuICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUpeyBcbiAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUpe3JldHVybiBwb2ludC5jcmVuZWF1LmRhdGU7fWVsc2V7cmV0dXJuICdTYW5zIFJWJzt9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2V7cmV0dXJuICdTYW5zIFJWJzt9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9wcmnDqXTDqSBjYWxjdWzDqWUgcXVpIHJlbnZlcnJhIGxhIGxpc3RlIGZpbHRyw6llIMOgIGxhIERhdGFUYWJsZVxuICAgICAgICBjb25zdCBmaWx0ZXJlZFBvaW50cyA9IGNvbXB1dGVkKCgpID0+IHtcblxuICAgICAgICAgICAgLy8gU2kgb24gbidhIHBhcyBlbmNvcmUgZGUgZG9ubsOpZXMsIG9uIHJlbnZvaWUgdW4gdGFibGVhdSB2aWRlXG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT24gY29tbWVuY2UgYXZlYyB1bmUgY29waWUgZGUgdG91dGVzIGxlcyBkb25uw6llc1xuICAgICAgICAgICAgbGV0IHBvaW50c1RvRmlsdGVyID0gWy4uLnBvaW50cy52YWx1ZV07XG5cbiAgICAgICAgICAgIC8vIEZpbHRyZSBwYXIgbm9tXG4gICAgICAgICAgICBpZiAoc2VhcmNoTm9tLnZhbHVlICYmIHNlYXJjaE5vbS52YWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG93ZXJDYXNlU2VhcmNoID0gc2VhcmNoTm9tLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIC8vIEFqb3V0ZXogaWNpIHRvdSBsZXMgY2hhbXBzIGRhbnMgbGVzcXVlbHMgdm91cyB2b3VsZXogY2hlcmNoZXJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubm9tLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbHRyZSBwYXIgTnVtZXJvUGh5c2lxdWVcbiAgICAgICAgICAgIGlmIChzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZSAmJiBzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG93ZXJDYXNlU2VhcmNoID0gc2VhcmNoTnVtZXJvUGh5c2lxdWUudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubnVtZXJvUGh5c2lxdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlckNhc2VTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBOdW1lcm9DbGllbnRcbiAgICAgICAgICAgIGlmIChzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUgJiYgc2VhcmNoTnVtZXJvQ2xpZW50LnZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubnVtZXJvQ2xpZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbHRyZSBwYXIgTm9tUnVlXG4gICAgICAgICAgICBpZiAoc2VhcmNoTm9tUnVlLnZhbHVlICYmIHNlYXJjaE5vbVJ1ZS52YWx1ZS50cmltKCkgIT09ICdUb3V0ZXMnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG93ZXJDYXNlU2VhcmNoID0gc2VhcmNoTm9tUnVlLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50Lm5vbVJ1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyQ2FzZVNlYXJjaClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgVmlsbGVcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3ZpbGxlJytzZWFyY2hWaWxsZS52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hWaWxsZS52YWx1ZSAmJiBzZWFyY2hWaWxsZS52YWx1ZSAhPT0gJ1RvdXRlcycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQudmlsbGUgPT09IHNlYXJjaFZpbGxlLnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIFRlbFxuICAgICAgICAgICAgaWYgKHNlYXJjaFRlbC52YWx1ZSAmJiBzZWFyY2hUZWwudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnRlbDEudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZWwudmFsdWUpfHxwb2ludC50ZWwyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVsLnZhbHVlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBRdWFydGllclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncXVhcnRpZXInK3NlYXJjaFF1YXJ0aWVyLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaFF1YXJ0aWVyLnZhbHVlICYmIHNlYXJjaFF1YXJ0aWVyLnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQucXVhcnRpZXIgPT09IHNlYXJjaFF1YXJ0aWVyLnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBBZ2VudFxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncXVhcnRpZXInK3NlYXJjaFF1YXJ0aWVyLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaEFnZW50LnZhbHVlICYmIHNlYXJjaEFnZW50LnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgKHBvaW50LmFnZW50Lm5vbSsnICcrKHBvaW50LmFnZW50LnByZW5vbT8/JycpKSA9PT0gc2VhcmNoQWdlbnQudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIEVtcGxhY2VtZW50XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWFydGllcicrc2VhcmNoUXVhcnRpZXIudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoRW1wbGFjZW1lbnQudmFsdWUgJiYgc2VhcmNoRW1wbGFjZW1lbnQudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5lbXBsYWNlbWVudENvbXB0ZXVyID09PSBzZWFyY2hFbXBsYWNlbWVudC52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBEYXRlUlZcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3F1YXJ0aWVyJytzZWFyY2hRdWFydGllci52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hEYXRlUlYudmFsdWUgJiYgc2VhcmNoRGF0ZVJWLnZhbHVlICE9PSAnVG91dGVzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25fcG9pbnRfUlYocG9pbnQsIHNlYXJjaERhdGVSVi52YWx1ZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VhcmNoUGxhbmlmUlYudmFsdWUgJiYgc2VhcmNoUGxhbmlmUlYudmFsdWUgIT09ICdUb3V0ZXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9wb2ludF9QbGFuaWYocG9pbnQsIHNlYXJjaFBsYW5pZlJWLnZhbHVlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gY29uZGl0aW9uX3BvaW50X1JWKHBvaW50LCBkYXRlUlYpe1xuICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1KXsgXG4gICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSl7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUgPT0gZGF0ZVJWKXtyZXR1cm4gdHJ1ZTt9XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGVSViA9PSAnU2FucyBSVicpe3JldHVybiB0cnVlO31cbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgaWYoZGF0ZVJWID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gY29uZGl0aW9uX3BvaW50X1BsYW5pZihwb2ludCwgZGF0ZVJWKXtcbiAgICAgICAgICAgICAgaWYocG9pbnQubG9nZXRhdHMpeyBcbiAgICAgICAgICAgICAgICBmb3IoY29uc3QgbG9nZXRhdCBvZiBwb2ludC5sb2dldGF0cykge1xuXG4gICAgICAgICAgICAgICAgICAgICBpZihsb2dldGF0LmRhdGVjcmVhKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKChsb2dldGF0LmRhdGVjcmVhID09IGRhdGVSVikgJiYgKHBvaW50LmV0YXQuaWQgPT0gNSkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhdGVSVicrbG9nZXRhdC5kYXRlY3JlYSsnICcrZGF0ZVJWKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nZXRhdC5kYXRlY3JlYSA9PSAnU2FucyBSVicpe3JldHVybiB0cnVlO31cbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9ICAgICBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIGlmKGRhdGVSViA9PSAnU2FucyBSVicpe3JldHVybiB0cnVlO31cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBFdGF0XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdldGF0JytzZWFyY2hFdGF0LnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaEV0YXQudmFsdWUgJiYgc2VhcmNoRXRhdC52YWx1ZSAhPT0gJ1RvdXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmV0YXQuaWQgPT09IHNlYXJjaEV0YXQudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIENsdXN0ZXIgMVxuICAgICAgICAgICAgaWYgKHNlYXJjaENsdXN0ZXIxLnZhbHVlICYmIHNlYXJjaENsdXN0ZXIxLnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5jbHVzdGVyMSA9PT0gc2VhcmNoQ2x1c3RlcjEudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIENsdXN0ZXIgMlxuICAgICAgICAgICAgaWYgKHNlYXJjaENsdXN0ZXIyLnZhbHVlICYmIHNlYXJjaENsdXN0ZXIyLnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5jbHVzdGVyMiA9PT0gc2VhcmNoQ2x1c3RlcjIudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIENsdXN0ZXIgM1xuICAgICAgICAgICAgaWYgKHNlYXJjaENsdXN0ZXIzLnZhbHVlICYmIHNlYXJjaENsdXN0ZXIzLnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5jbHVzdGVyMyA9PT0gc2VhcmNoQ2x1c3RlcjMudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIENsdXN0ZXIgNFxuICAgICAgICAgICAgaWYgKHNlYXJjaENsdXN0ZXI0LnZhbHVlICYmIHNlYXJjaENsdXN0ZXI0LnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5jbHVzdGVyNCA9PT0gc2VhcmNoQ2x1c3RlcjQudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIENsdXN0ZXIgNVxuICAgICAgICAgICAgaWYgKHNlYXJjaENsdXN0ZXI1LnZhbHVlICYmIHNlYXJjaENsdXN0ZXI1LnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5jbHVzdGVyNSA9PT0gc2VhcmNoQ2x1c3RlcjUudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgRGF0ZVJWXG4gICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uX3NlbGVjdGVkKHBvaW50KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmdW5jdGlvbiBjb25kaXRpb25fc2VsZWN0ZWQocG9pbnQpe1xuICAgICAgICAgICAgICAgICBpZihwb2ludC5mcm96ZW4pe1xuICAgICAgICAgICAgICAgICAgICAgIGlmKHBvaW50LmZyb3plbiA9PSB0cnVlKXtyZXR1cm4gZmFsc2U7fVxuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgQWxlcnRlXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChzZWFyY2hBbGVydGUudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIGlmKHNlYXJjaEFsZXJ0ZS52YWx1ZSA9PSAndHJ1ZScpe1xuICAgICAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LmFsZXJ0ZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHNlYXJjaEFsZXJ0ZS52YWx1ZSA9PSAnZmFsc2UnKXtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC5hbGVydGUgPT09IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY291bnQudmFsdWUgPSBwb2ludHNUb0ZpbHRlci5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gcG9pbnRzVG9GaWx0ZXI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNsZWFyRmlsdGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgc2VhcmNoTm9tLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hFdGF0LnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgc2VhcmNoUXVhcnRpZXIudmFsdWUgPSAnVG91cyc7XG4gICAgICAgICAgICBzZWFyY2hFbXBsYWNlbWVudC52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaFRlbC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoVmlsbGUudmFsdWUgPSAnVG91dGVzJztcbiAgICAgICAgICAgIHNlYXJjaE5vbVJ1ZS52YWx1ZSA9ICdUb3V0ZXMnO1xuICAgICAgICAgICAgc2VhcmNoTnVtZXJvQ2xpZW50LnZhbHVlICA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoTnVtZXJvUGh5c2lxdWUudmFsdWUgID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hDbHVzdGVyMS52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoQ2x1c3RlcjIudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaENsdXN0ZXIzLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hDbHVzdGVyNC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoQ2x1c3RlcjUudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaERhdGVSVi52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoUGxhbmlmUlYudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaEFsZXJ0ZS52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaEFnZW50LnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9vbiByZWNvaXQgdW4gbWVzc2FnZSBkZSBsZWFmbGV0XG4gICAgICAgIGNvbnN0IHVwZGF0ZUNsdXN0ZXIgPSAoY2x1c3RlclNlYXJjaCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJGaWx0ZXIoKTtcbiAgICAgICAgICAgIGV2YWwoJ3NlYXJjaENsdXN0ZXInK2NsdXN0ZXJTZWFyY2gudHlwZSsnLnZhbHVlID0gJytjbHVzdGVyU2VhcmNoLnZhbHVlKTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NsaWMgcmVjaWV2ZWQnICsgY2x1c3RlclNlYXJjaC50eXBlICsnaWQnKyArIGNsdXN0ZXJTZWFyY2gudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9vbiByw6lpbml0YWxpc2UgbCdhZmZpY2hhZ2UsIG9uIGzDqHZlIGxlIGxvY2tcbiAgICAgICAgY29uc3QgZ2xvYmFsRXh0ZXJuYWxDYWxsID0gKGNsdXN0ZXJfaWQsIHNlbCkgPT4ge1xuICAgICAgICAgICAgLy9zZW5kTG9jayhudWxsLCAyKTtcbiAgICAgICAgICAgIHNlYXJjaCA9IHNlbDtcbiAgICAgICAgICAgIGZldGNoUG9pbnRzKGNsdXN0ZXJfaWQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGVkaXRQb2ludCA9IChpZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHMudmFsdWUuZmluZChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgIGlmIChwb2ludCkge1xuICAgICAgICAgICAgICAgIHBvaW50Lm9yaWdpbmFsID0geyAuLi5wb2ludCB9O1xuICAgICAgICAgICAgICAgIHBvaW50LmlzRWRpdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncG9pbnRDJytwb2ludC5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKHBvaW50LmNyZW5lYXUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQuY3JlbmVhdSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBwb2ludC5jcmVuZWF1LmlkID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vc2VuZExvY2socG9pbnQsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNhbmNlbEVkaXQgPSAoaWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKHBvaW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdID0geyAuLi5wb2ludHMudmFsdWVbcG9pbnRJbmRleF0ub3JpZ2luYWwsIGlzRWRpdGluZzogZmFsc2UsIG9yaWdpbmFsOiB7fSB9O1xuICAgICAgICAgICAgICAgIC8vc2VuZExvY2socG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBzZW5kSW5mb3MoaWQpe1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc2VuZEluZm9zJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcHJvZHVjdC52YWx1ZS5jb21tZW50YWlyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlOiBwcm9kdWN0LnZhbHVlLmNvbXB0ZXVyQWNjZXNzaWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXZpbGl0ZTogcHJvZHVjdC52YWx1ZS5jaXZpbGl0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub206IHByb2R1Y3QudmFsdWUubm9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyb0NsaWVudDogcHJvZHVjdC52YWx1ZS5udW1lcm9DbGllbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsMTogcHJvZHVjdC52YWx1ZS50ZWwxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbDI6IHByb2R1Y3QudmFsdWUudGVsMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbDogcHJvZHVjdC52YWx1ZS5lbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGF0OiBwcm9kdWN0LnZhbHVlLmV0YXQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnQ6IHByb2R1Y3QudmFsdWUuYWdlbnQuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy91cGRhdGVWMi8nK2lkLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NlY3VyaXTDqSBtZXJjdXJlIGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmZvcyhpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NyZW5lYXUtdXBkYXRlZCcsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LmlzRWRpdGluZyA9IGZhbHNlOyAvLyBTb3J0aXIgZHUgbW9kZSDDqWRpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVEaWFsb2coKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7Y29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAvL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzZW5kRXhjZWwoKXtcbiAgICAgICAgICAgIGhpZGVEaWFsb2coKTtcbiAgICAgICAgICAgIGxldCBjaGFpbmUgPSAnJztcbiAgICAgICAgICAgIGZyb3plblBvaW50cy52YWx1ZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY2hhaW5lID0gY2hhaW5lICsgZWxlbWVudC5pZCArICcsJztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBmaWx0ZXJlZFBvaW50cy52YWx1ZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY2hhaW5lID0gY2hhaW5lICsgZWxlbWVudC5pZCArICcsJztcblxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNoYWluZS5zbGljZSgwLCAtMSlcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZldGNoKCcvYWRtaW4vZXhjZWwvZXhwb3J0LycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5lOiBjaGFpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uX2lkOiBvcGVyYXRpb25JRC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpLnRoZW4oZGF0YSA9PiB3aW5kb3cub3BlbihVUkwuY3JlYXRlT2JqZWN0VVJMKGRhdGEpKSlcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgZXhjZWxcIik7XG4gICAgICAgICAgICAgfSAgIFxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2VuZEV4Y2VsQ3Jvbigpe1xuICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2goJy9hZG1pbi9leGNlbC9leHBvcnRDcm9uLycrcHJvcHMucGFyYW0ub3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnRXhwb3J0IGVuIGNvdXJzJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgZXhjZWxcIik7XG4gICAgICAgICAgICAgfSAgIFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlzdGFuY2VVcGRhdGUgPSAocG9pbnQsIGRpc3RhbmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBwb2ludCk7XG4gICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5vcGVyYXRpb24gPSBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0ub3BlcnRhaW9uLmlkO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LnBvaW50ID0gcG9pbnQ7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUuZGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5kYXRlID0gMDtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5hZ2VudCA9IHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5hZ2VudC5pZDs7XG4gICAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NyZW5lYXUtdG9VcGRhdGUnLCBkYXRhQ3JlbmVhdSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYXJ0ZVVwZGF0ZSA9IChwb2ludCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gcG9pbnQpO1xuICAgICAgICAgICAgICAgIGRhdGFDYXJ0ZS5jbHVzdGVySWQgPSBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uY2x1c3RlcjU7XG4gICAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NhcnRlLXRvVXBkYXRlJywgZGF0YUNhcnRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsVXBkYXRlID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3JlY3Vub21icmUnK2RhdGEpO1xuICAgICAgICAgICAgICAgdmFsdWUudmFsdWUgPSBNYXRoLnJvdW5kKGRhdGEqMTAwIC8gdG90YWwudmFsdWUpO1xuICAgICAgICAgICAgICAgbm9tYnJlLnZhbHVlID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZnVuY3Rpb24gc2VsZWN0ZWRQb2ludHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHBvaW50cy52YWx1ZS5maWx0ZXIocG9pbnQgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhwb2ludC5zZWxlY3RlZCk7XG4gICAgICAgICAgICByZXR1cm4gKHBvaW50LnNlbGVjdGVkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBzZWFyY2hEYXRlQ3JlbmVhdShpZCkge1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LnBvaW50ID0gaWQ7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUuZGlzdGFuY2UgPSAncmVzZXQnO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LmRhdGUgPSBmb3JtYXREYXRlKGRhdGUudmFsdWUpO1xuICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS10b1VwZGF0ZScsIGRhdGFDcmVuZWF1KTtcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkxhIGRhdGUgYSDDqXTDqSBzw6lsZWN0aW9ubsOpZSA6XCIsIGZvcm1hdERhdGUoZGF0ZS52YWx1ZSkpO1xuXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGVUb0Zvcm1hdCl7XG4gICAgICAgICAgaWYgKCFkYXRlVG9Gb3JtYXQpIHJldHVybiAnJztcbiAgICAgICAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZVRvRm9ybWF0LmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlVG9Gb3JtYXQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7IC8vIExlcyBtb2lzIHNvbnQgaW5kZXjDqXMgw6AgcGFydGlyIGRlIDBcbiAgICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZVRvRm9ybWF0LmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvbkNoYW5nZU1pc3Npb24oKXtcbiAgICAgICAgICAgIGlmIChzZWFyY2hNaXNzaW9uLnZhbHVlICYmIHNlYXJjaE1pc3Npb24udmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICBtaXNzaW9uSUQudmFsdWUgPSBzZWFyY2hNaXNzaW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgZmV0Y2hQb2ludHNNaXNzaW9uKG1pc3Npb25JRC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbkRyb3AgPSBhc3luYyhldnQsIGxpc3QpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtSUQgPSBldnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ2l0ZW1JRCcpXG4gICAgICAgICAgY29uc3QgYWdlbnRJRCA9IGV2dC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgnYWdlbnRJRCcpXG4gICAgICAgICAgY29uc3QgdG90YWxDcmVuZWF1ID0gZXZ0LmRhdGFUcmFuc2Zlci5nZXREYXRhKCd0b3RhbENyZW5lYXUnKVxuICAgICAgICAgIGlmKHRvdGFsQ3JlbmVhdSA+PTMwKXtcbiAgICAgICAgICAgIGlmICghd2luZG93LmNvbmZpcm0oXCJBdHRlbnRpb24sIG1heCAzMCBwYXIgY3LDqW5lYXUgaG9yYWlyZSA6IHNvdWhhaXRleiB2b3VzIGNvbmZpcm1lciA/XCIpKXtyZXR1cm47fVxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgY29uZmlybSA9IDA7XG4gICAgICAgICAgc2VsZWN0ZWQgPSAnXCJzZWxlY3RlZFwiIDogWyc7XG4gICAgICAgICAgaWYoZnJvemVuUG9pbnRzLnZhbHVlLmxlbmd0aCA9PSAwKXthbGVydCgnTWVyY2kgZGUgc8OpbGVjdGlvbm5lciBhdSBtb2lucyB1biBwb2ludCcpO3JldHVybjt9XG4gICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWQgKyBlbGVtZW50LmlkICsgXCIsXCI7XG4gICAgICAgICAgICBpZihlbGVtZW50LmFnZW50LmlkICE9IGFnZW50SUQpe2NvbmZpcm0gPSAxO31cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkLnNsaWNlKDAsIC0xKSArICddJztcbiAgICAgICAgICBzZWxlY3RlZCA9ICd7XCJpZFwiOicrIGl0ZW1JRCArICcsJyArIHNlbGVjdGVkICsnfSc7XG4gICAgICAgICAgaWYoY29uZmlybSA9PSAxKXtcbiAgICAgICAgICAgIGlmICghd2luZG93LmNvbmZpcm0oXCJBdHRlbnRpb24sIGFnZW50cyBkaWZmw6lyZW50cyA6IHNvdWhhaXRleiB2b3VzIGNvbmZpcm1lciA/XCIpKXtyZXR1cm47fVxuICAgICAgICAgIH1cbiAgICAgICAgICAvL2NvbnNvbGUubG9nKCdzZWxlY3RlZCcgKyBzZWxlY3RlZCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW52b3llciBsZXMgbW9kaWZpY2F0aW9ucyDDoCBsJ0FQSSBTeW1mb255XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvcG9pbnRzL2NyZW5lYXUvdXBkYXRlL2AsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgcsOpc2VhdSB1cGRhdGUgY2VyZW5hdSA6XCIsIGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciByw6lzZWF1IHVwZGF0ZSBjcmVuYXVcIik7XG4gICAgICAgICAgICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL3NlY3VyaXTDqSBtZXJjdXJlIGRvd25cbiAgICAgICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBnZXRJbmZvcyhlbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIC8vYnVzLmVtaXQoJ2NyZW5lYXUtdXBkYXRlZCcsICcnKTtcbiAgICAgICAgICAgIC8vcmVzZXQgZGVzIGZyb3plblxuICAgICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZT1bXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRFdGF0ID0gYXN5bmMoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9wb2ludHMvdXBkYXRlVjIvJytpZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YXQ6IGV0YXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnTW9kaWZpY2F0aW9uIGVudm95w6llIMOgIFN5bWZvbnkuIEF0dGVudGUgZGUgbGEgbWlzZSDDoCBqb3VyIE1lcmN1cmUuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdGaWNoZSBtaXNlIMOgIGpvdXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0luZm8nLCBkZXRhaWw6IG1lc3NhZ2V1ci52YWx1ZSwgbGlmZTogMzAwMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJvZHVjdC5pc0VkaXRpbmcgPSBmYWxzZTsgLy8gU29ydGlyIGR1IG1vZGUgw6lkaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3BvaW50cy52YWx1ZVtwb2ludEluZGV4XSA9IHByb2R1Y3QudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoXCJFcnJldXIgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGR1IHByb2R1aXQ6XCIsIGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkZSBsYSBmaWNoZSA6ICcrYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0luZm8nLCBkZXRhaWw6IG1lc3NhZ2V1ci52YWx1ZSwgbGlmZTogMzAwMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciByw6lzZWF1IGxvcnMgZGUgbGEgc2F1dmVnYXJkZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2V0SW5mb3MoaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2VuZEZhaXQoZXRhdF9pZCkge1xuICAgICAgICAgIGV0YXQudmFsdWU9IGV0YXRfaWQ7XG4gICAgICAgICAgaWYoZnJvemVuUG9pbnRzLnZhbHVlLmxlbmd0aCA9PSAwKXthbGVydCgnTWVyY2kgZGUgc8OpbGVjdGlvbm5lciBhdSBtb2lucyB1biBwb2ludCcpO3JldHVybjt9XG4gICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHNlbmRFdGF0KGVsZW1lbnQuaWQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZT0gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZW5kVGVsID0gYXN5bmMocG9pbnQsIHRlbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKHRlbC5sZW5ndGggPT0gOSl7dGVsID0gJzAnICsgdGVsO31cbiAgICAgICAgICAgICAgICB3aW5kb3cub3BlbigndGVsOicrdGVsLCAnX2JsYW5rJykuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3RlbC8nK3BvaW50LmlkKycvc2VuZCcsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy9zZWN1IG1lcmN1cmUgZG93blxuICAgICAgICAgICAgICAgIGdldEluZm9zKHBvaW50LmlkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyYW50VGVsID0gYXN5bmMocG9pbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3RlbC8nK3BvaW50LmlkKycvZW50cmFudCcsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ1RlbCBlbnRyYW50IGVucmVnaXN0csOpJztcbiAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgIC8vc2VjdSBtZXJjdXJlIGRvd25cbiAgICAgICAgICAgICAgICBnZXRJbmZvcyhwb2ludC5pZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZW5kU01TID0gYXN5bmMocG9pbnQsIHRlbCwgbWVzc2FnZUlEKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYodGVsLmxlbmd0aCA9PSA5KXt0ZWwgPSAnMCcgKyB0ZWw7fVxuICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gbWVzc2FnZXMudmFsdWUuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5pZCA9PT0gbWVzc2FnZUlEXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2V0ZW1wLnZhbHVlID0gbWVzc2FnZS52YWx1ZVswXS50ZXh0ZS5yZXBsYWNlKFwiTk9NXCIsIHBvaW50LmNpdmlsaXRlKycgJytwb2ludC5ub20pO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2V0ZW1wLnZhbHVlID0gbWVzc2FnZXRlbXAudmFsdWUucmVwbGFjZShcIkFEUkVTU0VcIiwgcG9pbnQubnVtZXJvUnVlKycgJysgcG9pbnQudGl0cmVSdWUrJyAnK3BvaW50Lm5vbVJ1ZSsnICcrcG9pbnQuY29kZVBvc3RhbCsnICcrcG9pbnQudmlsbGUpO1xuICAgICAgICAgICAgICAgIGxldCBsaWVuID0gICdodHRwczovLycrd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKycvZWFlL2Nvbm5lY3QvJytvcGVyYXRpb25JRC52YWx1ZSsnLycrcG9pbnQuaWQ7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXRlbXAudmFsdWUgPSBtZXNzYWdldGVtcC52YWx1ZS5yZXBsYWNlKFwiTElFTlwiLCBsaWVuKTtcbiAgICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1KXtcbiAgICAgICAgICAgICAgICAgICAgaWYocG9pbnQuY3JlbmVhdS5kYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V0ZW1wLnZhbHVlID0gbWVzc2FnZXRlbXAudmFsdWUucmVwbGFjZShcIkRBVEVcIiwgcG9pbnQuY3JlbmVhdS5kYXRlKycgJysgcG9pbnQuY3JlbmVhdS5jcmVuZWF1SG9yYWlyZS5ub20gKycgQWdlbnQgOiAnK3BvaW50LmNyZW5lYXUuYWdlbnQubm9tKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZW5jb2RlZFRleHQgPSBlbmNvZGVVUklDb21wb25lbnQobWVzc2FnZXRlbXAudmFsdWUpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFzdHVjZSBwb3VyIGNvbXBhdGliaWxpdMOpIGlPUyB2cyBBbmRyb2lkXG4gICAgICAgICAgICAgICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHZhciBpc2lPUyA9IC9pcGhvbmV8aXBhZHxpcG9kLy50ZXN0KHVhKTtcbiAgICAgICAgICAgICAgICB2YXIgc2VwYXJhdG9yID0gaXNpT1MgPyAnJicgOiAnPyc7XG5cbiAgICAgICAgICAgICAgICB3aW5kb3cub3Blbignc21zOicgKyB0ZWwgKyBzZXBhcmF0b3IgKyAnYm9keT0nICsgZW5jb2RlZFRleHQsICdfYmxhbmsnKS5mb2N1cygpO1xuXG4gICAgICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvc21zLycrcG9pbnQuaWQrJy8nK21lc3NhZ2UudmFsdWVbMF0uaWQrJy9zZW5kJywge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vc2VjdSBtZXJjdXJlIGRvd25cbiAgICAgICAgICAgICAgICBnZXRJbmZvcyhwb2ludC5pZCk7XG4gICAgICAgICAgICAgICAvLyBtZXNzYWdldXI9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRFbWFpbCA9IGFzeW5jKGlkLCBtZXNzYWdlX0lEKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFpbC8nK2lkKycvJyttZXNzYWdlX0lEKycvbWFpbHNlbmQnLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge21lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIGVudm9pIG1haWxcIjt9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IGRhdGEuZGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciByw6lzZWF1XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vc2VjdSBtZXJjdXJlIGRvd25cbiAgICAgICAgICAgICAgICBnZXRJbmZvcyhpZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWxldGVfbG9nPSBhc3luYyhpZCkgPT4ge1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvbG9nL2RlbGV0ZS8nK2lkLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge21lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIGVudm9pIGRlbGV0ZVwiO31cbiAgICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ2RlbGV0ZSBvaydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIHLDqXNlYXVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJldXIgcsOpc2VhdVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3NlY3UgbWVyY3VyZSBkb3duXG4gICAgICAgICAgICAgICAgZ2V0SW5mb3MoaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93Q2xhc3MgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7ICdjdXN0b20tZnJvemVuLXJvdyc6IGRhdGEuZnJvemVuIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2hlY2tUZWwgPSAodGVsKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghdGVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gL14oNnwwNnw3fDA3KS87IFxuICAgICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdChTdHJpbmcodGVsKSk7XG4gICAgICAgIH1cblxuLy9sZXMgcG9pbnRzIHPDqWxlY3Rpb25uw6lzXG5cbi8vRVZFTlQgSU5URVJGQUNFICBcblxuICAgICAgICBjb25zdCBpc0FsbFNlbGVjdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbHRlcmVkUG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgLy8gT24gdsOpcmlmaWUgc2kgY2hhcXVlIHByb2R1aXQgZGUgbGEgbGlzdGUgYSBzYSBjbMOpIMOgICd0cnVlJyBkYW5zIGwnb2JqZXQgZGUgc8OpbGVjdGlvblxuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkUG9pbnRzLnZhbHVlLmV2ZXJ5KHAgPT4gc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZVtwLmlkXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRvZ2dsZUFsbCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJlZFBvaW50cy52YWx1ZS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgICAgIGFsZXJ0KFwiSW1wb3NzaWJsZSBkZSB0b3V0IHPDqWxlY3Rpb25uZXIgOiB0cm9wIGRlIHLDqXN1bHRhdHMgKD4xMCkuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0FsbFNlbGVjdGVkLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZSA9IHt9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5vbiAtPiBvbiBjb25zdHJ1aXQgdW4gb2JqZXQgYXZlYyB0b3VzIGxlcyBJRHMgKFPDqWxlY3Rpb24gdG90YWxlKVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHt9O1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkUG9pbnRzLnZhbHVlLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1NlbGVjdGlvbltwLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZSA9IG5ld1NlbGVjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0b2dnbGVSb3cgPSAocHJvZHVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBwcm9kdWN0LmlkO1xuICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9ICEhc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZVtpZF07XG5cbiAgICAgICAgICAgIC8vIENyw6lhdGlvbiBkJ3VuZSBjb3BpZSBwb3VyIGxhIHLDqWFjdGl2aXTDqVxuICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0geyAuLi5zZWxlY3RlZFByb2R1Y3RzLnZhbHVlIH07XG5cbiAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld1NlbGVjdGlvbltpZF07IC8vIE9uIHJldGlyZSBsYSBjbMOpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1NlbGVjdGlvbltpZF0gPSB0cnVlOyAvLyBPbiBham91dGUgbGEgY2zDqVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlID0gbmV3U2VsZWN0aW9uO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIDEuIExlcyDDqWzDqW1lbnRzIGZpZ8OpcyAoY2V1eCBzw6lsZWN0aW9ubsOpcylcbiAgICAgICAgY29uc3QgZnJvemVuUG9pbnRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkUG9pbnRzLnZhbHVlLmZpbHRlcihwID0+IHNlbGVjdGVkUHJvZHVjdHMudmFsdWVbcC5pZF0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyAyLiBMZXMgw6lsw6ltZW50cyByZXN0YW50cyAoY2V1eCBOT04gc8OpbGVjdGlvbm7DqXMpXG4gICAgICAgIGNvbnN0IHVuc2VsZWN0ZWRQb2ludHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRQb2ludHMudmFsdWUuZmlsdGVyKHAgPT4gIXNlbGVjdGVkUHJvZHVjdHMudmFsdWVbcC5pZF0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBvblJvd0V4cGFuZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgZXhwYW5kZWRSb3dzLnZhbHVlID0geyBbZXZlbnQuZGF0YS5pZF06IHRydWUgfTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2RlcGxveSBpZCcgKyBldmVudC5kYXRhLmlkKVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGVkaXRQcm9kdWN0ID0gKHByb2QpID0+IHtcbiAgICAgICAgICAgIHByb2R1Y3QudmFsdWUgPSB7Li4ucHJvZH07XG4gICAgICAgICAgICBwcm9kdWN0RGlhbG9nLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXhwb3J0RXhjZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICBleGNlbERpYWxvZy52YWx1ZSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhpZGVEaWFsb2cgPSAoKSA9PiB7XG4gICAgICAgICAgICBleGNlbERpYWxvZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgcHJvZHVjdERpYWxvZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgc3VibWl0dGVkLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGV2ZW50U291cmNlID0gbnVsbDtcbiAgICAgICAgY29uc3QgaHViVXJsID0gXCJodHRwczovL21lcmN1cmUuZWFlLWNvbm5lY3QuY29tLy53ZWxsLWtub3duL21lcmN1cmVcIjtcbiAgICAgICAgXG4gICAgICAgIC8vY29uc3QgeyBzdGF0dXMsIGRhdGFNLCBlcnJvciB9ID0gdXNlRXZlbnRTb3VyY2UodXJsLnRvU3RyaW5nKCksIFsnY2FydGUnXSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBjb25uZWN0VG9NZXJjdXJlID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnZGVidXRjb25uZWN0JylcbiAgICAgICAgICAgIC8vIDEuIEZlcm1lciBsJ2FuY2llbm5lIGNvbm5leGlvbiBzaSBlbGxlIGV4aXN0ZSBwb3VyIMOpdml0ZXIgbGVzIGRvdWJsb25zXG4gICAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNvbm5leGlvbiBhdSBIdWIgZmVybcOpZSAhXCIpO1xuICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGh1YlVybCk7XG4gICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcInRvcGljXCIsIFwiL2NhcnRlXCIpO1xuICAgICAgICAgICAgY29uc3QgdG9waWMgPSBcIi9jYXJ0ZVwiO1xuXG4gICAgICAgICAgICBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBoYW5kbGVNZXJjdXJlTWVzc2FnZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignY2FydGUnLCBoYW5kbGVNZXJjdXJlTWVzc2FnZSk7XG4gICAgICAgIFxuICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgRXZlbnRTb3VyY2UgKGTDqWNvbm5leGlvbikgOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gMi4gVsOpcmlmaWVyIGwnw6l0YXQgZGUgbGEgY29ubmV4aW9uXG4gICAgICAgICAgICAgICAgLy8gcmVhZHlTdGF0ZSAyIHNpZ25pZmllIHF1ZSBsYSBjb25uZXhpb24gZXN0IGTDqWZpbml0aXZlbWVudCBmZXJtw6llXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlLnJlYWR5U3RhdGUgPT09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRlbnRhdGl2ZSBkZSByZWNvbm5leGlvbiBkYW5zIDMgc2Vjb25kZXMuLi5cIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyAzLiBUZW50ZXIgdW5lIHJlY29ubmV4aW9uIGFwcsOocyB1biBkw6lsYWlcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0VG9NZXJjdXJlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDMwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGV2ZW50U291cmNlLm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNvbm5leGlvbiBhdSBIdWIgTWVyY3VyZSByw6l1c3NpZSAhXCIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICBvbk1vdW50ZWQoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RUb01lcmN1cmUoKTtcblxuICAgICAgICAgICAgICAgICAgICBtb2lzLnZhbHVlID0gcHJvcHMucGFyYW0ubW9pcztcbiAgICAgICAgICAgICAgICAgICAgdG90YWwudmFsdWUgPSBwcm9wcy5wYXJhbS50b3RhbDtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlLnZhbHVlID0gcHJvcHMucGFyYW0uc3RhcnREYXRlO1xuICAgICAgICAgICAgICAgICAgICBub21icmUudmFsdWUgPSBwcm9wcy5wYXJhbS5ub21icmU7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsLnZhbHVlID0gcHJvcHMucGFyYW0udG90YWw7XG4gICAgICAgICAgICAgICAgICAgIHBvdXJjZW50LnZhbHVlID0gTWF0aC5yb3VuZChwcm9wcy5wYXJhbS5ub21icmUqMTAwIC8gcHJvcHMucGFyYW0udG90YWwpO1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25JRC52YWx1ZSA9IHByb3BzLnBhcmFtLm9wZXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgbWlzc2lvbklELnZhbHVlID0gcHJvcHMucGFyYW0ubWlzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoTWlzc2lvbi52YWx1ZSA9IG1pc3Npb25JRC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgY2x1c3RlcklELnZhbHVlID0gcHJvcHMucGFyYW0uY2x1c3RlcklkO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlU01TLnZhbHVlID0gcHJvcHMucGFyYW0ubWVzc2FnZVNNUztcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVhZ2VudHMudmFsdWUgPSBwcm9wcy5wYXJhbS5hZ2VudHM7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbWlzc2lvbnMudmFsdWUgPSBwcm9wcy5wYXJhbS5taXNzaW9ucztcbiAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UudmFsdWUgPSBwcm9wcy5wYXJhbS5kaXN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgZXRhdHMudmFsdWUgPSBwcm9wcy5wYXJhbS5ldGF0cztcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMudmFsdWUgPSBwcm9wcy5wYXJhbS5tZXNzYWdlcztcbiAgICAgICAgICAgICAgICAgICAgcmVzdHJlaW50LnZhbHVlID0gcHJvcHMucGFyYW0ucmVzdHJlaW50O1xuICAgICAgICAgICAgICAgICAgICBidXMub24oJ2NsdXN0ZXItc2VsZWN0ZWQnLCB1cGRhdGVDbHVzdGVyKTtcblxuICAgICAgICAgICAgICAgICAgICBmZXRjaFBvaW50c01pc3Npb24obWlzc2lvbklELnZhbHVlKTtcblxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcblxuICAgICAgICAgICAgYnVzLm9mZignY2x1c3Rlci1zZWxlY3RlZCcsIHVwZGF0ZUNsdXN0ZXIpO1xuICAgICAgICAgICAgcG9pbnRzLnZhbHVlID0gW11cbiAgICAgICAgICAgIGZpbHRlcmVkUG9pbnRzID0gW11cbiAgICAgICAgICAgIGlmIChvYnNlcnZlcikgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk1lcmN1cmUgRXZlbnRTb3VyY2UgY2xvc2VkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvLyBvbkJlZm9yZVVubW91bnQgZXN0IGFwcGVsw6kganVzdGUgYXZhbnQgcXVlIGxlIGNvbXBvc2FudCBuZSBzb2l0IHJldGlyw6kgZHUgRE9NLlxuICAgICAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgICAgIGJ1cy5vZmYoJ2NsdXN0ZXItc2VsZWN0ZWQnKTtcbiAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbi8vPFNlYXJjaCB2LWlmPVwicGFyYW1cIiA6cGFyYW09XCJwYXJhbVwiLz5cbjwvc2NyaXB0PlxuPHRlbXBsYXRlPlxuICAgICAgICA8ZGl2IGlkPVwicG9pbnRzXCIgQGRyb3A9XCJvbkRyb3AoJGV2ZW50LCAxKVwiIEBkcmFnb3Zlci5wcmV2ZW50IEBkcmFnZW50ZXIucHJldmVudCBzdHlsZT1cImhlaWdodDogY2FsYygxMDB2aCAtIDUwMHB4KTtcIj5cbiAgICAgICAgICAgIDxEYXRhVGFibGUgXG4gICAgICAgICAgICA6dmFsdWU9XCJmaWx0ZXJlZFBvaW50c1wiIFxuICAgICAgICAgICAgdi1tb2RlbDpleHBhbmRlZFJvd3M9XCJleHBhbmRlZFJvd3NcIiBcbiAgICAgICAgICAgIEByb3dFeHBhbmQ9XCJvblJvd0V4cGFuZFwiXG4gICAgICAgICAgICBzY3JvbGxhYmxlIFxuICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0PVwiZmxleFwiXG4gICAgICAgICAgICBwYWdpbmF0b3IgOnJvd3M9XCIxMDBcIiBcbiAgICAgICAgICAgIGRhdGFLZXk9XCJpZFwiIFxuICAgICAgICAgICAgZmlsdGVyRGlzcGxheT1cInJvd1wiIFxuICAgICAgICAgICAgOmxvYWRpbmc9XCJsb2FkaW5nXCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICA6cm93LWNsYXNzPVwicm93Q2xhc3NcIiBcbiAgICAgICAgICAgIDpjbGFzcz1cInsgJ2hpZGUtc2VsZWN0LWFsbCc6IGZpbHRlcmVkUG9pbnRzLmxlbmd0aCA+IDEwIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1maWx0ZXItc2xhc2hcIiBsYWJlbD1cIkNsZWFyIEZpbHRyZVwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIEBjbGljaz1cImNsZWFyRmlsdGVyKClcIiBzdHlsZT1cImhlaWdodDo0MHB4O1wiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJtaXNzaW9uLWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hNaXNzaW9uXCIgQGNoYW5nZT1cIm9uQ2hhbmdlTWlzc2lvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cIm1pc3Npb24gaW4gbGlzdGVtaXNzaW9uc1wiIDprZXk9XCJtaXNzaW9uLmlkXCIgOnZhbHVlPVwibWlzc2lvbi5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtaXNzaW9uLm5vbSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiaGVhZGVyLWFwcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6IDYyMHB4O2NvbG9yOiMwMDA7XCI+PHRib2R5Pjx0cj48dGQgc3R5bGU9XCJ3aWR0aDogMTUwcHg7XCI+e3sgbm9tYnJlIH19IC8ge3sgdG90YWwgfX0gcG9pbnRzJm5ic3A7Jm5ic3A7PC90ZD48dGQgc3R5bGU9XCJ3aWR0aDogNDAwcHg7XCI+PFByb2dyZXNzQmFyIDp2YWx1ZT1cInBvdXJjZW50XCI+e3twb3VyY2VudH19JTwvUHJvZ3Jlc3NCYXI+PC90ZD48dGQgc3R5bGU9XCJ3aWR0aDogMTIwcHg7dGV4dC1hbGlnbjpyaWdodFwiPiZuYnNwO3t7IGNvdW50IH19IHLDqXN1bHRhdHM8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PiBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVuZCBwYi00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBpY29uPVwicGkgcGktZXh0ZXJuYWwtbGlua1wiIGxhYmVsPVwiTWFycXVlciBJbmYgbWVudGlvblwiIEBjbGljaz1cInNlbmRGYWl0KDMpXCIgLz4mbmJzcDsmbmJzcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIGljb249XCJwaSBwaS1leHRlcm5hbC1saW5rXCIgbGFiZWw9XCJNYXJxdWVyIEZhaXRcIiBAY2xpY2s9XCJzZW5kRmFpdCg3KVwiIC8+Jm5ic3A7Jm5ic3A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBpY29uPVwicGkgcGktZXh0ZXJuYWwtbGlua1wiIGxhYmVsPVwiRXhwb3J0XCIgQGNsaWNrPVwiZXhwb3J0RXhjZWwoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2VtcHR5PiBQYXMgZGUgcG9pbnQgdHJvdXbDqSBvdSBhdXRyZSBtaXNzaW9uLiA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjbG9hZGluZz4gTG9hZGluZyAuIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImlkXCIgaGVhZGVyPVwiSURcIiAvPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZXhwYW5kZXIgc3R5bGU9XCJ3aWR0aDogMjBweFwiIC8+XG4gICAgICAgICAgICAgICAgPENvbHVtbj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljay5zdG9wPVwidG9nZ2xlQWxsXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC13cmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7ICdkaXNhYmxlZC13cmFwcGVyJzogZmlsdGVyZWRQb2ludHMubGVuZ3RoID4gMTAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJUb3V0IHPDqWxlY3Rpb25uZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGVja2JveCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1vZGVsVmFsdWU9XCJpc0FsbFNlbGVjdGVkXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpiaW5hcnk9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImZpbHRlcmVkUG9pbnRzLmxlbmd0aCA+IDEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTtcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljay5zdG9wPVwidG9nZ2xlUm93KGRhdGEpXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC13cmFwcGVyXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGVja2JveCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1vZGVsVmFsdWU9XCIhIXNlbGVjdGVkUHJvZHVjdHNbZGF0YS5pZF1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJpbmFyeT1cInRydWVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTtcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVscz1cIm5vbVwiIHN0eWxlPVwibWluLXdpZHRoOiAxMnJlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVwieyAnZm9udC1ibHVlJzogc2VsZWN0ZWRUYWJbZGF0YS5pZF0gPT0gdHJ1ZSB9XCI+e3sgZGF0YS5jaXZpbGl0ZSB9fSB7eyBkYXRhLm5vbSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IHYtbW9kZWw9XCJzZWFyY2hOb21cIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiTm9tXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gICAgICBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwiYWxlcnRlXCIgc3R5bGU9XCJtaW4td2lkdGg6IDNyZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUb2dnbGVTd2l0Y2ggdi1tb2RlbD1cImRhdGEuYWxlcnRlXCIgQGNoYW5nZT1cImNoYW5nZV9hbGVydGUoZGF0YSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZXRhdC1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoQWxlcnRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXNcIj5Ub3VzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInRydWVcIj5PdWk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZmFsc2VcIj5Ob248L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibnVtZXJvQ2xpZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5udW1lcm9DbGllbnQgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IHYtbW9kZWw9XCJzZWFyY2hOdW1lcm9DbGllbnRcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiTsKwIGNsaWVudFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+ICAgXG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm51bWVyb1BoeXNpcXVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5udW1lcm9QaHlzaXF1ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgdi1tb2RlbD1cInNlYXJjaE51bWVyb1BoeXNpcXVlXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk7CsCBwaHlzXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVscz1cInRlbDBcIiBzdHlsZT1cIm1pbi13aWR0aDogODBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG50ZWwyXCIgQGNsaWNrPVwiZW50cmFudFRlbChkYXRhKVwiPjxzcGFuIGNsYXNzPVwicGkgcGktcGhvbmVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj48L2J1dHRvbj48YnI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICBFbnRyYW50XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVscz1cInRlbFwiIHN0eWxlPVwibWluLXdpZHRoOiA4MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS50ZWwxXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mbyBidG50ZWxcIiBAY2xpY2s9XCJzZW5kVGVsKGRhdGEsZGF0YS50ZWwxKVwiPjxzcGFuIGNsYXNzPVwicGkgcGktcGhvbmVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj4mbmJzcDtURUwge3sgZGF0YS50ZWwxIH19PC9idXR0b24+PC9zcGFuPjxicj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEudGVsMlwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm8gYnRudGVsXCIgQGNsaWNrPVwic2VuZFRlbChkYXRhLGRhdGEudGVsMilcIj48c3BhbiBjbGFzcz1cInBpIHBpLXBob25lXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj48L3NwYW4+Jm5ic3A7VEVMIHt7IGRhdGEudGVsMiB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IHYtbW9kZWw9XCJzZWFyY2hUZWxcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiVGVsXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uICBmaWVsZD1cImV0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEuZXRhdCAmJiBkYXRhLmV0YXQuaWRcIiA6c3R5bGU9XCJ7IFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMnB4IDhweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6ICcxcHggc29saWQgI2NjYycsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICcxNjBweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNmZmYnLCAvKiBDb3VsZXVyIGRlIHRleHRlIGJsYW5jaGUgcG91ciB1biBtZWlsbGV1ciBjb250cmFzdGUgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogZGF0YS5ldGF0LmNvdWxldXJcbiAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLmV0YXQubm9tIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJldGF0LWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hFdGF0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXNcIj5Ub3VzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cImV0YXQgaW4gZXRhdHNcIiA6a2V5PVwiZXRhdFwiIDp2YWx1ZT1cImV0YXQuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXRhdC5ub20gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJlbXBsYWNlbWVudENvbXB0ZXVyXCIgc3R5bGU9XCJtaW4td2lkdGg6IDEwMHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuZW1wbGFjZW1lbnRDb21wdGV1ciB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImxpYmVsbGUtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaEVtcGxhY2VtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91c1wiPlRvdXMgbGVzIGVtcGxhYy48L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJlbXBsYWNlbWVudCBpbiBlbXBsYWNlbWVudHNcIiA6a2V5PVwiZW1wbGFjZW1lbnRcIiA6dmFsdWU9XCJlbXBsYWNlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVtcGxhY2VtZW50ICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJtb2R1bGVTZXVsXCIgc3R5bGU9XCJtaW4td2lkdGg6IDEwMHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLm1vZHVsZVNldWxcIj5Nb2R1bGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiIWRhdGEubW9kdWxlU2V1bFwiPkNvbXB0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIHN0eWxlPVwid2lkdGg6IDQwcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwic2xvdFByb3BzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGljb249XCJwaSBwaS1wZW5jaWxcIiB2YXJpYW50PVwib3V0bGluZWRcIiByb3VuZGVkIGNsYXNzPVwibXItMlwiIEBjbGljaz1cImRpc3RhbmNlVXBkYXRlKHNsb3RQcm9wcy5kYXRhLmlkLCBkaXN0YW5jZSlcIj57e2Rpc3RhbmNlfX1tPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm5vbVJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEubnVtZXJvUnVlIH19IHt7IGRhdGEudGl0cmVSdWUgIH19IHt7IGRhdGEubm9tUnVlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwibm9tUnVlLWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hOb21SdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3V0ZXNcIj5Ub3V0ZXMgbGVzIHJ1ZXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJydWUgaW4gcnVlc1wiIDprZXk9XCJydWVcIiA6dmFsdWU9XCJydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBydWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwidmlsbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLmNvZGVQb3N0YWwgfX0ge3sgZGF0YS52aWxsZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJ2aWxsZS1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoVmlsbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91dGVzXCI+VG91dGVzIHZpbGxlczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJ2aWxsZSBpbiB2aWxsZXNcIiA6a2V5PVwidmlsbGVcIiA6dmFsdWU9XCJ2aWxsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2aWxsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImFnZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEuYWdlbnRcIj57eyBkYXRhLmFnZW50Lm5vbSB9fSA8c3BhbiB2LWlmPVwiZGF0YS5hZ2VudC5wcmVub21cIj57eyBkYXRhLmFnZW50LnByZW5vbSB9fTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImFnZW50LWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hBZ2VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3VzXCI+VG91cyBhZ2VudHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwiYWdlbnQgaW4gYWdlbnRzXCIgOmtleT1cImFnZW50XCIgOnZhbHVlPVwiYWdlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWdlbnQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJXZWJcIiBzdHlsZT1cIndpZHRoOiAxNXB4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS53ZWJcIj48ZGl2IGNsYXNzPVwiZG90XCI+PHNwYW4+PHNwYW4+PC9zcGFuPjwvc3Bhbj48L2Rpdj48L3NwYW4+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+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L0RpYWxvZz5cbiAgICAgICAgPERpYWxvZyB2LW1vZGVsOnZpc2libGU9XCJleGNlbERpYWxvZ1wiIDpzdHlsZT1cInsgd2lkdGg6ICc0NTBweCcgfVwiIGhlYWRlcj1cIkV4cG9ydCBFeGNlbFwiIDptb2RhbD1cInRydWVcIj5cbiAgICAgICAgICAgIDxwPlZvdXMgcG91dmV6IGNyw6llciB1biByYXBwb3J0IHBhcnRpZWwgbGltaXTDqSDDoCA1MDAgbGlnbmVzIMOgIHBhcnRpciBkZSB2b3MgY3JpdMOocmVzLjwvcD5cbiAgICAgICAgICAgIDxwIHYtaWY9XCJyZXN0cmVpbnQgPT0gMFwiPk91IGxhbmNlciB1biBleHBvcnQgY29tcGxldCBkZSBsYSBtaXNzaW9uIChlbnZvaSBwYXIgbWFpbCk8L3A+XG4gICAgICAgICAgICA8dGVtcGxhdGUgI2Zvb3Rlcj5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiQW5udWxlclwiIGljb249XCJwaSBwaS10aW1lc1wiIHRleHQgQGNsaWNrPVwiaGlkZURpYWxvZ1wiIC8+XG4gICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJyZXN0cmVpbnQgPT0gMFwiPjxCdXR0b24gbGFiZWw9XCJFeHBvcnQgY29tcGxldFwiIGljb249XCJwaSBwaS1jaGVja1wiIEBjbGljaz1cInNlbmRFeGNlbENyb24oKVwiIC8+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJFeHBvcnRlciBtYSBzw6lsZWN0aW9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgQGNsaWNrPVwic2VuZEV4Y2VsKClcIiAvPlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9EaWFsb2c+XG48L3RlbXBsYXRlPlxuPHN0eWxlPlxuOmRlZXAodHIubXktY3VzdG9tLWhpZ2hsaWdodCkge1xuICAgIC8qYmFja2dyb3VuZDogI2ZjZDlhNSAhaW1wb3J0YW50OyovXG4gICAgLypmb250LXdlaWdodDogYm9sZDsqL1xufVxuLnAtZGF0YXRhYmxlLXRoZWFkID4gdHIgPiB0aCAge1xuICAgIHBhZGRpbmctdG9wOiA0cHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWJvdHRvbTogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1sZWZ0OiA0cHggIWltcG9ydGFudDtcbn1cbi5wLWRhdGF0YWJsZS1oZWFkZXItY2VsbCAgIHtcbiAgICBwYWRkaW5nLXRvcDogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctbGVmdDogNHB4ICFpbXBvcnRhbnQ7XG59XG4ucC1kYXRhdGFibGUtZnJvemVuLXRib2R5ID4gdHIgPiB0ZCB7XG4gIC8qYmFja2dyb3VuZC1jb2xvcjogI2M4ZTNmZSAhaW1wb3J0YW50OyAqL1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6IGJsdWUgIWltcG9ydGFudDtcbn1cbi5kcF9faW5wdXQsIC5kcF9fbWFpbnt3aWR0aDogMjUwcHggIWltcG9ydGFudDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7fVxuI2luZm9zVGFicyB7YmFja2dyb3VuZC1jb2xvcjogZ3JleTtwYWRkaW5nOiA1cHg7fVxuLmluZm9zVGFiIHtoZWlnaHQ6MzAwcHg7IG92ZXJmbG93LXk6IGF1dG87YmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjt9XG5cbi5oaWRlLXNlbGVjdC1hbGwgdGggPiAucC1jaGVja2JveCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5wLXRvZ2dsZXN3aXRjaC1zbGlkZXJbZGF0YS1wPVwiY2hlY2tlZFwiXSB7YmFja2dyb3VuZC1jb2xvcjogcmVkICFpbXBvcnRhbnQ7fVxuXG4uZHJvcGRvd24tY29udGVudCB7YmFja2dyb3VuZC1jb2xvcjogI2ZmZjsgei1pbmRleDogMTAwMCAhaW1wb3J0YW50O31cblxuc2VsZWN0IHttYXgtd2lkdGg6IDEyMHB4O31cbmJ1dHRvbiB7fVxuLmJ0bnRlbCB7d2lkdGg6IDE1MHB4ICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZToxMnB4O2hlaWdodCA6IDIwcHggIWltcG9ydGFudDtwYWRkaW5nOiAycHggIWltcG9ydGFudDt9XG4uYnRudGVsMiB7d2lkdGg6IDQwcHggIWltcG9ydGFudDsgbGluZS1oZWlnaHQ6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtmb250LXNpemU6MTJweDtoZWlnaHQgOiAyMHB4ICFpbXBvcnRhbnQ7cGFkZGluZzogMnB4ICFpbXBvcnRhbnQ7fVxuLmZvbnQtYmx1ZSB7Zm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiByZ2IoMywgMjUzLCA3NCk7fVxuPC9zdHlsZT4iLCI8c2NyaXB0IHNldHVwPlxuXG5pbXBvcnQgeyBjcmVhdGVBcHAsIHJlZiwgb25Nb3VudGVkLCBvblVubW91bnRlZCwgZ2V0Q3VycmVudEluc3RhbmNlLCBjb21wdXRlZCwgd2F0Y2h9ICBmcm9tICd2dWUnO1xuaW1wb3J0IHsgYnVzIH0gZnJvbSAnLi4vYnVzLmpzJzsgXG5pbXBvcnQgTGVhZmxldCBmcm9tICcuL0xlYWZsZXQudnVlJztcbmltcG9ydCBUYWJzIGZyb20gJ3ByaW1ldnVlL3RhYnMnO1xuaW1wb3J0IFRhYkxpc3QgZnJvbSAncHJpbWV2dWUvdGFibGlzdCc7XG5pbXBvcnQgVGFiIGZyb20gJ3ByaW1ldnVlL3RhYic7XG5pbXBvcnQgVGFiUGFuZWxzIGZyb20gJ3ByaW1ldnVlL3RhYnBhbmVscyc7XG5pbXBvcnQgVGFiUGFuZWwgZnJvbSAncHJpbWV2dWUvdGFicGFuZWwnO1xuaW1wb3J0IFRvZ2dsZVN3aXRjaCBmcm9tICdwcmltZXZ1ZS90b2dnbGVzd2l0Y2gnO1xuXG4gICAgICAgIGNvbnN0IGFnZW50cyA9IHJlZihbXSk7IC8vIExhIGxpc3RlIHNlcmEgY2hhcmfDqWUgZXQgbWlzZSDDoCBqb3VyIHZpYSBNZXJjdXJlL0FQSVxuICAgICAgICB2YXIgYWdlbnRzMiA9IHJlZihbXSk7XG4gICAgICAgIGNvbnN0IGRvbm5lZXMgPSBbXTtcbiAgICAgICAgY29uc3QgYWdlbnRzX21haiA9IFtdO1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCBpbml0aWFsQWdlbnRzID0gW107XG4gICAgICAgIGNvbnN0IGRhdGVzVW5pcXVlcyA9IFtdO1xuICAgICAgICBjb25zdCBzZWFyY2hBZ2VudCA9IHJlZignVG91cycpO1xuICAgICAgICBjb25zdCBzaG93Q29tcGxldGVkID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgbG9hZGluZyA9IHJlZih0cnVlKTtcbiAgICAgICAgY29uc3QgcGFyYW0gPSByZWYobnVsbCk7XG4gICAgICAgIGNvbnN0IHBhcmFtTGVhZmxldCA9IHJlZihudWxsKTtcbiAgICAgICAgY29uc3QgYWdlbnRTZWwgPSByZWYobnVsbCk7XG4gICAgICAgIHZhciBwb2ludCA9IDA7XG4gICAgICAgIHZhciBkaXN0YW5jZSA9ICdyZXNldCc7XG4gICAgICAgIHZhciBkYXRlICA9ICcnO1xuICAgICAgICBjb25zdCB0YWJ2YWx1ZSA9IHJlZignMCcpO1xuICAgICAgICBjb25zdCBjaGVja2VkID0gcmVmKHRydWUpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IHJlY2hEaXN0YW5jZSA9IHJlZihmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmF3RGF0YSA9IHJlZihbXSk7XG5cbiAgICAgICAgY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gICAgICAgICAgcGFyYW06ICB7XG4gICAgICAgICAgICB0eXBlOiBPYmplY3QsIFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUgXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHBhcmFtTGVhZmxldC52YWx1ZSA9IHByb3BzLnBhcmFtO1xuXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUNyZW5lYXVzKGRhdGFDcmVuZWF1KXtcbiAgICAgICAgICAgIHBvaW50ID0gZGF0YUNyZW5lYXUucG9pbnQ7XG4gICAgICAgICAgICBkaXN0YW5jZSA9IGRhdGFDcmVuZWF1LmRpc3RhbmNlO1xuICAgICAgICAgICAgZGF0ZSAgPSBkYXRhQ3JlbmVhdS5kYXRlO1xuICAgICAgICAgICAgaWYoZGF0YUNyZW5lYXUuYWdlbnQpe2FnZW50U2VsLnZhbHVlID0gZGF0YUNyZW5lYXUuYWdlbnQ7fVxuICAgICAgICAgICAgdGFidmFsdWUudmFsdWUgPSAnMSc7XG4gICAgICAgICAgICBmZXRjaENyZW5lYXVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmZXRjaENyZW5lYXVzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdmZXRjaCBjcmVuZWF1eCcpXG4gICAgICAgICAgICBzZWFyY2hBZ2VudC52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIGlmKCFwcm9wcy5wYXJhbS5vcGVyYXRpb24pe3JldHVybjt9XG4gICAgICAgICAgICBpZihkaXN0YW5jZSA9PSAncmVzZXQnKXtyZWNoRGlzdGFuY2UudmFsdWUgPSBmYWxzZTt9XG4gICAgICAgICAgICBlbHNle3JlY2hEaXN0YW5jZS52YWx1ZSA9IHRydWU7fVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gJyc7XG4gICAgICAgICAgICAgICAgaWYoZGF0ZS5sZW5ndGggPiAyKXtcbiAgICAgICAgICAgICAgICB1cmwgPSAnL2FwaS9jcmVuZWF1cy8nK3Byb3BzLnBhcmFtLm9wZXJhdGlvbisnLzAvJyArIHBvaW50ICsgJy8nICsgZGlzdGFuY2UgKyAnLycgKyBkYXRlICsgJy8wJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBpZihkaXN0YW5jZSA+MCl7cmVjaERpc3RhbmNlLnZhbHVlID0gdHJ1ZTt9XG4gICAgICAgICAgICAgICAgdXJsID0gJy9hcGkvY3JlbmVhdXMvJytwcm9wcy5wYXJhbS5vcGVyYXRpb24rJy8wLycgKyBwb2ludCArICcvJyArIGRpc3RhbmNlICsgJy8wLzAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsgICAgXG4gICAgICAgICAgICAgICAgcmF3RGF0YS52YWx1ZSA9IGRhdGE7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVkaXJlY3Rpb24gZm9yY8OpZSB2ZXJzIGxhIHBhZ2UgZGUgbG9naW5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICBpZihkYXRhLmxlbmd0aCA+IDMpe2NvdW50LnZhbHVlID0gZmFsc2U7fVxuICAgICAgICAgICAgICAgZWxzZXtjb3VudC52YWx1ZSA9IHRydWU7fVxuXG4gICAgICAgICAgICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgY2hlY2tlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ1VuZSBlcnJldXIgc1xcJ2VzdCBwcm9kdWl0ZSBvdSB2b3VzIMOqdGVzIGTDqWNvbm5lY3TDqScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0YWJ2YWx1ZS52YWx1ZSA9ICcxJztcbiAgICAgICAgICAgIGNoZWNrZWQudmFsdWUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmV0Y2hDcmVuZWF1ID0gYXN5bmMgKGRhdGEyKSA9PiB7XG4gICAgICAgICAgICBzZWFyY2hBZ2VudC52YWx1ZSAgPSAnVG91cyc7XG4gICAgICAgICAgICBsZXQgYWdlbnRfaWQgPSBkYXRhMjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGF0ZS52YWx1ZT0nJztcbiAgICAgICAgICAgICAgICBzaG93Q29tcGxldGVkLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVjaERpc3RhbmNlLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9jcmVuZWF1cy8nK3Byb3BzLnBhcmFtLm9wZXJhdGlvbisnLycrYWdlbnRfaWQrJy8wL3Jlc2V0LzAvMCcpOyAvLyBWb3RyZSBlbmRwb2ludCBBUEkgU3ltZm9ueVxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgcmF3RGF0YS52YWx1ZSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZGlyZWN0aW9uIGZvcmPDqWUgdmVycyBsYSBwYWdlIGRlIGxvZ2luXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgnVW5lIGVycmV1ciBzXFwnZXN0IHByb2R1aXRlIG91IHZvdXMgw6p0ZXMgZMOpY29ubmVjdMOpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRhYnZhbHVlLnZhbHVlID0gJzEnO1xuICAgICAgICAgICAgY2hlY2tlZC52YWx1ZSA9IHRydWU7XG5cbiAgICAgICAgfTtcblxuLy8gMS4gTGlzdGUgZGUgdG91cyBsZXMgYWdlbnRzIChDb2xvbm5lcylcbmNvbnN0IHRvdXNMZXNBZ2VudHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiByYXdEYXRhLnZhbHVlLm1hcChhID0+ICh7XG4gICAgaWQ6IGEuaWQsXG4gICAgbm9tOiBhLm5vbSxcbiAgICBwcmVub206IGEucHJlbm9tLFxuICAgIHRvdGFsQ3JlbmVhdUhvcmFpcmU6IGEudG90YWxDcmVuZWF1SG9yYWlyZVxuICB9KSk7XG59KTtcblxuLy8gMi4gTGlzdGUgZGUgdG91dGVzIGxlcyBkYXRlcyB1bmlxdWVzIHRyacOpZXMgKExpZ25lcylcbmNvbnN0IHRvdXRlc0xlc0RhdGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICBjb25zdCBkYXRlcyA9IG5ldyBTZXQoKTtcbiAgcmF3RGF0YS52YWx1ZS5mb3JFYWNoKGFnZW50ID0+IHtcbiAgICBhZ2VudC5jcmVuZWF1cy5mb3JFYWNoKGMgPT4gZGF0ZXMuYWRkKGMuZGF0ZSkpO1xuICB9KTtcbiAgXG4gIHJldHVybiBBcnJheS5mcm9tKGRhdGVzKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgZDEgPSBuZXcgRGF0ZShhLnNwbGl0KCctJykucmV2ZXJzZSgpLmpvaW4oJy0nKSk7XG4gICAgY29uc3QgZDIgPSBuZXcgRGF0ZShiLnNwbGl0KCctJykucmV2ZXJzZSgpLmpvaW4oJy0nKSk7XG4gICAgcmV0dXJuIGQxIC0gZDI7XG4gIH0pO1xufSk7XG5cbi8vIDMuIEhlbHBlciBwb3VyIHLDqWN1cMOpcmVyIGxlcyBjcsOpbmVhdXggZCd1biBhZ2VudCBwcsOpY2lzIMOgIHVuZSBkYXRlIHByw6ljaXNlXG5jb25zdCBnZXRTbG90c0ZvckFnZW50QW5kRGF0ZSA9IChhZ2VudElkLCBkYXRlKSA9PiB7XG4gIGNvbnN0IGFnZW50ID0gcmF3RGF0YS52YWx1ZS5maW5kKGEgPT4gYS5pZCA9PT0gYWdlbnRJZCk7XG4gIGlmICghYWdlbnQpIHJldHVybiBbXTtcbiAgcmV0dXJuIGFnZW50LmNyZW5lYXVzLmZpbHRlcihjID0+IGMuZGF0ZSA9PT0gZGF0ZSk7XG59O1xuXG4vLyA0LiBIZWxwZXIgcG91ciBhZmZpY2hlciBsZSBqb3VyIGRlIGxhIHNlbWFpbmUgKGV4OiBMdW5kaSlcbmNvbnN0IGdldEpvdXJTZW1haW5lID0gKGRhdGVTdHIpID0+IHtcbiAgLy8gT24gcsOpY3Vww6hyZSBsZSBub20gZHUgam91ciBkZXB1aXMgbGUgcHJlbWllciBjcsOpbmVhdSB0cm91dsOpIHBvdXIgY2V0dGUgZGF0ZVxuICBmb3IgKGxldCBhZ2VudCBvZiByYXdEYXRhLnZhbHVlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBhZ2VudC5jcmVuZWF1cy5maW5kKGMgPT4gYy5kYXRlID09PSBkYXRlU3RyKTtcbiAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaC5qb3VyU2VtYWluZUZyO1xuICB9XG4gIHJldHVybiBcIlwiO1xufTtcblxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVDYXJ0ZSgpe1xuICAgICAgICAgICAgdGFidmFsdWUudmFsdWUgPSAnMCc7XG4gICAgICAgICAgICBjaGVja2VkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgY29uc3QgYWdlbnRzRmlsdGVyZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRvdXNMZXNBZ2VudHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWFyY2hBZ2VudC52YWx1ZSAhPT0gJ1RvdXMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvdXNMZXNBZ2VudHMudmFsdWUuZmlsdGVyKGEgPT4gYS5pZCA9PT0gcGFyc2VJbnQoc2VhcmNoQWdlbnQudmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge3JldHVybiB0b3VzTGVzQWdlbnRzLnZhbHVlO31cblxuICAgICAgICB9KVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlc2V0Q3JlbmVhdSgpIHtcbiAgICAgICAgICAgIC8vcG9pbnQgPSAwO1xuICAgICAgICAgICAgZGlzdGFuY2UgPSAncmVzZXQnO1xuICAgICAgICAgICAgZGF0ZSAgPSAnJztcbiAgICAgICAgICAgIGZldGNoQ3JlbmVhdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlc2FjdGl2ZXIgPSBhc3luYyhhZ2VudF9pZCxpZCkgPT4geyBcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvY3JlbmVhdS9hY3RpdmVyLycraWQsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWdlbnQgPSByYXdEYXRhLnZhbHVlLmZpbmQoYSA9PiBhLmlkID09PSBhZ2VudF9pZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBhZ2VudC5jcmVuZWF1cy5maW5kKGMgPT4gYy5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgIC8vbGV0IGNyZW5lYXVJbmRleCA9IGFnZW50cy52YWx1ZVthZ2VudF9pZF0uY3JlbmVhdXMuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgIG1hdGNoLmFjdGlmID0gIW1hdGNoLmFjdGlmO1xuXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzdGFydERyYWcoZXZ0LCBpdGVtLCBhZ2VudCwgYWN0aWYsIHRvdGFsQ3JlbmVhdSkge1xuICAgICAgICBpZighYWN0aWYpe2FsZXJ0KCdDcsOpbmVhdSBpbmFjdGlmIDogT3DDqXJhdGlvbiBpbXBvc3NpYmxlJyk7cmV0dXJuO31cbiAgICAgICAgaWYodG90YWxDcmVuZWF1ID49MzApe1xuICAgICAgICAgICAgaWYgKCF3aW5kb3cuY29uZmlybShcIkF0dGVudGlvbiwgbWF4IDMwIHBhciBjcsOpbmVhdSBob3JhaXJlIDogc291aGFpdGV6IHZvdXMgY29uZmlybWVyID9cIikpe3JldHVybjt9XG4gICAgICAgIH1cbiAgICAgICAgICBldnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSdcbiAgICAgICAgICBldnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSdcbiAgICAgICAgICBldnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ2l0ZW1JRCcsIGl0ZW0pXG4gICAgICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5zZXREYXRhKCdhZ2VudElEJywgYWdlbnQpXG4gICAgICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0b3RhbENyZW5lYXUnLCB0b3RhbENyZW5lYXUpXG4gICAgICAgICAgY29uc3QgaXRlbUlEID0gZXZ0LmRhdGFUcmFuc2Zlci5nZXREYXRhKCdpdGVtSUQnKVxuICAgICAgICB9XG5cbiAgICAgICAgd2F0Y2goY2hlY2tlZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIEZlbjEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9pbnRzJyk7XG4gICAgICAgICAgICB2YXIgRmVuMiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZW51LWJhcycpO1xuICAgICAgICAgICAgaWYoY2hlY2tlZC52YWx1ZSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICBGZW4xLnN0eWxlLmhlaWdodCA9ICdjYWxjKDEwMHZoIC0gNTAwcHgpJztcbiAgICAgICAgICAgICAgICBGZW4yLnN0eWxlLmhlaWdodCA9ICc0MDBweCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIEZlbjEuc3R5bGUuaGVpZ2h0ID0gJ2NhbGMoMTAwdmggLSAxODBweCknO1xuICAgICAgICAgICAgICAgIEZlbjIuc3R5bGUuaGVpZ2h0ID0nMTAwcHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVQb2ludFNlbGVjdGlvbihwb2ludERhdGEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDYXJ0ZTogw4l2w6luZW1lbnQgcG9pbnQtc2VsZWN0ZWQgcmXDp3UgIScsIHBvaW50RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgICAgICAgZmV0Y2hDcmVuZWF1cygpO1xuICAgICAgICAgICAgYnVzLm9uKCdjcmVuZWF1LXVwZGF0ZWQnLCBmZXRjaENyZW5lYXVzKTtcbiAgICAgICAgICAgIGJ1cy5vbignY3JlbmVhdS10b1VwZGF0ZScsIHVwZGF0ZUNyZW5lYXVzKTtcbiAgICAgICAgICAgIGJ1cy5vbignY2FydGUtdG9VcGRhdGUnLCB1cGRhdGVDYXJ0ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBldmVudFNvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgb25Vbm1vdW50ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvYnNlcnZlcikgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgdG91c0xlc0FnZW50cy52YWx1ZT0gW107XG4gICAgICAgICAgICB0YWJ2YWx1ZS52YWx1ZSA9ICcwJztcbiAgICAgICAgICAgIHJhd0RhdGEudmFsdWU9IFtdO1xuICAgICAgICAgICAgYnVzLm9mZignY3JlbmVhdS11cGRhdGVkJywgZmV0Y2hDcmVuZWF1cyk7XG4gICAgICAgICAgICBidXMub2ZmKCdjcmVuZWF1LXRvVXBkYXRlJywgdXBkYXRlQ3JlbmVhdXMpO1xuICAgICAgICAgICAgYnVzLm9mZignY2FydGUtdG9VcGRhdGUnKTtcbiAgICAgICAgfSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbjxkaXYgaWQ9XCJtZW51LWJhc1wiIHN0eWxlPVwiaGVpZ2h0OiA0MDBweDtcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlclwiIHN0eWxlPVwiZmxvYXQ6IHJpZ2h0O21hcmdpbjogMjBweCAyMHB4IDAgMDtcIj5cbiAgICAgICAgPHNwYW4gdi1pZj1cInRhYnZhbHVlID09IDFcIj5cbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJldGF0LWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hBZ2VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3VzXCI+VG91czwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJhZ2VudE4gaW4gdG91c0xlc0FnZW50c1wiIDprZXk9XCJhZ2VudE4uaWRcIiA6dmFsdWU9XCJhZ2VudE4uaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWdlbnROLm5vbSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAmbmJzcDsmbmJzcDtcbiAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwicmVzZXRDcmVuZWF1KCk7XCI+VG91cyBjcsOpbmVhdXg8L2J1dHRvbj48L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PFRvZ2dsZVN3aXRjaCB2LW1vZGVsPVwiY2hlY2tlZFwiIC8+XG4gICAgPC9kaXY+XG48ZGl2IGlkPVwiYWdlbnRzXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCBibGFjaztcIiBjbGFzcz1cIm0tMFwiID5cbjxkaXYgdi1pZj1cImFnZW50c0ZpbHRlcmVkLmxlbmd0aCA9PSAwXCI+IFBhcyBkZSBjcsOpbmVhdSB0cm91dsOpLiA8L2Rpdj5cbiA8ZGl2IGNsYXNzPVwicC0wXCI+XG4gICAgPGRpdiB2LWlmPVwibG9hZGluZ1wiPkNoYXJnZW1lbnQuLi48L2Rpdj5cbiAgICA8ZGl2IHYtZWxzZSBjbGFzcz1cImNhbGVuZGFyLWNvbnRhaW5lclwiPlxuICAgICAgPHRhYmxlIHYtaWY9XCJhZ2VudHNGaWx0ZXJlZC5sZW5ndGggPiAwXCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8IS0tIENlbGx1bGUgZCdhbmdsZSAoZml4ZSkgLS0+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDwhLS0gRW4tdMOqdGUgOiBMZXMgbm9tcyBkZXMgYWdlbnRzIGVuIGNvbG9ubmVzIC0tPlxuICAgICAgICAgICAgPHRoIHYtZm9yPVwiYWdlbnQgaW4gYWdlbnRzRmlsdGVyZWRcIiA6a2V5PVwiYWdlbnQuaWRcIiBjbGFzcz1cInN0aWNreS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gIDpjbGFzcz1cIlthZ2VudFNlbCA9PSBhZ2VudC5pZCA/ICdncmVlbicgOiAnJ11cIj57eyBhZ2VudC5ub20gfX0ge3sgYWdlbnQucHJlbm9tIH19PC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPCEtLSBVbmUgbGlnbmUgcGFyIERhdGUgdW5pcXVlIC0tPlxuICAgICAgICAgIDx0ciB2LWZvcj1cImRhdGUgaW4gdG91dGVzTGVzRGF0ZXNcIiA6a2V5PVwiZGF0ZVwiPlxuICAgICAgICAgICAgPHRkIHYtZm9yPVwiYWdlbnQgaW4gYWdlbnRzRmlsdGVyZWRcIiA6a2V5PVwiYWdlbnQuaWRcIiBjbGFzcz1cInNsb3QtY2VsbFwiPlxuICA8ZGl2IHYtaWY9XCJnZXRTbG90c0ZvckFnZW50QW5kRGF0ZShhZ2VudC5pZCwgZGF0ZSkubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgdi1mb3I9XCJzbG90IGluIGdldFNsb3RzRm9yQWdlbnRBbmREYXRlKGFnZW50LmlkLCBkYXRlKVwiIDprZXk9XCJzbG90LmlkXCIgIGNsYXNzPVwic2xvdC1iYWRnZSBlbC1kcmFnXCIgICBkcmFnZ2FibGU9XCJ0cnVlXCIgXG4gIEBkcmFnc3RhcnQ9XCJzdGFydERyYWcoJGV2ZW50LCBzbG90LmlkLCBhZ2VudC5pZCwgc2xvdC5hY3RpZiwgc2xvdC50b3RhbENyZW5lYXVIb3JhaXJlKVwiIDpjbGFzcz1cIltzbG90LmNvbXBsZXQgPyAnY3JlbmVhdS1jb21wbGV0JyA6ICcnXVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cInNsb3QtaGVhZGVyXCI+XG4gICAgICA8ZGl2PjxzcGFuIGNsYXNzPVwidGltZVwiPnt7IHNsb3Quam91clNlbWFpbmVGciB9fSB7eyBzbG90LmNyZW5lYXVIb3JhaXJlLm5vbSB9fTwvc3Bhbj48YnI+PHNwYW4gY2xhc3M9XCJzbG90LWRhdGVcIj57eyBzbG90LmRhdGUgfX3wn5OFIDwvc3Bhbj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzbG90LWZvb3RlclwiIHYtaWY9XCJzbG90LnBvaW50cy5sZW5ndGggIT09IDBcIiA+XG4gICAgICAgIDwhLS0gQ29udGVuZXVyIGRlIGwnaW5mbyBidWxsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImluZm8td3JhcHBlclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5mby10cmlnZ2VyXCI+4oS577iPPC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLXBvcHVwXCI+XG4gICAgICAgICAgICA8ZGl2IHYtZm9yPVwicG9pbnQgaW4gc2xvdC5wb2ludHNcIj5cbiAgICAgICAgICAgICAgICAgICAgLSA8c3Ryb25nPnt7cG9pbnQubm9tfX08L3N0cm9uZz4gOiB7e3BvaW50LnRpdHJlUnVlfX0ge3twb2ludC5udW1lcm9SdWV9fSB7e3BvaW50LnRpdHJlUnVlfX0ge3twb2ludC5ub21SdWV9fSB7e3BvaW50LnZpbGxlfX08YnI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIEBjbGljaz1cImRlc2FjdGl2ZXIoYWdlbnQuaWQsc2xvdC5pZClcIj57eyBzbG90LmFjdGlmID8gJ+KchScgOiAn4p2MJyB9fTwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJzbG90LWJvZHlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LWl0ZW1cIj5cbiAgICAgIDxzcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj7irZA8L3NwYW4+XG4gICAgICAgIDxzcGFuIDpjbGFzcz1cIltzbG90LnRvdGFsID4gMCA/ICdncmVlbicgOiAnJ11cIj57eyBzbG90LnRvdGFsIH19IFJWPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPVwiVG90YWwgcG91ciBjZXR0ZSB0cmFuY2hlIGhvcmFpcmVcIiA6Y2xhc3M9XCJbc2xvdC50b3RhbENyZW5lYXVIb3JhaXJlICA+PSBhZ2VudC50b3RhbENyZW5lYXVIb3JhaXJlID8gJ2FsZXJ0ZS1yb3VnZScgOiAndHJhbmNoZS10b3RhbCddXCI+KHt7IHNsb3QudG90YWxDcmVuZWF1SG9yYWlyZSB9fSk8L3NwYW4+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgICAgPHNwYW4gdi1pZj1cInNsb3QuZGlzdGFuY2UgPj0gMCAmJiBzbG90LnRvdGFsID4gMCAmJiBzbG90LnBvaW50cy5sZW5ndGggPiAwXCI+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+IHtcbiAgICAgICAgICAgIGV4Y2VsRGlhbG9nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICBwcm9kdWN0RGlhbG9nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICBzdWJtaXR0ZWQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkZWxldGVfbG9nPSBhc3luYyhpZCkgPT4ge1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvbG9nL2RlbGV0ZS8nK2lkLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge21lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIGVudm9pIGRlbGV0ZVwiO31cbiAgICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ2RlbGV0ZSBvaydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIHLDqXNlYXVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJldXIgcsOpc2VhdVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoZWNrVGVsID0gKHRlbCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRlbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBjb25zdCByZWdleCA9IC9eKDZ8MDZ8N3wwNykvOyBcbiAgICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QoU3RyaW5nKHRlbCkpO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuICAgICAgICBjb25zdCBodWJVcmwgPSBcImh0dHBzOi8vbWVyY3VyZS5lYWUtY29ubmVjdC5jb20vLndlbGwta25vd24vbWVyY3VyZVwiO1xuICAgICAgICBcbiAgICAgICAgLy9jb25zdCB7IHN0YXR1cywgZGF0YU0sIGVycm9yIH0gPSB1c2VFdmVudFNvdXJjZSh1cmwudG9TdHJpbmcoKSwgWydjYXJ0ZSddKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGNvbm5lY3RUb01lcmN1cmUgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyAxLiBGZXJtZXIgbCdhbmNpZW5uZSBjb25uZXhpb24gc2kgZWxsZSBleGlzdGUgcG91ciDDqXZpdGVyIGxlcyBkb3VibG9uc1xuICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDb25uZXhpb24gYXUgSHViIGZlcm3DqWUgIVwiKTtcbiAgICAgICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChodWJVcmwpO1xuICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJ0b3BpY1wiLCBcIi9jYXJ0ZVwiKTtcbiAgICAgICAgICAgIGNvbnN0IHRvcGljID0gXCIvY2FydGVcIjtcblxuICAgICAgICAgICAgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gaGFuZGxlTWVyY3VyZU1lc3NhZ2U7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NhcnRlJywgaGFuZGxlTWVyY3VyZU1lc3NhZ2UpO1xuICAgICAgICBcbiAgICAgICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIEV2ZW50U291cmNlIChkw6ljb25uZXhpb24pIDpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIDIuIFbDqXJpZmllciBsJ8OpdGF0IGRlIGxhIGNvbm5leGlvblxuICAgICAgICAgICAgICAgIC8vIHJlYWR5U3RhdGUgMiBzaWduaWZpZSBxdWUgbGEgY29ubmV4aW9uIGVzdCBkw6lmaW5pdGl2ZW1lbnQgZmVybcOpZVxuICAgICAgICAgICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUZW50YXRpdmUgZGUgcmVjb25uZXhpb24gZGFucyAzIHNlY29uZGVzLi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gMy4gVGVudGVyIHVuZSByZWNvbm5leGlvbiBhcHLDqHMgdW4gZMOpbGFpXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdFRvTWVyY3VyZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LCAzMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBldmVudFNvdXJjZS5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDb25uZXhpb24gYXUgSHViIE1lcmN1cmUgcsOpdXNzaWUgIVwiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgb25Nb3VudGVkKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0VG9NZXJjdXJlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlcycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwRWxlbWVudCAmJiBhcHBFbGVtZW50LmRhdGFzZXQudXNlclByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyUHJvcHNKc29uID0gYXBwRWxlbWVudC5kYXRhc2V0LnVzZXJQcm9wcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnZhbHVlID0gSlNPTi5wYXJzZSh1c2VyUHJvcHNKc29uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBldGF0cy52YWx1ZSA9IHBhcmFtLnZhbHVlLmV0YXRzO1xuICAgICAgICAgICAgICAgICAgICBtb2lzLnZhbHVlID0gcGFyYW0udmFsdWUubW9pcztcbiAgICAgICAgICAgICAgICAgICAgdG90YWwudmFsdWUgPSBwYXJhbS52YWx1ZS50b3RhbDtcbiAgICAgICAgICAgICAgICAgICAgY2x1c3RlcklELnZhbHVlID0gcGFyYW0udmFsdWUuY2x1c3RlcklkO1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25JRC52YWx1ZSA9IHBhcmFtLnZhbHVlLm9wZXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVhZ2VudHMudmFsdWUgPSBwYXJhbS52YWx1ZS5hZ2VudHM7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnZhbHVlID0gcGFyYW0udmFsdWUubWVzc2FnZXM7XG4gICAgICAgICAgICAgICAgICAgIG1pc3Npb25JRC52YWx1ZSA9IHBhcmFtLnZhbHVlLm1pc3Npb247XG4gICAgICAgICAgICAgICAgICAgIGZldGNoUG9pbnRzTWlzc2lvbihtaXNzaW9uSUQudmFsdWUpXG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgb25Vbm1vdW50ZWQoKCkgPT4ge1xuXG4gICAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTWVyY3VyZSBFdmVudFNvdXJjZSBjbG9zZWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8vIG9uQmVmb3JlVW5tb3VudCBlc3QgYXBwZWzDqSBqdXN0ZSBhdmFudCBxdWUgbGUgY29tcG9zYW50IG5lIHNvaXQgcmV0aXLDqSBkdSBET00uXG4gICAgICAgIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4vLzxTZWFyY2ggdi1pZj1cInBhcmFtXCIgOnBhcmFtPVwicGFyYW1cIi8+XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbiAgICAgICAgPGRpdiBpZD1cInBvaW50c1wiICBzdHlsZT1cImhlaWdodDogY2FsYygxMDB2aCAtIDEwMHB4KTtcIj5cbiAgICAgICAgICAgIDxEYXRhVGFibGUgXG4gICAgICAgICAgICA6dmFsdWU9XCJmaWx0ZXJlZFBvaW50c1wiIFxuICAgICAgICAgICAgc2Nyb2xsYWJsZSBcbiAgICAgICAgICAgIHNjcm9sbEhlaWdodD1cImZsZXhcIlxuICAgICAgICAgICAgcGFnaW5hdG9yIDpyb3dzPVwiMTAwXCIgXG4gICAgICAgICAgICBkYXRhS2V5PVwiaWRcIiBcbiAgICAgICAgICAgIGZpbHRlckRpc3BsYXk9XCJyb3dcIiBcbiAgICAgICAgICAgIDpsb2FkaW5nPVwibG9hZGluZ1wiXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWZpbHRlci1zbGFzaFwiIGxhYmVsPVwiQ2xlYXIgRmlsdHJlXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgQGNsaWNrPVwiY2xlYXJGaWx0ZXIoKVwiIHN0eWxlPVwiaGVpZ2h0OjQwcHg7XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cIm1lc3NhZ2UtZmlsdGVyXCIgdi1tb2RlbD1cIm1lc3NhZ2VTZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiU8OpbGVjdGlvbm5lelwiPlPDqWxlY3Rpb25uZXo8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwibWVzc2FnZSBpbiBtZXNzYWdlc1wiIDprZXk9XCJtZXNzYWdlLmlkXCIgOnZhbHVlPVwibWVzc2FnZS5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtZXNzYWdlLm5vbSB9fSAvIHt7IG1lc3NhZ2Uuc3VqZXQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjZW1wdHk+IFBhcyBkZSBwb2ludCB0cm91dsOpLiA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjbG9hZGluZz4gTG9hZGluZyAuLi4gPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiaWRcIiBoZWFkZXI9XCJJRFwiIC8+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVscz1cIm5vbVwiIHN0eWxlPVwibWluLXdpZHRoOiAxMnJlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5jaXZpbGl0ZSB9fSB7eyBkYXRhLm5vbSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgdi1tb2RlbD1cInNlYXJjaE5vbVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJOb21cIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibnVtZXJvQ2xpZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5udW1lcm9DbGllbnQgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IHYtbW9kZWw9XCJzZWFyY2hOdW1lcm9DbGllbnRcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiTsKwIGNsaWVudFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+IFxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbHM9XCJ0ZWxcIiBzdHlsZT1cIm1pbi13aWR0aDogMTJyZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEudGVsMSB9fTxicj57eyBkYXRhLnRlbDIgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IHYtbW9kZWw9XCJzZWFyY2hUZWxcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiVGVsXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibnVtZXJvUGh5c2lxdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLm51bWVyb1BoeXNpcXVlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCB2LW1vZGVsPVwic2VhcmNoTnVtZXJvUGh5c2lxdWVcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiTsKwIHBoeXNpcXVlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uICBmaWVsZD1cImV0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEuZXRhdCAmJiBkYXRhLmV0YXQuaWRcIiA6c3R5bGU9XCJ7IFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMnB4IDhweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6ICcxcHggc29saWQgI2NjYycsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICcxNjBweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNmZmYnLCAvKiBDb3VsZXVyIGRlIHRleHRlIGJsYW5jaGUgcG91ciB1biBtZWlsbGV1ciBjb250cmFzdGUgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogZGF0YS5ldGF0LmNvdWxldXJcbiAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLmV0YXQubm9tIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJldGF0LWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hFdGF0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXNcIj5Ub3VzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cImV0YXQgaW4gZXRhdHNcIiA6a2V5PVwiZXRhdFwiIDp2YWx1ZT1cImV0YXQuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXRhdC5ub20gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJsYXN0TWVzc2FnZVwiIHN0eWxlPVwid2lkdGg6IDE1MHB4O1wiIGhlYWRlcj1cIkRlcm5pZXIgTWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmxvZ3BvaW50cy5sZW5ndGggPiAwXCI+e3sgZGF0YS5sb2dwb2ludHMuc2xpY2UoLTEpWzBdLmRhdGVjcmVhIH19L3t7IGRhdGEubG9ncG9pbnRzLnNsaWNlKC0xKVswXS5jb21tZW50YWlyZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPENvbHVtbiBzdHlsZT1cIndpZHRoOiAxMDBweCAhaW1wb3J0YW50XCI+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwic2xvdFByb3BzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwic2xvdFByb3BzLmRhdGEuZW1haWwubGVuZ3RoID4gNiAmJiB0eXBlU2VsID09IDFcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvXCIgQGNsaWNrPVwic2VuZEVtYWlsKHNsb3RQcm9wcy5kYXRhLmlkKVwiIHN0eWxlPVwid2lkdGg6IDI1MHB4ICFpbXBvcnRhbnRcIj57eyBzbG90UHJvcHMuZGF0YS5lbWFpbCB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJzbG90UHJvcHMuZGF0YS50ZWwxICYmIGNoZWNrVGVsKHNsb3RQcm9wcy5kYXRhLnRlbDEpICYmIHR5cGVTZWwgPT0gMlwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm9cIiBAY2xpY2s9XCJzZW5kU01TKHNsb3RQcm9wcy5kYXRhLHNsb3RQcm9wcy5kYXRhLnRlbDEpXCIgc3R5bGU9XCJ3aWR0aDogMjUwcHggIWltcG9ydGFudFwiPjxzcGFuIGNsYXNzPVwicGkgcGktbW9iaWxlXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj48L3NwYW4+Jm5ic3A7Jm5ic3A7U01TIHt7IHNsb3RQcm9wcy5kYXRhLnRlbDEgfX08L2J1dHRvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwic2xvdFByb3BzLmRhdGEudGVsMiAmJiBjaGVja1RlbChzbG90UHJvcHMuZGF0YS50ZWwyKSAmJiB0eXBlU2VsID09IDJcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvXCIgQGNsaWNrPVwic2VuZFNNUyhzbG90UHJvcHMuZGF0YSxzbG90UHJvcHMuZGF0YS50ZWwyKVwiIHN0eWxlPVwid2lkdGg6IDI1MHB4ICFpbXBvcnRhbnRcIj48c3BhbiBjbGFzcz1cInBpIHBpLW1vYmlsZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwOyZuYnNwO1NNUyB7eyBzbG90UHJvcHMuZGF0YS50ZWwyIH19PC9idXR0b24+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cInNsb3RQcm9wcy5kYXRhLmVtYWlsLmxlbmd0aCA+IDYgJiYgdHlwZVNlbCA9PSA1XCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mb1wiIEBjbGljaz1cInNlbmRFbWFpbChzbG90UHJvcHMuZGF0YS5pZClcIiBzdHlsZT1cIndpZHRoOiAyNTBweCAhaW1wb3J0YW50XCI+RW1haWwgUlYgV2ViPC9idXR0b24+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cInNsb3RQcm9wcy5kYXRhLnRlbDEgJiYgY2hlY2tUZWwoc2xvdFByb3BzLmRhdGEudGVsMSkgJiYgdHlwZVNlbCA9PSA1XCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mb1wiIEBjbGljaz1cInNlbmRTTVMoc2xvdFByb3BzLmRhdGEsc2xvdFByb3BzLmRhdGEudGVsMSlcIiBzdHlsZT1cIndpZHRoOiAyNTBweCAhaW1wb3J0YW50XCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1tb2JpbGVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj4mbmJzcDsmbmJzcDtTTVMgUlYgV2ViIHt7IHNsb3RQcm9wcy5kYXRhLnRlbDEgfX08L2J1dHRvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwic2xvdFByb3BzLmRhdGEudGVsMiAmJiBjaGVja1RlbChzbG90UHJvcHMuZGF0YS50ZWwyKSAmJiB0eXBlU2VsID09IDVcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvXCIgQGNsaWNrPVwic2VuZFNNUyhzbG90UHJvcHMuZGF0YSxzbG90UHJvcHMuZGF0YS50ZWwyKVwiIHN0eWxlPVwid2lkdGg6IDI1MHB4ICFpbXBvcnRhbnRcIj48c3BhbiBjbGFzcz1cInBpIHBpLW1vYmlsZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwOyZuYnNwO1NNUyBSViBXZWIge3sgc2xvdFByb3BzLmRhdGEudGVsMiB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJub21SdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLm51bWVyb1J1ZSB9fSB7eyBkYXRhLnRpdHJlUnVlICB9fSB7eyBkYXRhLm5vbVJ1ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cIm5vbVJ1ZS1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoTm9tUnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91dGVzXCI+VG91dGVzIGxlcyBydWVzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwicnVlIGluIHJ1ZXNcIiA6a2V5PVwicnVlXCIgOnZhbHVlPVwicnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcnVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cInZpbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5jb2RlUG9zdGFsIH19IHt7IGRhdGEudmlsbGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwidmlsbGUtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaFZpbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXRlc1wiPlRvdXRlcyB2aWxsZXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwidmlsbGUgaW4gdmlsbGVzXCIgOmtleT1cInZpbGxlXCIgOnZhbHVlPVwidmlsbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdmlsbGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJhZ2VudFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmFnZW50XCI+e3sgZGF0YS5hZ2VudC5ub20gfX0gPHNwYW4gdi1pZj1cImRhdGEuYWdlbnQucHJlbm9tXCI+e3sgZGF0YS5hZ2VudC5wcmVub20gfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJhZ2VudC1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoQWdlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91c1wiPlRvdXMgYWdlbnRzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cImFnZW50IGluIGFnZW50c1wiIDprZXk9XCJhZ2VudFwiIDp2YWx1ZT1cImFnZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFnZW50IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiV2ViXCIgc3R5bGU9XCJ3aWR0aDogMTVweFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEud2ViXCI+PGRpdiBjbGFzcz1cImRvdFwiPjxzcGFuPjxzcGFuPjwvc3Bhbj48L3NwYW4+PC9kaXY+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJkYXRlUlZcIiBzdHlsZT1cIm1pbi13aWR0aDogMTUwcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmNyZW5lYXVcIj57eyBkYXRhLmNyZW5lYXUuZGF0ZSB9fSB7eyBkYXRhLmNyZW5lYXUuY3JlbmVhdUhvcmFpcmUubm9tIH19PGJyPkFnZW50IDoge3sgZGF0YS5jcmVuZWF1LmFnZW50Lm5vbSB9fSA8c3BhbiB2LWlmPVwiZGF0YS5jcmVuZWF1LmFnZW50LnByZW5vbVwiPnt7IGRhdGEuY3JlbmVhdS5hZ2VudC5wcmVub20gfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJkYXRlUlYtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaERhdGVSVlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3V0ZXNcIj5SViAvIFRvdXRlcyBkYXRlczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJkYXRlUlYgaW4gZGF0ZXNSVlwiIDprZXk9XCJkYXRlUlZcIiA6dmFsdWU9XCJkYXRlUlZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZVJWIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICAgPENvbHVtbiBoZWFkZXI9XCJFZGl0XCIgc3R5bGU9XCJ3aWR0aDogNTBweFwiPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInNsb3RQcm9wc1wiPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gaWNvbj1cInBpIHBpLXBlbmNpbFwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHJvdW5kZWQgY2xhc3M9XCJtci0yXCIgQGNsaWNrPVwiZWRpdFByb2R1Y3Qoc2xvdFByb3BzLmRhdGEpXCI+RWRpdDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICA8L0RhdGFUYWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPERpYWxvZyB2LW1vZGVsOnZpc2libGU9XCJwcm9kdWN0RGlhbG9nXCIgOnN0eWxlPVwieyB3aWR0aDogJzQ1MHB4JyB9XCIgaGVhZGVyPVwiRMOpdGFpbHMgZHUgcG9pbnRcIiA6bW9kYWw9XCJ0cnVlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNlwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJudW1lcm9DbGllbnRcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+TnVtw6lybyBDbGllbnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwibnVtZXJvQ2xpZW50XCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5udW1lcm9DbGllbnRcIiByZXF1aXJlZD1cInRydWVcIiBhdXRvZm9jdXMgOmludmFsaWQ9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QubnVtZXJvQ2xpZW50XCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHYtaWY9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QubnVtZXJvQ2xpZW50XCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDBcIj5OdW3DqXJvIENsaWVudCByZXF1aXMuPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY29tcHRldXJBY2Nlc3NpYmxlXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkFjY2Vzc2libGU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImNvbXB0ZXVyQWNjZXNzaWJsZVwiIHYtbW9kZWw9XCJwcm9kdWN0LmNvbXB0ZXVyQWNjZXNzaWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gOnZhbHVlPVwidHJ1ZVwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogZ3JlZW5cIj5PdWk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIDp2YWx1ZT1cImZhbHNlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiByZWRcIj5Ob248L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PiBcbiAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV0YXRcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+Q2hhbmdlciBsJ8OpdGF0PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdCB2LW1vZGVsPVwicHJvZHVjdC5ldGF0XCIgOm9wdGlvbnM9XCJldGF0c1wiIG9wdGlvbkxhYmVsPVwibm9tXCIgIDppbml0aWFsVmFsdWVzPVwicHJvZHVjdC5ldGF0LmlkXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3Rpb25uZXIgdW4gw6l0YXRcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgXG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV0YXRcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+QWdlbnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0IHYtbW9kZWw9XCJwcm9kdWN0LmFnZW50XCIgOm9wdGlvbnM9XCJsaXN0ZWFnZW50c1wiIG9wdGlvbkxhYmVsPVwibm9tXCIgIDppbml0aWFsVmFsdWVzPVwicHJvZHVjdC5hZ2VudC5pZFwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0aW9ubmVyIHVuIGFnZW50XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2l2aWxpdGVcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+Q2l2aWxpdMOpPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cImNpdmlsaXRlXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5jaXZpbGl0ZVwiIHJlcXVpcmVkPVwidHJ1ZVwiIGF1dG9mb2N1cyA6aW52YWxpZD1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5jaXZpbGl0ZVwiIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCB2LWlmPVwic3VibWl0dGVkICYmICFwcm9kdWN0LmNpdmlsaXRlXCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDBcIj5DaXZpbGl0w6kgcmVxdWlzZS48L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPk5vbTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJuYW1lXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5ub21cIiByZXF1aXJlZD1cInRydWVcIiBhdXRvZm9jdXMgOmludmFsaWQ9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3Qubm9tXCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHYtaWY9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3Qubm9tXCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDBcIj5Ob20gcmVxdWlzLjwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRlbDFcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+VGVsIDE8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwidGVsMVwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QudGVsMVwiIHJlcXVpcmVkPVwiZmFsc2VcIiBhdXRvZm9jdXMgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGVsMlwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5UZWwgMjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJ0ZWwyXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC50ZWwyXCIgcmVxdWlyZWQ9XCJmYWxzZVwiIGF1dG9mb2N1cyBmbHVpZCAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlbWFpbFwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5FbWFpbDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJlbWFpbFwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QuZW1haWxcIiByZXF1aXJlZD1cImZhbHNlXCIgYXV0b2ZvY3VzIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvbW1lbnRhaXJlXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkNvbW1lbnRhaXJlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPFRleHRhcmVhIGlkPVwiY29tbWVudGFpcmVcIiB2LW1vZGVsPVwicHJvZHVjdC5jb21tZW50YWlyZVwiIHJlcXVpcmVkPVwiZmFsc2VcIiByb3dzPVwiM1wiIGNvbHM9XCIyMFwiIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJBbm51bGVyXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgdGV4dCBAY2xpY2s9XCJoaWRlRGlhbG9nXCIgLz5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiU2F1dmVyXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgQGNsaWNrPVwic2VuZEluZm9zKHByb2R1Y3QuaWQpXCIgLz5cbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvRGlhbG9nPlxuICAgICAgICA8RGlhbG9nIHYtbW9kZWw6dmlzaWJsZT1cImV4Y2VsRGlhbG9nXCIgOnN0eWxlPVwieyB3aWR0aDogJzQ1MHB4JyB9XCIgaGVhZGVyPVwiRXhwb3J0IEV4Y2VsXCIgOm1vZGFsPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHA+VW4gZXhwb3J0IGNvbXBsZXQgZXN0IGfDqW7DqXLDqSBjaGFxdWUgbnVpdC4gVm91cyBwb3V2ZXogY3LDqWVyIHVuIHJhcHBvcnQgcGFydGllbCBsaW1pdMOpIMOgIDUwMCBsaWduZXMgw6AgcGFydGlyIGRlIHZvcyBjcml0w6hyZXMuPC9wPlxuICAgICAgICAgICAgPHRlbXBsYXRlICNmb290ZXI+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIkFubnVsZXJcIiBpY29uPVwicGkgcGktdGltZXNcIiB0ZXh0IEBjbGljaz1cImhpZGVEaWFsb2dcIiAvPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJFeHBvcnRlclwiIGljb249XCJwaSBwaS1jaGVja1wiIEBjbGljaz1cInNlbmRFeGNlbCgpXCIgLz5cbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvRGlhbG9nPlxuPC90ZW1wbGF0ZT5cbjxzdHlsZT5cbjpkZWVwKHRyLm15LWN1c3RvbS1oaWdobGlnaHQpIHtcbiAgICAvKmJhY2tncm91bmQ6ICNmY2Q5YTUgIWltcG9ydGFudDsqL1xuICAgIC8qZm9udC13ZWlnaHQ6IGJvbGQ7Ki9cbn1cbi5wLWRhdGF0YWJsZS10aGVhZCA+IHRyID4gdGggIHtcbiAgICBwYWRkaW5nLXRvcDogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctbGVmdDogNHB4ICFpbXBvcnRhbnQ7XG59XG4ucC1kYXRhdGFibGUtaGVhZGVyLWNlbGwgICB7XG4gICAgcGFkZGluZy10b3A6IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctYm90dG9tOiA0cHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWxlZnQ6IDRweCAhaW1wb3J0YW50O1xufVxuc2VsZWN0IHttYXgtd2lkdGg6IDEyMHB4O31cbjwvc3R5bGU+IiwiPHRlbXBsYXRlPlxyXG4gIDx0YWJsZT5cclxuICA8dGJvZHk+XHJcbiAgPHRyPlxyXG4gIDx0ZD5cclxuICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtmbGV4LWRpcmVjdGlvbjogY29sdW1uO2ZsZXgtd3JhcDogbm93cmFwO3dpZHRoOiAyMTBweDtwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgIDxGbG9hdExhYmVsPlxyXG4gICAgICAgICAgPElucHV0VGV4dCBpZD1cInVzZXJuYW1lXCIgdi1tb2RlbD1cInF1ZXJ5XCIgQGlucHV0PVwiaGFuZGxlSW5wdXRcIiBhdXRvY29tcGxldGU9XCJvZmZcIi8+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwidXNlcm5hbWVcIj5Ob20gb3UgdGVsPC9sYWJlbD5cclxuICAgICAgPC9GbG9hdExhYmVsPlxyXG4gICAgPC9kaXY+ICAgICAgICAgIFxyXG4gICAgPHVsIHYtaWY9XCJyZXN1bHRzLmxlbmd0aCA+IDBcIiBjbGFzcz1cInN1Z2dlc3Rpb25zXCI+XHJcbiAgICAgICAgICAgIDxsaSB2LWZvcj1cInBvaW50IGluIHJlc3VsdHNcIiA6a2V5PVwicG9pbnQubm9tXCIgQGNsaWNrPVwic2VsZWN0Tm9tKHBvaW50Lm5vbSlcIj5cclxuICAgICAgICAgICAgICB7eyBwb2ludC5jaXZpbGl0ZX19IHt7IHBvaW50Lm5vbSB9fVxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICAgIDwvdGQ+XHJcbiAgICA8dGQ+XHJcbiAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtmbGV4LXdyYXA6IG5vd3JhcDt3aWR0aDogMjEwcHg7cG9zaXRpb246IHJlbGF0aXZlO1wiPlxyXG4gICAgICA8RmxvYXRMYWJlbD5cclxuICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJudW1lcm9cIiB2LW1vZGVsPVwicXVlcnkzXCIgQGlucHV0PVwiaGFuZGxlSW5wdXQzXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIvPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm51bWVyb1wiPk7CsCBjb21wdGV1ciBvdSBjbGllbnQ8L2xhYmVsPlxyXG4gICAgICA8L0Zsb2F0TGFiZWw+XHJcbiAgICA8L2Rpdj4gICAgICAgICAgXHJcbiAgICA8dWwgdi1pZj1cInJlc3VsdHMzLmxlbmd0aCA+IDBcIiBjbGFzcz1cInN1Z2dlc3Rpb25zXCI+XHJcbiAgICAgICAgICAgIDxsaSB2LWZvcj1cInBvaW50IGluIHJlc3VsdHMzXCIgOmtleT1cInBvaW50Lm5vbVwiIEBjbGljaz1cInNlbGVjdE51bWVybyhwb2ludC5udW1lcm9DbGllbnQpXCI+XHJcbiAgICAgICAgICAgICAge3sgcG9pbnQubnVtZXJvUGh5c2lxdWV9fSAvIHt7IHBvaW50Lm51bWVyb0NsaWVudCB9fVxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICAgIDwvdGQ+XHJcbiAgICA8dGQ+XHJcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtmbGV4LWRpcmVjdGlvbjogY29sdW1uO2ZsZXgtd3JhcDogbm93cmFwO3dpZHRoOiAyMTBweDtwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgIDxGbG9hdExhYmVsPlxyXG4gICAgICAgICAgPElucHV0VGV4dCBpZD1cInZpbGxlXCIgdi1tb2RlbD1cInF1ZXJ5MlwiIEBpbnB1dD1cImhhbmRsZUlucHV0MlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiLz5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJ2aWxsZVwiPlZpbGxlPC9sYWJlbD5cclxuICAgICAgPC9GbG9hdExhYmVsPlxyXG4gICAgPC9kaXY+ICAgICAgICAgIFxyXG4gICAgPHVsIHYtaWY9XCJyZXN1bHRzMi5sZW5ndGggPiAwXCIgY2xhc3M9XCJzdWdnZXN0aW9uc1wiPlxyXG4gICAgICAgICAgICA8bGkgdi1mb3I9XCJwb2ludCBpbiByZXN1bHRzMlwiIDprZXk9XCJwb2ludC52aWxsZVwiIEBjbGljaz1cInNlbGVjdFZpbGxlKHBvaW50LnZpbGxlKVwiPlxyXG4gICAgICAgICAgICAgIHt7IHBvaW50LmNvZGVQb3N0YWwgfX0ge3sgcG9pbnQudmlsbGUgfX1cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgIDwvdWw+XHJcbiAgPC90ZD5cclxuICA8dGQ+XHJcbiAgICA8ZGl2IHYtaWY9XCJxdWVyeTJcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtmbGV4LXdyYXA6IG5vd3JhcDt3aWR0aDogMjEwcHg7cG9zaXRpb246IHJlbGF0aXZlO1wiPlxyXG4gICAgICA8RmxvYXRMYWJlbD5cclxuICAgICAgICAgIDxNdWx0aVNlbGVjdCAgXHJcbiAgICAgICAgICBpZD1cInJ1ZVwiIFxyXG4gICAgICAgICAgICB2LW1vZGVsPVwic2VsZWN0ZWRJdGVtc1wiIFxyXG4gICAgICAgICAgICA6b3B0aW9ucz1cIm9wdGlvbnNcIiBcclxuICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21SdWVcIiBcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJSZWNoZXJjaGVyLi4uXCJcclxuICAgICAgICAgICAgOmZpbHRlcj1cInRydWVcIiBcclxuICAgICAgICAgICAgQGZpbHRlcj1cIm9uRmlsdGVyXCIgXHJcbiAgICAgICAgICAgIEBjaGFuZ2U9XCJvblNlbGVjdGlvbkNoYW5nZVwiIFxyXG4gICAgICAgICAgICA6bG9hZGluZz1cImxvYWRpbmcyXCJcclxuICAgICAgICAgICAgOnNlbGVjdGlvbkxpbWl0PVwiM1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIG1kOnctMjByZW1cIlxyXG4gICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJBdSBtb2lucyBkZXV4IGxldHRyZXNcIlxyXG4gICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXQgdHJvdXbDqVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJydWVcIj5SdWU8L2xhYmVsPlxyXG4gICAgICA8L0Zsb2F0TGFiZWw+XHJcbiAgICA8L2Rpdj4gICAgICAgICAgXHJcbiAgPC90ZD5cclxuICAgIDx0ZD5cclxuICAgIDxkaXYgdi1pZj1cInF1ZXJ5NFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDtmbGV4LWRpcmVjdGlvbjogY29sdW1uO2ZsZXgtd3JhcDogbm93cmFwO3dpZHRoOiAyMTBweDtwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgIDxGbG9hdExhYmVsPlxyXG4gICAgICAgICAgPElucHV0VGV4dCBpZD1cIm51bXJ1ZVwiIHYtbW9kZWw9XCJxdWVyeTVcIiBAaW5wdXQ9XCJoYW5kbGVJbnB1dDVcIiBhdXRvY29tcGxldGU9XCJvZmZcIi8+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwibnVtcnVlXCI+TnVtPC9sYWJlbD5cclxuICAgICAgPC9GbG9hdExhYmVsPlxyXG4gICAgPC9kaXY+ICAgICAgICAgIFxyXG4gICAgPHVsIHYtaWY9XCJyZXN1bHRzNS5sZW5ndGg+MFwiIGNsYXNzPVwic3VnZ2VzdGlvbnNcIj5cclxuICAgICAgICAgICAgPGxpIHYtZm9yPVwicG9pbnQgaW4gcmVzdWx0czVcIiA6a2V5PVwicG9pbnQubnVtZXJvUnVlXCIgQGNsaWNrPVwic2VsZWN0TnVtUnVlKHBvaW50Lm51bWVyb1J1ZSlcIj5cclxuICAgICAgICAgICAgICB7eyBwb2ludC5udW1lcm9SdWUgfX1cclxuICAgICAgICAgICAgPC9saT5cclxuICAgIDwvdWw+XHJcbiAgPC90ZD5cclxuICA8L3RyPlxyXG4gIDx0cj48dGQgY29sc3Bhbj1cIjRcIj48c3BhbiBzdHlsZT1cImNvbG9yOiBibGFjaztcIj57eyBjb3VudGVyIH19IHLDqXN1bHRhdChzKTwvc3Bhbj4mbmJzcDsmbmJzcDs8QnV0dG9uIHR5cGU9XCJidXR0b25cIiBsYWJlbD1cIlJlc2V0XCIgIEBjbGljaz1cImNsZWFyRmlsdGVyKClcIiBzdHlsZT1cImhlaWdodDoyMHB4O1wiLz48L3RkPjwvdHI+XHJcbiAgPC90Ym9keT5cclxuICA8L3RhYmxlPlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cD5cclxuaW1wb3J0IHsgcmVmIH0gZnJvbSAndnVlJztcclxuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcclxuaW1wb3J0IHsgYnVzIH0gZnJvbSAnLi4vYnVzLmpzJzsgXHJcblxyXG5pbXBvcnQgSW5wdXRUZXh0IGZyb20gJ3ByaW1ldnVlL2lucHV0dGV4dCc7XHJcbmltcG9ydCBGbG9hdExhYmVsIGZyb20gJ3ByaW1ldnVlL2Zsb2F0bGFiZWwnO1xyXG5pbXBvcnQgTXVsdGlTZWxlY3QgZnJvbSAncHJpbWV2dWUvbXVsdGlzZWxlY3QnO1xyXG5cclxuaW1wb3J0IEJ1dHRvbiBmcm9tICdwcmltZXZ1ZS9idXR0b24nO1xyXG5pbXBvcnQgSWNvbkZpZWxkIGZyb20gJ3ByaW1ldnVlL2ljb25maWVsZCc7XHJcbmltcG9ydCBJbnB1dEljb24gZnJvbSAncHJpbWV2dWUvaW5wdXRpY29uJztcclxuXHJcbmNvbnN0IHF1ZXJ5ID0gcmVmKCcnKTtcclxuY29uc3QgcmVzdWx0cyA9IHJlZihbXSk7XHJcbmNvbnN0IHF1ZXJ5MiA9IHJlZignJyk7XHJcbmNvbnN0IHJlc3VsdHMyID0gcmVmKFtdKTtcclxuY29uc3QgcXVlcnkzID0gcmVmKCcnKTtcclxuY29uc3QgcmVzdWx0czMgPSByZWYoW10pO1xyXG5jb25zdCBxdWVyeTQgPSByZWYoJycpO1xyXG5jb25zdCByZXN1bHRzNCA9IHJlZihbXSk7XHJcbmNvbnN0IHF1ZXJ5NSA9IHJlZignJyk7XHJcbmNvbnN0IHJlc3VsdHM1ID0gcmVmKFtdKTtcclxuY29uc3QgY291bnRlciA9IHJlZigwKTtcclxuY29uc3QgY3JpdGVyZSA9IHJlZignJyk7XHJcbmxldCB0aW1lb3V0ID0gbnVsbDtcclxuXHJcbmNvbnN0IHNlbGVjdGVkSXRlbXMgPSByZWYoW10pO1xyXG5jb25zdCBvcHRpb25zID0gcmVmKFtdKTtcclxuY29uc3QgbG9hZGluZzIgPSByZWYoZmFsc2UpO1xyXG5sZXQgZGVib3VuY2VUaW1lciA9IG51bGw7XHJcbmNvbnN0IGlzU3VibWl0dGluZyA9IHJlZihmYWxzZSk7XHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoWydzZWFyY2gtc2VsZWN0ZWQnXSk7XHJcblxyXG5jb25zdCBoYW5kbGVJbnB1dCA9ICgpID0+IHtcclxuICBpZiAocXVlcnkudmFsdWUubGVuZ3RoIDwgMykge1xyXG4gICAgcmVzdWx0cy52YWx1ZSA9IFtdO1xyXG4gICAgcmV0dXJuOyAvLyBPbiBzb3J0IGRlIGxhIGZvbmN0aW9uLCBwYXMgZCdhcHBlbCBBUElcclxuICB9XHJcbiAgc2VuZElucHV0KHJlc3VsdHMsICdub20nKTtcclxufTtcclxuXHJcbi8vdmlsbGVcclxuY29uc3QgaGFuZGxlSW5wdXQyID0gKCkgPT4ge1xyXG4gIGlmIChxdWVyeTIudmFsdWUubGVuZ3RoIDwgMikge1xyXG4gICAgcmVzdWx0czIudmFsdWUgPSBbXTtcclxuICAgIHJldHVybjsgLy8gT24gc29ydCBkZSBsYSBmb25jdGlvbiwgcGFzIGQnYXBwZWwgQVBJXHJcbiAgfVxyXG4gIHNlbmRJbnB1dChyZXN1bHRzMiwgJ3ZpbGxlJyk7XHJcbn07XHJcblxyXG4vL3ZpbGxlXHJcbmNvbnN0IGhhbmRsZUlucHV0MyA9ICgpID0+IHtcclxuICBpZiAocXVlcnkzLnZhbHVlLmxlbmd0aCA8IDIpIHtcclxuICAgIHJlc3VsdHMzLnZhbHVlID0gW107XHJcbiAgICByZXR1cm47IC8vIE9uIHNvcnQgZGUgbGEgZm9uY3Rpb24sIHBhcyBkJ2FwcGVsIEFQSVxyXG4gIH1cclxuICBzZW5kSW5wdXQocmVzdWx0czMsICdudW1lcm8nKTtcclxufTtcclxuXHJcbi8vcnVlXHJcbmNvbnN0IGhhbmRsZUlucHV0NCA9ICgpID0+IHtcclxuICBpZiAocXVlcnk0LnZhbHVlLmxlbmd0aCA8IDIpIHtcclxuICAgIHJlc3VsdHM0LnZhbHVlID0gW107XHJcbiAgICByZXR1cm47IC8vIE9uIHNvcnQgZGUgbGEgZm9uY3Rpb24sIHBhcyBkJ2FwcGVsIEFQSVxyXG4gIH1cclxuICAgc2VuZElucHV0KHJlc3VsdHM0LCAncnVlJyk7XHJcbn07XHJcblxyXG5jb25zdCBoYW5kbGVJbnB1dDUgPSAoKSA9PiB7XHJcbiAgaWYgKHF1ZXJ5NS52YWx1ZS5sZW5ndGggPCAxKSB7XHJcbiAgICByZXN1bHRzNS52YWx1ZSA9IFtdO1xyXG4gICAgcmV0dXJuOyAvLyBPbiBzb3J0IGRlIGxhIGZvbmN0aW9uLCBwYXMgZCdhcHBlbCBBUElcclxuICB9XHJcblxyXG4gICBzZW5kSW5wdXQocmVzdWx0czUsICdudW1ydWUnKTtcclxufTtcclxuXHJcbi8vIEZvbmN0aW9uIGRlIHJlY2hlcmNoZSB2aWEgQUpBWFxyXG5jb25zdCBvbkZpbHRlciA9IChldmVudCkgPT4ge1xyXG4gICAgY29uc3QgcXVlcnkgPSBldmVudC52YWx1ZTtcclxuXHJcbiAgICBpZiAoIXF1ZXJ5IHx8IHF1ZXJ5LnRyaW0oKS5sZW5ndGggPCAyKSByZXR1cm47XHJcblxyXG4gICAgLy8gRGVib3VuY2UgcG91ciBsaW1pdGVyIGxlcyBhcHBlbHMgQVBJXHJcbiAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VUaW1lcik7XHJcbiAgICBkZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgbG9hZGluZzIudmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIFJlbXBsYWNleiBwYXIgdm90cmUgYXBwZWwgQVBJIHLDqWVsXHJcbiAgICAgICAgICAgIC8vY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hcGkuZXhlbXBsZS5jb20vc2VhcmNoP3E9JHtxdWVyeX1gKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5nZXQoJy9hcGkvc3RhbmRhcmQvc2VhcmNoJywgeyBcclxuICAgICAgICAgICAgICBwYXJhbXM6IHsgXHJcbiAgICAgICAgICAgICAgICAgbjogcXVlcnkudmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgdjogcXVlcnkyLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgIG51bTogcXVlcnkzLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgIHI6IHF1ZXJ5NC52YWx1ZSxcclxuICAgICAgICAgICAgICAgICBudW1ydWU6IHF1ZXJ5NS52YWx1ZSxcclxuICAgICAgICAgICAgICAgICBjOiAncnVlJ1xyXG4gICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbmV3UmVzdWx0cyA9IGF3YWl0IHJlc3BvbnNlLmRhdGE7XHJcblxyXG4gICAgICAgICAgICAvLyBGVVNJT04gOiBHYXJkZXIgbGVzIMOpbMOpbWVudHMgZMOpasOgIHPDqWxlY3Rpb25uw6lzICsgbGVzIG5vdXZlYXV4IHLDqXN1bHRhdHNcclxuICAgICAgICAgICAgLy8gQ2VsYSDDqXZpdGUgcXVlIGxlcyDDqWzDqW1lbnRzIGTDqWrDoCBjb2Now6lzIG5lIGRpc3BhcmFpc3NlbnQgZGUgbGEgbGlzdGVcclxuICAgICAgICAgICAgY29uc3QgYWxsT3B0aW9ucyA9IFsuLi5zZWxlY3RlZEl0ZW1zLnZhbHVlXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIG5ld1Jlc3VsdHMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghYWxsT3B0aW9ucy5maW5kKG8gPT4gby5ub21SdWUgPT09IGl0ZW0ubm9tUnVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsbE9wdGlvbnMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBvcHRpb25zLnZhbHVlID0gYWxsT3B0aW9ucztcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZHUgY2hhcmdlbWVudCBkZXMgb3B0aW9uc1wiLCBlcnJvcik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgbG9hZGluZzIudmFsdWUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9LCA0MDApOyAvLyA0MDBtcyBkZSBkw6lsYWlcclxufTtcclxuXHJcbi8vIENldHRlIGZvbmN0aW9uIGVzdCBhcHBlbMOpZSDDoCBjaGFxdWUgY2xpYyBzdXIgdW5lIGNhc2VcclxuY29uc3Qgb25TZWxlY3Rpb25DaGFuZ2UgPSBhc3luYyAoZXZlbnQpID0+IHtcclxuICAgIC8vIGV2ZW50LnZhbHVlIGNvbnRpZW50IGxhIG5vdXZlbGxlIGxpc3RlIGNvbXBsw6h0ZSBkZXMgw6lsw6ltZW50cyBzw6lsZWN0aW9ubsOpc1xyXG4gICAgY29uc3QgY3VycmVudFNlbGVjdGlvbiA9IGV2ZW50LnZhbHVlO1xyXG5cclxuICAgIFxyXG5xdWVyeTQudmFsdWUgPSBKU09OLnN0cmluZ2lmeShjdXJyZW50U2VsZWN0aW9uLm1hcChpID0+IGkubm9tUnVlKSlcclxuICBpZiAocXVlcnk0LnZhbHVlLmxlbmd0aCA8IDIpIHtcclxuICAgIHJlc3VsdHM0LnZhbHVlID0gW107XHJcbiAgICByZXR1cm47IC8vIE9uIHNvcnQgZGUgbGEgZm9uY3Rpb24sIHBhcyBkJ2FwcGVsIEFQSVxyXG4gIH1cclxuICAgLy9zZW5kSW5wdXQocmVzdWx0czQsICdydWUnKTtcclxuICAgY291bnRJbnB1dCgpXHJcbn07XHJcblxyXG5cclxuXHJcbmZ1bmN0aW9uIHNlbmRJbnB1dCh0YXJnZXRSZXN1bHRzUmVmLCBjcml0KXtcclxuICBjbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgbGV0IHJldG91cj0nJ1xyXG4gIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldCgnL2FwaS9zdGFuZGFyZC9zZWFyY2gnLCB7IFxyXG4gICAgICAgICAgcGFyYW1zOiB7IFxyXG4gICAgICAgICAgICAgbjogcXVlcnkudmFsdWUsXHJcbiAgICAgICAgICAgICB2OiBxdWVyeTIudmFsdWUsXHJcbiAgICAgICAgICAgICBudW06IHF1ZXJ5My52YWx1ZSxcclxuICAgICAgICAgICAgIHI6IHF1ZXJ5NC52YWx1ZSxcclxuICAgICAgICAgICAgIG51bXJ1ZTogcXVlcnk1LnZhbHVlLFxyXG4gICAgICAgICAgICAgYzogY3JpdFxyXG4gICAgICAgICAgfSBcclxuICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVkaXJlY3Rpb24gZm9yY8OpZSB2ZXJzIGxhIHBhZ2UgZGUgbG9naW5cclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgdGFyZ2V0UmVzdWx0c1JlZi52YWx1ZSA9IHJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgaWYodGFyZ2V0UmVzdWx0c1JlZi52YWx1ZSA8IDEpe2NvdW50ZXIudmFsdWUgPSAwO31cclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvdW50ZXIudmFsdWUgPSAwO1xyXG4gICAgICAgIHRhcmdldFJlc3VsdHNSZWYudmFsdWUgPSBbXTtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICB9XHJcbiAgfSwgMzAwKTtcclxufVxyXG5cclxuXHJcbmNvbnN0IGNvdW50SW5wdXQgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5nZXQoJy9hcGkvc3RhbmRhcmQvY291bnQnLCB7IFxyXG4gICAgICAgICAgcGFyYW1zOiB7IFxyXG4gICAgICAgICAgICAgbjogcXVlcnkudmFsdWUsXHJcbiAgICAgICAgICAgICB2OiBxdWVyeTIudmFsdWUsXHJcbiAgICAgICAgICAgICBudW06IHF1ZXJ5My52YWx1ZSxcclxuICAgICAgICAgICAgIHI6IHF1ZXJ5NC52YWx1ZSxcclxuICAgICAgICAgICAgIG51bXJ1ZTogcXVlcnk1LnZhbHVlLFxyXG4gICAgICAgICAgfSBcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb3VudGVyLnZhbHVlID0gcmVzcG9uc2UuZGF0YVswXS5jb3VudDtcclxuICAgICAgICBpZihjb3VudGVyLnZhbHVlID4gMCAmJiBjb3VudGVyLnZhbHVlIDwgMzAxKXtcclxuICAgICAgICAgICBlbWl0KCdzZWFyY2gtc2VsZWN0ZWQnLCAnbj0nK3F1ZXJ5LnZhbHVlKycmdj0nK3F1ZXJ5Mi52YWx1ZSsnJm51bT0nK3F1ZXJ5My52YWx1ZSsnJnI9JytxdWVyeTQudmFsdWUrJyZudW1ydWU9JytxdWVyeTUudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgIH1cclxufVxyXG5cclxuICAgICAgICBjb25zdCBjbGVhckZpbHRlciA9ICgpID0+IHtcclxuICAgICAgICAgICAgcmVzdWx0cy52YWx1ZSA9IFtdO1xyXG4gICAgICAgICAgICByZXN1bHRzMi52YWx1ZSA9IFtdO1xyXG4gICAgICAgICAgICByZXN1bHRzMy52YWx1ZSA9IFtdO1xyXG4gICAgICAgICAgICByZXN1bHRzNC52YWx1ZSA9IFtdO1xyXG4gICAgICAgICAgICByZXN1bHRzNS52YWx1ZSA9IFtdO1xyXG4gICAgICAgICAgICBxdWVyeS52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICBxdWVyeTIudmFsdWUgPSAnJztcclxuICAgICAgICAgICAgcXVlcnkzLnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgIHF1ZXJ5NC52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICBxdWVyeTUudmFsdWUgPSAnJztcclxuICAgICAgICAgICAgY291bnRlci52YWx1ZSA9IDA7XHJcbiAgICAgICAgICAgIG9wdGlvbnMudmFsdWUgPSBbXTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy52YWx1ZSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygncmVzZScpXHJcbiAgICAgICAgICAgIGJ1cy5lbWl0KCdyZXNldC1zdGFuZGFyZCcsICcnKTtcclxuICAgICAgICB9XHJcbmF4aW9zLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoXHJcbiAgICByZXNwb25zZSA9PiByZXNwb25zZSwgLy8gU2kgdG91dCB2YSBiaWVuLCBvbiBuZSBmYWl0IHJpZW5cclxuICAgIGVycm9yID0+IHtcclxuICAgICAgICAvLyBTaSBsJ2VycmV1ciBlc3QgdW5lIDQwMSAoTm9uIGF1dG9yaXPDqSlcclxuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2UgJiYgZXJyb3IucmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgIH1cclxuKTtcclxuXHJcbmNvbnN0IHNlbGVjdE5vbSA9IChub20pID0+IHtcclxuICBxdWVyeS52YWx1ZSA9IG5vbTtcclxuICByZXN1bHRzLnZhbHVlID0gW107IC8vIE9uIGNhY2hlIGxhIGxpc3RlIGFwcsOocyBzw6lsZWN0aW9uXHJcbiAgY291bnRJbnB1dCgpXHJcbn07XHJcblxyXG5jb25zdCBzZWxlY3RWaWxsZSA9ICh2aWxsZSkgPT4ge1xyXG4gIHF1ZXJ5Mi52YWx1ZSA9IHZpbGxlO1xyXG4gIHJlc3VsdHMyLnZhbHVlID0gW107IC8vIE9uIGNhY2hlIGxhIGxpc3RlIGFwcsOocyBzw6lsZWN0aW9uXHJcbiAgY291bnRJbnB1dCgpXHJcbn07XHJcblxyXG5jb25zdCBzZWxlY3ROdW1lcm8gPSAocG9pbnQpID0+IHtcclxuICBxdWVyeTMudmFsdWUgPSBwb2ludDtcclxuICByZXN1bHRzMy52YWx1ZSA9IFtdOyAvLyBPbiBjYWNoZSBsYSBsaXN0ZSBhcHLDqHMgc8OpbGVjdGlvblxyXG4gIGNvdW50SW5wdXQoKVxyXG59O1xyXG5cclxuY29uc3Qgc2VsZWN0UnVlID0gKHJ1ZSkgPT4ge1xyXG4gIHF1ZXJ5NC52YWx1ZSA9IHJ1ZTtcclxuICByZXN1bHRzNC52YWx1ZSA9IFtdOyAvLyBPbiBjYWNoZSBsYSBsaXN0ZSBhcHLDqHMgc8OpbGVjdGlvblxyXG4gIGNvdW50SW5wdXQoKVxyXG59O1xyXG5cclxuY29uc3Qgc2VsZWN0TnVtUnVlID0gKG51bXJ1ZSkgPT4ge1xyXG4gIHF1ZXJ5NS52YWx1ZSA9IG51bXJ1ZTtcclxuICByZXN1bHRzNS52YWx1ZSA9IFtdOyAvLyBPbiBjYWNoZSBsYSBsaXN0ZSBhcHLDqHMgc8OpbGVjdGlvblxyXG4gIGNvdW50SW5wdXQoKVxyXG59O1xyXG5cclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGU+XHJcbi5zdWdnZXN0aW9ucyB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIHRvcDogMjVweDtcclxuICBiYWNrZ3JvdW5kOiAjZmZmO1xyXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XHJcbiAgcGFkZGluZzogMDtcclxuICBtYXJnaW46IDA7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcclxuICBtYXgtaGVpZ2h0OiAxNTBweDtcclxuICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gIHotaW5kZXg6IDEwO1xyXG4gIHdpZHRoOiBhdXRvO1xyXG59XHJcbi5zdWdnZXN0aW9ucyBsaSB7XHJcbiAgcGFkZGluZzogOHB4O1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxuICBjb2xvcjojMDAwMDAwO1xyXG59XHJcbi5zdWdnZXN0aW9ucyBsaTpob3ZlciB7XHJcbiAgYmFja2dyb3VuZDogI2VlZTtcclxufVxyXG4uaGVscC10ZXh0IHtcclxuICBmb250LXNpemU6IDAuOGVtO1xyXG4gIGNvbG9yOiAjNjY2O1xyXG59XHJcbkZsb2F0TGFiZWwgLnAtaW5wdXR0ZXh0IHttYXgtd2lkdGg6IDIwMHB4ICFpbXBvcnRhbnQ7d2lkdGg6IDIwMHB4ICFpbXBvcnRhbnR9XHJcblxyXG48L3N0eWxlPiIsIjxzY3JpcHQgc2V0dXA+XG5cbmltcG9ydCB7IGNyZWF0ZUFwcCwgcmVmLCBvbk1vdW50ZWQsIG9uQmVmb3JlVW5tb3VudCwgb25Vbm1vdW50ZWQsIGdldEN1cnJlbnRJbnN0YW5jZSwgY29tcHV0ZWR9ICBmcm9tICd2dWUnO1xuXG5pbXBvcnQgeyBGaWx0ZXJNYXRjaE1vZGUsIEZpbHRlck9wZXJhdG9yIH0gZnJvbSAnQHByaW1ldnVlL2NvcmUvYXBpJztcblxuaW1wb3J0IHsgYnVzIH0gZnJvbSAnLi4vYnVzLmpzJzsgXG5pbXBvcnQgeyBGdW5jdGlvbnMgfSBmcm9tICcuL3NlcnZpY2UvRnVuY3Rpb25zJztcblxuaW1wb3J0IHsgVnVlRGF0ZVBpY2tlciB9IGZyb20gJ0B2dWVwaWMvdnVlLWRhdGVwaWNrZXInO1xuaW1wb3J0ICdAdnVlcGljL3Z1ZS1kYXRlcGlja2VyL2Rpc3QvbWFpbi5jc3MnXG5cbmltcG9ydCBTZWFyY2hTdGFuZGFyZCBmcm9tICcuL1NlYXJjaFN0YW5kYXJkLnZ1ZSc7XG5cbmltcG9ydCBQcm9ncmVzc0JhciBmcm9tICdwcmltZXZ1ZS9wcm9ncmVzc2Jhcic7XG5pbXBvcnQgRGF0YVRhYmxlIGZyb20gJ3ByaW1ldnVlL2RhdGF0YWJsZSc7XG5pbXBvcnQgQ29sdW1uIGZyb20gJ3ByaW1ldnVlL2NvbHVtbic7XG5pbXBvcnQgQ29sdW1uR3JvdXAgZnJvbSAncHJpbWV2dWUvY29sdW1uZ3JvdXAnOyAgIFxuaW1wb3J0IFJvdyBmcm9tICdwcmltZXZ1ZS9yb3cnOyAgICAgXG5pbXBvcnQgVG9nZ2xlU3dpdGNoIGZyb20gJ3ByaW1ldnVlL3RvZ2dsZXN3aXRjaCc7XG5cbmltcG9ydCBUb29sYmFyIGZyb20gJ3ByaW1ldnVlL3Rvb2xiYXInO1xuaW1wb3J0IHsgdXNlVG9hc3QgfSBmcm9tICdwcmltZXZ1ZS91c2V0b2FzdCc7XG5cbmltcG9ydCBJbnB1dFRleHQgZnJvbSAncHJpbWV2dWUvaW5wdXR0ZXh0JztcbmltcG9ydCBTZWxlY3QgZnJvbSAncHJpbWV2dWUvc2VsZWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAncHJpbWV2dWUvYnV0dG9uJztcbmltcG9ydCBUZXh0YXJlYSBmcm9tICdwcmltZXZ1ZS90ZXh0YXJlYSc7XG5cbmltcG9ydCBEaWFsb2cgZnJvbSAncHJpbWV2dWUvZGlhbG9nJztcblxuaW1wb3J0IEljb25GaWVsZCBmcm9tICdwcmltZXZ1ZS9pY29uZmllbGQnO1xuaW1wb3J0IElucHV0SWNvbiBmcm9tICdwcmltZXZ1ZS9pbnB1dGljb24nO1xuXG5pbXBvcnQgQ2hlY2tib3ggZnJvbSAncHJpbWV2dWUvY2hlY2tib3gnO1xuaW1wb3J0IENoZWNrYm94R3JvdXAgZnJvbSAncHJpbWV2dWUvY2hlY2tib3hncm91cCc7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBwYXJhbTogIHtcbiAgICB0eXBlOiBPYmplY3QsIFxuICAgIHJlcXVpcmVkOiB0cnVlIFxuICB9XG59KTtcblxuICAgICAgICBjb25zdCBldGF0cyA9IHJlZigpO1xuICAgICAgICBjb25zdCBsaXN0ZWFnZW50cyA9IHJlZigpO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHJlZigzMDApO1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VfdGVtcCA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlc190eXBlcyA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlc1R5cGUgPSByZWYoW10pOyBcblxuICAgICAgICBjb25zdCBwb2ludHMgPSByZWYoW10pOyAvLyBMYSBsaXN0ZSBzZXJhIGNoYXJnw6llIGV0IG1pc2Ugw6Agam91ciB2aWEgTWVyY3VyZS9BUElcbiAgICAgICAgY29uc3QgZXhwYW5kZWRSb3dzID0gcmVmKFtdKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXVyID0gcmVmKCcnKTtcbiAgICAgICAgY29uc3Qgbm9tYnJlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHBvdXJjZW50ID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VTTVM9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlRXhjZWw9IHJlZigpO1xuICAgICAgICAvL2NvbnN0IG9wdGlvbnMgPSByZWYoW10pO1xuICAgICAgICBsZXQgc2VsZWN0aW9uID0gMDtcbiAgICAgICAgbGV0IHNlbCA9IDA7XG4gICAgICAgIGxldCBzZWFyY2ggPSAwO1xuICAgICAgICBjb25zdCBtYVZhbGV1ciA9IHJlZigwKVxuICAgICAgICBjb25zdCBzaG93V2l0aFJWID0gcmVmKHRydWUpO1xuICAgICAgICBsZXQgc2VsZWN0ZWQgPSAnJztcbiAgICAgICAgY29uc3QgbW9pcyA9IHJlZigpO1xuICAgICAgICBjb25zdCBzdGFydERhdGUgPSByZWYoKTtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHJlZihuZXcgRGF0ZSgpKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcklEID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IGxvYWRpbmcgPXJlZigpO1xuICAgICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoTm9tID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU3RhdHVzID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVGFiID0gcmVmKFtdKTtcblxuICAgICAgICBjb25zdCBzZWFyY2hOdW1lcm9QaHlzaXF1ZSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hOdW1lcm9DbGllbnQgPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoTm9tUnVlID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaERhdGVSViA9IHJlZignVG91dGVzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hRdWFydGllciA9IHJlZignVG91cycpO1xuICAgICAgICBjb25zdCBzZWFyY2hWaWxsZSA9IHJlZignVG91dGVzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hFdGF0ID0gcmVmKCdUb3VzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hUZWwgPSByZWYoJycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoQ2x1c3RlciA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMiA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMyA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyNCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyNSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hFbXBsYWNlbWVudCA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoQWdlbnQgPSByZWYoJ1RvdXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaExpYmVsbGUgPSByZWYoJ1RvdXMnKTsgXG4gICAgICAgIGNvbnN0IHNsb3RQcm9wcyA9IHJlZigpOyBcblxuICAgICAgICBjb25zdCBjbGlja2VkUm93SWQgPSByZWYobnVsbCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVGFibGVQb2ludHMgPSByZWYoW10pOyBcbiAgICAgICAgY29uc3QgQ29sb3JzID0gcmVmKFtdKTsgXG5cbiAgICAgICAgY29uc3QgZXhwYW5kZWRSb3dzVGFiID0gcmVmKFtdKTtcbiAgICAgICAgY29uc3QgdG9hc3QgPSB1c2VUb2FzdCgpO1xuICAgICAgICBjb25zdCBwcm9kdWN0RGlhbG9nID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgZXhjZWxEaWFsb2cgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBwcm9kdWN0ID0gcmVmKHt9KTtcbiAgICAgICAgY29uc3Qgc3VibWl0dGVkID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWYoMCk7XG4gICAgICAgIGNvbnN0IGRhdGFDcmVuZWF1ID0ge307XG4gICAgICAgIGNvbnN0IGRhdGVFeGNlbCA9IHt9O1xuICAgICAgICBjb25zdCBkYXRhQ2FydGUgPSB7fTtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gKGRhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKTtcbiAgICAgICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSsxO1xuICAgICAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9kdWN0cyA9IHJlZih7fSk7XG4gICAgICAgIGNvbnN0IG1ldGFLZXkgPSByZWYodHJ1ZSk7XG5cbmNvbnN0IHNlbGVjdGVkU2VhcmNoID0gcmVmKG51bGwpO1xuXG5jb25zdCBoYW5kbGVTZWxlY3Rpb24gPSAoc2VhcmNoKSA9PiB7XG4gIC8vY29uc29sZS5sb2coXCJTZWFyY2ggcmXDp3VlIGR1IGNvbXBvc2FudCBlbmZhbnQgOlwiLCBzZWFyY2gpO1xuICBzZWxlY3RlZFNlYXJjaC52YWx1ZSA9IHNlYXJjaDtcbiAgZmV0Y2hQb2ludHMoc2VhcmNoKVxuXG59O1xuXG4vL0NFTlRSQUxFIERFIENPTU1VTklDQVRJT05cbiAgICAgICAgLy8gRm9uY3Rpb24gcG91ciByw6ljdXDDqXJlciBsZXMgaW5pdGlhdXggZGVwdWlzIGwnQVBJIFN5bWZvbnlcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZldGNoUG9pbnRzIChzZWFyY2gpeyAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAvLyB5b3VyIG9wdGlvbnMuLi4gbWV0aG9kOiBQT1NULCBoZWFkZXJzLCBjb3JzLCBldGMuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGUudmFsdWUgPSAnJ1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkVGFiLnZhbHVlID0gW107XG4gICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy9zdGFuZGFyZD8nK3NlYXJjaCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGF0YS5zdGF0dXMnK2RhdGEuc3RhdHVzKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWRpcmVjdGlvbiBmb3Jjw6llIHZlcnMgbGEgcGFnZSBkZSBsb2dpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY2hhcmdlbWVudCBwb2ludHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWUgPSBkYXRhLnJlc3BvbnNlLm1hcChwID0+ICh7IC4uLnAsIGlzRWRpdGluZzogZmFsc2UsIG9yaWdpbmFsOiB7fSwgc2VsZWN0ZWQ6IGZhbHNlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0SXRlbSA9IHBvaW50cy52YWx1ZS5maW5kKHg9PnghPT11bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZWFyY2ggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBzZWFyY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0UG9pbnQocG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtjb25zb2xlLmxvZyhlcnJvcik7d2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzt9KSAvLyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggZXJyb3JcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBjaGFuZ2VfYWxlcnRlKHBvaW50KXsgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLy8geW91ciBvcHRpb25zLi4uIG1ldGhvZDogUE9TVCwgaGVhZGVycywgY29ycywgZXRjLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEZ1bmN0aW9ucy5tYWtlUmVxdWVzdCgnL2FwaS9wb2ludHMvYWxlcnRlLycrcG9pbnQuaWQrJy8nK3BvaW50LmFsZXJ0ZSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7Y29uc29sZS5sb2coZXJyb3IpO3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7fSkgLy8gZG8gc29tZXRoaW5nIHVzZWZ1bCB3aXRoIGVycm9yXG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0SW5mb3MoZGF0YSl7ICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHBvaW50czogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRlLnZhbHVlPScnXG4gICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy9nZXRWMi8nLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGF0YS5zdGF0dXMnK2RhdGEuc3RhdHVzKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzcG9uc2UuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleDIgPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gZWxlbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2ludEluZGV4MiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4Ml0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4MyA9IGZpbHRlcmVkUG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2ludEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFBvaW50cy52YWx1ZVtwb2ludEluZGV4M10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5lbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IGZyb3plblBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBlbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQ2FydGUuY291bGV1ciA9IGVsZW1lbnQuY291bGV1cjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQ2FydGUuY2x1c3RlcklkID0gZWxlbWVudC5jbHVzdGVyNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQ2FydGUubWlzc2lvbiA9IGVsZW1lbnQubWlzc2lvbi5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMuZW1pdCgnY2FydGUtcmVmcmVzaCcsIGRhdGFDYXJ0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BvaW50cy52YWx1ZVtwb2ludEluZGV4XSA9IHByb2R1Y3QudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaGlkZURpYWxvZygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7Y29uc29sZS5sb2coZXJyb3IpO3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7fSkgLy8gZG8gc29tZXRoaW5nIHVzZWZ1bCB3aXRoIGVycm9yXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaGFuZGxlTWVyY3VyZU1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpOyBcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coYE1lcmN1cmUgbWVzc2FnZSByZWNlaXZlZCA6YCwgZGF0YSk7XG4gICAgICAgICAgICBkYXRhLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gZWxlbWVudC5hY3Rpb247XG4gICAgICAgICAgICAgICAgdmFyIHJlZnJlc2hfY3JlbmVhdSA9IDA7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgLy9taXNlIMOgIGpvdXIgZGVzIGNsdXN0ZXJzIGNvbXBsZXRcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2x1c3Rlcl9jb21wbGV0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NsdXN0ZXJzY29tcGxldGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogZWxlbWVudCwgLy8gUGFzcyB5b3VyIGRhdGEgaW4gdGhlICdkZXRhaWwnIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlYWZsZXRtYXAnKS5jb250ZW50V2luZG93LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJvZHVjdF91cGRhdGVkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5mb3MoZWxlbWVudC5wb2ludHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoX2NyZW5lYXUgPSAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY3JlbmVhdV91cGRhdGVkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfY3JlbmVhdSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFVwZGF0ZShlbGVtZW50LmRvbm5lZXMubm9tYnJlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHJlZnJlc2hfY3JlbmVhdSA9PSAxKXtcbiAgICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS11cGRhdGVkJywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbi8vIElOVEVSRkFDRVxuXG4gICAgICAgIC8vIFByb3ByacOpdMOpIGNhbGN1bMOpZSBxdWkgcmVudmVycmEgbGEgbGlzdGUgZmlsdHLDqWUgw6AgbGEgRGF0YVRhYmxlXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkUG9pbnRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9uIGNvbW1lbmNlIGF2ZWMgdW5lIGNvcGllIGRlIHRvdXRlcyBsZXMgZG9ubsOpZXNcbiAgICAgICAgICAgIGxldCBwb2ludHNUb0ZpbHRlciA9IFsuLi5wb2ludHMudmFsdWVdO1xuXG4gICAgICAgICAgICBjb3VudC52YWx1ZSA9IHBvaW50c1RvRmlsdGVyLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBwb2ludHNUb0ZpbHRlcjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2xlYXJGaWx0ZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBzZWFyY2hOb20udmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaEV0YXQudmFsdWUgPSAnVG91cyc7XG4gICAgICAgICAgICBzZWFyY2hRdWFydGllci52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaExpYmVsbGUudmFsdWUgPSAnVG91cyc7XG4gICAgICAgICAgICBzZWFyY2hUZWwudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaFZpbGxlLnZhbHVlID0gJ1RvdXRlcyc7XG4gICAgICAgICAgICBzZWFyY2hOb21SdWUudmFsdWUgPSAnVG91dGVzJztcbiAgICAgICAgICAgIHNlYXJjaE51bWVyb0NsaWVudC52YWx1ZSAgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaE51bWVyb1BoeXNpcXVlLnZhbHVlICA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoQ2x1c3RlcjEudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaENsdXN0ZXIyLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hDbHVzdGVyMy52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoQ2x1c3RlcjQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaENsdXN0ZXI1LnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hDbHVzdGVyLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hEYXRlUlYudmFsdWUgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb24gcmVjb2l0IHVuIG1lc3NhZ2UgZGUgbGVhZmxldFxuICAgICAgICBjb25zdCB1cGRhdGVDbHVzdGVyID0gKGNsdXN0ZXJTZWFyY2gpID0+IHtcbiAgICAgICAgICAgIGNsZWFyRmlsdGVyKCk7XG4gICAgICAgICAgICB2YXIgc2VhcmNoID0gJ2NsdXN0ZXI9JytjbHVzdGVyU2VhcmNoLnZhbHVlO1xuICAgICAgICAgICAgZmV0Y2hQb2ludHMgKHNlYXJjaCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnY2xpYyByZWNpZXZlZCcgKyBjbHVzdGVyU2VhcmNoLnR5cGUgKydpZCcrICsgY2x1c3RlclNlYXJjaC52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL29uIHLDqWluaXRhbGlzZSBsJ2FmZmljaGFnZSwgb24gbMOodmUgbGUgbG9ja1xuICAgICAgICBjb25zdCBnbG9iYWxFeHRlcm5hbENhbGwgPSAoY2x1c3Rlcl9pZCwgc2VsKSA9PiB7XG4gICAgICAgICAgICAvL3NlbmRMb2NrKG51bGwsIDIpO1xuICAgICAgICAgICAgc2VhcmNoID0gc2VsO1xuICAgICAgICAgICAgZmV0Y2hQb2ludHMoY2x1c3Rlcl9pZCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZWRpdFBvaW50ID0gKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50cy52YWx1ZS5maW5kKHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKHBvaW50KSB7XG4gICAgICAgICAgICAgICAgcG9pbnQub3JpZ2luYWwgPSB7IC4uLnBvaW50IH07XG4gICAgICAgICAgICAgICAgcG9pbnQuaXNFZGl0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdwb2ludEMnK3BvaW50LmlkKTtcbiAgICAgICAgICAgICAgICBpZiAocG9pbnQuY3JlbmVhdSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwb2ludC5jcmVuZWF1ID0ge307XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNyZW5lYXUuaWQgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9zZW5kTG9jayhwb2ludCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2FuY2VsRWRpdCA9IChpZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAocG9pbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSB7IC4uLnBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5vcmlnaW5hbCwgaXNFZGl0aW5nOiBmYWxzZSwgb3JpZ2luYWw6IHt9IH07XG4gICAgICAgICAgICAgICAgLy9zZW5kTG9jayhwb2ludHMudmFsdWVbcG9pbnRJbmRleF0sIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHNlbmRJbmZvcyhpZCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzZW5kSW5mb3MnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBwcm9kdWN0LnZhbHVlLmNvbW1lbnRhaXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2libGU6IHByb2R1Y3QudmFsdWUuY29tcHRldXJBY2Nlc3NpYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpdmlsaXRlOiBwcm9kdWN0LnZhbHVlLmNpdmlsaXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbTogcHJvZHVjdC52YWx1ZS5ub20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJvQ2xpZW50OiBwcm9kdWN0LnZhbHVlLm51bWVyb0NsaWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWwxOiBwcm9kdWN0LnZhbHVlLnRlbDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsMjogcHJvZHVjdC52YWx1ZS50ZWwyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiBwcm9kdWN0LnZhbHVlLmVtYWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YXQ6IHByb2R1Y3QudmFsdWUuZXRhdC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VudDogcHJvZHVjdC52YWx1ZS5hZ2VudC5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL3VwZGF0ZVYyLycraWQsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc2VjdXJpdMOpIG1lcmN1cmUgZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEluZm9zKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS11cGRhdGVkJywgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QuaXNFZGl0aW5nID0gZmFsc2U7IC8vIFNvcnRpciBkdSBtb2RlIMOpZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtjb25zb2xlLmxvZyhlcnJvcik7Ly93aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2VuZEV4Y2VsKCl7XG4gICAgICAgICAgICBoaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICBsZXQgY2hhaW5lID0gJyc7XG4gICAgICAgICAgICBmcm96ZW5Qb2ludHMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoYWluZSA9IGNoYWluZSArIGVsZW1lbnQuaWQgKyAnLCc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZmlsdGVyZWRQb2ludHMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoYWluZSA9IGNoYWluZSArIGVsZW1lbnQuaWQgKyAnLCc7XG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjaGFpbmUuc2xpY2UoMCwgLTEpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmZXRjaCgnL2FkbWluL2V4Y2VsL2V4cG9ydC8nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluZTogY2hhaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3Npb25faWQ6IHByb3BzLnBhcmFtLm1pc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYmxvYigpKS50aGVuKGRhdGEgPT4gd2luZG93Lm9wZW4oVVJMLmNyZWF0ZU9iamVjdFVSTChkYXRhKSkpXG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGV4Y2VsXCIpO1xuICAgICAgICAgICAgIH0gICBcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpc3RhbmNlVXBkYXRlID0gKHBvaW50LCBkaXN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gcG9pbnQpO1xuICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUub3BlcmF0aW9uID0gcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLm9wZXJ0YWlvbi5pZDtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5wb2ludCA9IHBvaW50O1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LmRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUuZGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUuYWdlbnQgPSBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uYWdlbnQuaWQ7XG4gICAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NyZW5lYXUtdG9VcGRhdGUnLCBkYXRhQ3JlbmVhdSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYXJ0ZVVwZGF0ZSA9IChwb2ludCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gcG9pbnQpO1xuICAgICAgICAgICAgICAgIGRhdGFDYXJ0ZS5jbHVzdGVySWQgPSBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uY2x1c3RlcjU7XG4gICAgICAgICAgICAgICAgZGF0YUNhcnRlLm1pc3Npb24gPSBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0ubWlzc2lvbi5pZDtcbiAgICAgICAgICAgICAgICBkYXRhQ2FydGUub3BlcmF0aW9uID0gcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLm9wZXJ0YWlvbi5pZDtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0YUNhcnRlLm9wJytkYXRhQ2FydGUub3BlcmF0aW9uKVxuXG4gICAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NhcnRlLXRvVXBkYXRlJywgZGF0YUNhcnRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsVXBkYXRlID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3JlY3Vub21icmUnK2RhdGEpO1xuICAgICAgICAgICAgICAgdmFsdWUudmFsdWUgPSBNYXRoLnJvdW5kKGRhdGEqMTAwIC8gdG90YWwudmFsdWUpO1xuICAgICAgICAgICAgICAgbm9tYnJlLnZhbHVlID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZnVuY3Rpb24gc2VsZWN0ZWRQb2ludHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHBvaW50cy52YWx1ZS5maWx0ZXIocG9pbnQgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhwb2ludC5zZWxlY3RlZCk7XG4gICAgICAgICAgICByZXR1cm4gKHBvaW50LnNlbGVjdGVkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBzZWFyY2hEYXRlQ3JlbmVhdShpZCkge1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LnBvaW50ID0gaWQ7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUuZGlzdGFuY2UgPSAncmVzZXQnO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LmRhdGUgPSBmb3JtYXREYXRlKGRhdGUudmFsdWUpO1xuICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS10b1VwZGF0ZScsIGRhdGFDcmVuZWF1KTtcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkxhIGRhdGUgYSDDqXTDqSBzw6lsZWN0aW9ubsOpZSA6XCIsIGZvcm1hdERhdGUoZGF0ZS52YWx1ZSkpO1xuXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGVUb0Zvcm1hdCl7XG4gICAgICAgICAgaWYgKCFkYXRlVG9Gb3JtYXQpIHJldHVybiAnJztcbiAgICAgICAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZVRvRm9ybWF0LmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlVG9Gb3JtYXQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7IC8vIExlcyBtb2lzIHNvbnQgaW5kZXjDqXMgw6AgcGFydGlyIGRlIDBcbiAgICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZVRvRm9ybWF0LmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbkRyb3AgPSBhc3luYyhldnQsIGxpc3QpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtSUQgPSBldnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ2l0ZW1JRCcpXG4gICAgICAgICAgY29uc3QgYWdlbnRJRCA9IGV2dC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgnYWdlbnRJRCcpXG4gICAgICAgICAgY29uc3QgdG90YWxDcmVuZWF1ID0gZXZ0LmRhdGFUcmFuc2Zlci5nZXREYXRhKCd0b3RhbENyZW5lYXUnKVxuICAgICAgICAgIGlmKHRvdGFsQ3JlbmVhdSA+PTMwKXtcbiAgICAgICAgICAgIGlmICghd2luZG93LmNvbmZpcm0oXCJBdHRlbnRpb24sIG1heCAzMCBwYXIgY3LDqW5lYXUgaG9yYWlyZSA6IHNvdWhhaXRleiB2b3VzIGNvbmZpcm1lciA/XCIpKXtyZXR1cm47fVxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgY29uZmlybSA9IDA7XG4gICAgICAgICAgc2VsZWN0ZWQgPSAnXCJzZWxlY3RlZFwiIDogWyc7XG4gICAgICAgICAgaWYoZnJvemVuUG9pbnRzLnZhbHVlLmxlbmd0aCA9PSAwKXthbGVydCgnTWVyY2kgZGUgc8OpbGVjdGlvbm5lciBhdSBtb2lucyB1biBwb2ludCcpO3JldHVybjt9XG4gICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWQgKyBlbGVtZW50LmlkICsgXCIsXCI7XG4gICAgICAgICAgICBpZihlbGVtZW50LmFnZW50LmlkICE9IGFnZW50SUQpe2NvbmZpcm0gPSAxO31cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkLnNsaWNlKDAsIC0xKSArICddJztcbiAgICAgICAgICBzZWxlY3RlZCA9ICd7XCJpZFwiOicrIGl0ZW1JRCArICcsJyArIHNlbGVjdGVkICsnfSc7XG4gICAgICAgICAgaWYoY29uZmlybSA9PSAxKXtcbiAgICAgICAgICAgIGlmICghd2luZG93LmNvbmZpcm0oXCJBdHRlbnRpb24sIGFnZW50cyBkaWZmw6lyZW50cyA6IHNvdWhhaXRleiB2b3VzIGNvbmZpcm1lciA/XCIpKXtyZXR1cm47fVxuICAgICAgICAgIH1cbiAgICAgICAgICAvL2NvbnNvbGUubG9nKCdzZWxlY3RlZCcgKyBzZWxlY3RlZCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW52b3llciBsZXMgbW9kaWZpY2F0aW9ucyDDoCBsJ0FQSSBTeW1mb255XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvcG9pbnRzL2NyZW5lYXUvdXBkYXRlL2AsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgcsOpc2VhdSB1cGRhdGUgY2VyZW5hdSA6XCIsIGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciByw6lzZWF1IHVwZGF0ZSBjZXJlbmF1XCIpO1xuICAgICAgICAgICAgICAgICAgICAvL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9zZWN1cml0w6kgbWVyY3VyZSBkb3duXG4gICAgICAgICAgICAgIGZyb3plblBvaW50cy52YWx1ZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZ2V0SW5mb3MoZWxlbWVudC5pZCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS11cGRhdGVkJywgJycpO1xuICAgICAgICAgICAgLy9yZXNldCBkZXMgZnJvemVuXG4gICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlPVtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VuZFRlbCA9IGFzeW5jKHBvaW50LCB0ZWwpID0+IHtcbiAgICAgICAgICAgICAgICBpZih0ZWwubGVuZ3RoID09IDkpe3RlbCA9ICcwJyArIHRlbDt9XG4gICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oJ3RlbDonK3RlbCwgJ19ibGFuaycpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdGVsLycrcG9pbnQuaWQrJy9zZW5kJywge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvL21lc3NhZ2V1cj0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgLy9zZWN1IG1lcmN1cmUgZG93blxuICAgICAgICAgICAgICAgIGdldEluZm9zKHBvaW50LmlkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyYW50VGVsID0gYXN5bmMocG9pbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3RlbC8nK3BvaW50LmlkKycvZW50cmFudCcsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ1RlbCBlbnRyYW50IGVucmVnaXN0csOpJztcbiAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgIC8vc2VjdSBtZXJjdXJlIGRvd25cbiAgICAgICAgICAgICAgICBnZXRJbmZvcyhwb2ludC5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VuZFNNUyA9IGFzeW5jKHBvaW50LCB0ZWwpID0+IHtcbiAgICAgICAgICAgICAgICBpZih0ZWwubGVuZ3RoID09IDkpe3RlbCA9ICcwJyArIHRlbDt9XG4gICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSBtZXNzYWdlcy52YWx1ZS5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnR5cGUgPT09IDJcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgbWVzc2FnZXRlbXAudmFsdWUgPSBtZXNzYWdlLnZhbHVlWzBdLnRleHRlLnJlcGxhY2UoXCJOT01cIiwgcG9pbnQuY2l2aWxpdGUrJyAnK3BvaW50Lm5vbSk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXRlbXAudmFsdWUgPSBtZXNzYWdldGVtcC52YWx1ZS5yZXBsYWNlKFwiQURSRVNTRVwiLCBwb2ludC5udW1lcm9SdWUrJyAnKyBwb2ludC50aXRyZVJ1ZSsnICcrcG9pbnQubm9tUnVlKycgJytwb2ludC5jb2RlUG9zdGFsKycgJytwb2ludC52aWxsZSk7XG4gICAgICAgICAgICAgICAgbGV0IGxpZW4gPSAgJ2h0dHBzOi8vJyt3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUrJy9lYWUvY29ubmVjdC8nK29wZXJhdGlvbklELnZhbHVlKycvJytwb2ludC5pZDtcbiAgICAgICAgICAgICAgICBtZXNzYWdldGVtcC52YWx1ZSA9IG1lc3NhZ2V0ZW1wLnZhbHVlLnJlcGxhY2UoXCJMSUVOXCIsIGxpZW4pO1xuICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUpe1xuICAgICAgICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXRlbXAudmFsdWUgPSBtZXNzYWdldGVtcC52YWx1ZS5yZXBsYWNlKFwiREFURVwiLCBwb2ludC5jcmVuZWF1LmRhdGUrJyAnKyBwb2ludC5jcmVuZWF1LmNyZW5lYXVIb3JhaXJlLm5vbSArJyBBZ2VudCA6ICcrcG9pbnQuY3JlbmVhdS5hZ2VudC5ub20pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBlbmNvZGVkVGV4dCA9IGVuY29kZVVSSUNvbXBvbmVudChtZXNzYWdldGVtcC52YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAvKiovXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9zbXMvJytwb2ludC5pZCsnLycrbWVzc2FnZS52YWx1ZVswXS5pZCsnL3NlbmQnLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgLy8gbWVzc2FnZXVyPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgLy9zZWN1IG1lcmN1cmUgZG93blxuICAgICAgICAgICAgICAgIGdldEluZm9zKHBvaW50LmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRFbWFpbCA9IGFzeW5jKGlkKSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gbWVzc2FnZXMudmFsdWUuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC50eXBlID09PSAyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFpbC8nK2lkKycvJyttZXNzYWdlLnZhbHVlWzBdLmlkKycvbWFpbHNlbmQnLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge21lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIGVudm9pIG1haWxcIjt9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IGRhdGEuZGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciByw6lzZWF1XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vc2VjdSBtZXJjdXJlIGRvd25cbiAgICAgICAgICAgICAgICBnZXRJbmZvcyhpZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWxldGVfbG9nPSBhc3luYyhpZCkgPT4ge1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvbG9nL2RlbGV0ZS8nK2lkLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge21lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIGVudm9pIGRlbGV0ZVwiO31cbiAgICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ2RlbGV0ZSBvaydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIHLDqXNlYXVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJldXIgcsOpc2VhdVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3NlY3UgbWVyY3VyZSBkb3duXG4gICAgICAgICAgICAgICAgZ2V0SW5mb3MoaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93Q2xhc3MgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7ICdjdXN0b20tZnJvemVuLXJvdyc6IGRhdGEuZnJvemVuIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2hlY2tUZWwgPSAodGVsKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCd0ZWwnK3RlbClcbiAgICAgICAgICAgICAgaWYgKCF0ZWwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSAvXig2fDA2fDd8MDcpLzsgXG4gICAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KFN0cmluZyh0ZWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlZGlyZWN0ID0gKG9wSWQsaWQpID0+IHtcbiAgICAgICAgICAgIHdpbmRvdy50b3AubG9jYXRpb24uaHJlZj1cIi9hZG1pbi9jYXJ0ZS8xL1wiK29wSWQrJy8nK2lkO1xuICAgICAgICB9XG5cbi8vbGVzIHBvaW50cyBzw6lsZWN0aW9ubsOpc1xuXG4vL0VWRU5UIElOVEVSRkFDRSAgXG4gICAgICAgICAgICBjb25zdCBnZXRMYXN0UGxhbmlmaWVkRGF0ZSA9IChwb2ludCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXBvaW50LmxvZ2V0YXRzIHx8IHBvaW50LmxvZ2V0YXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgICAgICAgLy8gMS4gRmlsdHJlciBsZXMgbG9ncyBwYXIgaWQgZCfDqXRhdCA1XG4gICAgICAgICAgICAgIGNvbnN0IHBsYW5pZmllcyA9IHBvaW50LmxvZ2V0YXRzLmZpbHRlcihsb2cgPT4gbG9nLmV0YXQuaWQgPT09IDUpO1xuXG4gICAgICAgICAgICAgIC8vIDIuIFbDqXJpZmllciBzJ2lsIHkgZW4gYSBhdSBtb2lucyB1blxuICAgICAgICAgICAgICBpZiAocGxhbmlmaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiSmFtYWlzIHBsYW5pZmnDqVwiO1xuXG4gICAgICAgICAgICAgIC8vIDMuIFLDqWN1cMOpcmVyIGxlIGRlcm5pZXIgKGVuIHN1cHBvc2FudCBxdWUgbGUgSlNPTiBlc3QgdHJpw6kgcGFyIGRhdGUvSUQgY3JvaXNzYW50KVxuICAgICAgICAgICAgICAvLyBTaSB2b3VzIG4nw6p0ZXMgcGFzIHPDu3IgZHUgdHJpLCB2b3VzIHBvdXZleiBham91dGVyIC5zb3J0KChhLCBiKSA9PiBiLmlkIC0gYS5pZCkgYXZhbnQgbGUgWzBdXG4gICAgICAgICAgICAgIGNvbnN0IGRlcm5pZXJMb2cgPSBwbGFuaWZpZXNbcGxhbmlmaWVzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgICAgICAgIHJldHVybiBkZXJuaWVyTG9nLmRhdGVjcmVhO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFxuICAgICAgICBjb25zdCBpc0FsbFNlbGVjdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbHRlcmVkUG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgLy8gT24gdsOpcmlmaWUgc2kgY2hhcXVlIHByb2R1aXQgZGUgbGEgbGlzdGUgYSBzYSBjbMOpIMOgICd0cnVlJyBkYW5zIGwnb2JqZXQgZGUgc8OpbGVjdGlvblxuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkUG9pbnRzLnZhbHVlLmV2ZXJ5KHAgPT4gc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZVtwLmlkXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRvZ2dsZUFsbCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJlZFBvaW50cy52YWx1ZS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgICAgIGFsZXJ0KFwiSW1wb3NzaWJsZSBkZSB0b3V0IHPDqWxlY3Rpb25uZXIgOiB0cm9wIGRlIHLDqXN1bHRhdHMgKD4xMCkuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0FsbFNlbGVjdGVkLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZSA9IHt9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5vbiAtPiBvbiBjb25zdHJ1aXQgdW4gb2JqZXQgYXZlYyB0b3VzIGxlcyBJRHMgKFPDqWxlY3Rpb24gdG90YWxlKVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHt9O1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkUG9pbnRzLnZhbHVlLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1NlbGVjdGlvbltwLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZSA9IG5ld1NlbGVjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0b2dnbGVSb3cgPSAocHJvZHVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBwcm9kdWN0LmlkO1xuICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9ICEhc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZVtpZF07XG5cblxuICAgICAgICAgICAgLy8gQ3LDqWF0aW9uIGQndW5lIGNvcGllIHBvdXIgbGEgcsOpYWN0aXZpdMOpXG4gICAgICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB7IC4uLnNlbGVjdGVkUHJvZHVjdHMudmFsdWUgfTtcblxuICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV3U2VsZWN0aW9uW2lkXTsgLy8gT24gcmV0aXJlIGxhIGNsw6lcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRhYi52YWx1ZVtpZF0gPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3U2VsZWN0aW9uW2lkXSA9IHRydWU7IC8vIE9uIGFqb3V0ZSBsYSBjbMOpXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWIudmFsdWVbaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZSA9IG5ld1NlbGVjdGlvbjtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmcm96ZW5Qb2ludHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRQb2ludHMudmFsdWUuZmlsdGVyKHAgPT4gc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZVtwLmlkXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHVuc2VsZWN0ZWRQb2ludHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRQb2ludHMudmFsdWUuZmlsdGVyKHAgPT4gIXNlbGVjdGVkUHJvZHVjdHMudmFsdWVbcC5pZF0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBvblJvd0V4cGFuZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgZXhwYW5kZWRSb3dzLnZhbHVlID0geyBbZXZlbnQuZGF0YS5pZF06IHRydWUgfTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2RlcGxveSBpZCcgKyBldmVudC5kYXRhLmlkKVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlZGl0UHJvZHVjdCA9IChwcm9kKSA9PiB7XG4gICAgICAgICAgICBwcm9kdWN0LnZhbHVlID0gey4uLnByb2R9O1xuICAgICAgICAgICAgcHJvZHVjdERpYWxvZy52YWx1ZSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV4cG9ydEV4Y2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgZXhjZWxEaWFsb2cudmFsdWUgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoaWRlRGlhbG9nID0gKCkgPT4ge1xuICAgICAgICAgICAgZXhjZWxEaWFsb2cudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHByb2R1Y3REaWFsb2cudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHN1Ym1pdHRlZC52YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9O1xuXG4vL0RFTUFSUkFHRVxuXG4gICAgICAgIGxldCBldmVudFNvdXJjZSA9IG51bGw7XG4gICAgICAgIGNvbnN0IGh1YlVybCA9IFwiaHR0cHM6Ly9tZXJjdXJlLmVhZS1jb25uZWN0LmNvbS8ud2VsbC1rbm93bi9tZXJjdXJlXCI7XG4gICAgICAgIGNvbnN0IHRvcGljID0gXCIvY2FydGVcIjtcblxuICAgICAgICBjb25zdCBjb25uZWN0VG9NZXJjdXJlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChodWJVcmwpO1xuICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJ0b3BpY1wiLCB0b3BpYyk7XG5cbiAgICAgICAgICAgIC8vIE5vdGU6IFNpIHZvdXMgdXRpbGlzZXogdW4gSldULCBhc3N1cmV6LXZvdXMgZGUgbGUgcsOpZ8OpbsOpcmVyIGljaSBzaSBiZXNvaW5cbiAgICAgICAgICAgIGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICAgICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGhhbmRsZU1lcmN1cmVNZXNzYWdlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKCdjYXJ0ZScsIGhhbmRsZU1lcmN1cmVNZXNzYWdlKTtcblxuICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgRXZlbnRTb3VyY2UgKGTDqWNvbm5leGlvbikgOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlLnJlYWR5U3RhdGUgPT09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRlbnRhdGl2ZSBkZSByZWNvbm5leGlvbiBkYW5zIDIgc2Vjb25kZXMuLi5cIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyAzLiBUZW50ZXIgdW5lIHJlY29ubmV4aW9uIGFwcsOocyB1biBkw6lsYWlcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0VG9NZXJjdXJlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGV2ZW50U291cmNlLm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNvbm5leGlvbiBhdSBIdWIgTWVyY3VyZSByw6l1c3NpZSAhXCIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICBvbk1vdW50ZWQoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RUb01lcmN1cmUoKTtcblxuICAgICAgICAgICAgICAgICAgICBtb2lzLnZhbHVlID0gcHJvcHMucGFyYW0ubW9pcztcbiAgICAgICAgICAgICAgICAgICAgdG90YWwudmFsdWUgPSBwcm9wcy5wYXJhbS50b3RhbDtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlLnZhbHVlID0gcHJvcHMucGFyYW0uc3RhcnREYXRlO1xuICAgICAgICAgICAgICAgICAgICBub21icmUudmFsdWUgPSBwcm9wcy5wYXJhbS5ub21icmU7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsLnZhbHVlID0gcHJvcHMucGFyYW0udG90YWw7XG4gICAgICAgICAgICAgICAgICAgIHBvdXJjZW50LnZhbHVlID0gTWF0aC5yb3VuZChwcm9wcy5wYXJhbS5ub21icmUqMTAwIC8gcHJvcHMucGFyYW0udG90YWwpO1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVySUQudmFsdWUgPSBwcm9wcy5wYXJhbS5jbHVzdGVySWQ7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VTTVMudmFsdWUgPSBwcm9wcy5wYXJhbS5tZXNzYWdlU01TO1xuICAgICAgICAgICAgICAgICAgICBldGF0cy52YWx1ZSA9IHByb3BzLnBhcmFtLmV0YXRzO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZWFnZW50cy52YWx1ZSA9IHByb3BzLnBhcmFtLmFnZW50cztcbiAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UudmFsdWUgPSBwcm9wcy5wYXJhbS5kaXN0YW5jZTtcblxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy52YWx1ZSA9IHByb3BzLnBhcmFtLm1lc3NhZ2VzO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc190eXBlcy52YWx1ZSA9IHByb3BzLm1lc3NhZ2VzX3R5cGVzO1xuXG4gICAgICAgICAgICAgICAgICAgIGJ1cy5vbignY2x1c3Rlci1zZWxlY3RlZCcsIHVwZGF0ZUNsdXN0ZXIpO1xuICAgICAgICAgICAgICAgICAgICBidXMub24oJ3Jlc2V0LXN0YW5kYXJkJywgcmVzZXREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgLy9mZXRjaFBvaW50cyhjbHVzdGVySUQudmFsdWUpO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGZ1bmN0aW9uIHJlc2V0RGF0YSgpe1xuICAgICAgICAgICAgcG9pbnRzLnZhbHVlID0gW107XG5cbiAgICAgICAgfVxuXG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcblxuICAgICAgICAgICAgYnVzLm9mZignY2x1c3Rlci1zZWxlY3RlZCcsIHVwZGF0ZUNsdXN0ZXIpO1xuICAgICAgICAgICAgYnVzLm9mZigncmVzZXQtc3RhbmRhcmQnLCByZXNldERhdGEpO1xuICAgICAgICAgICAgaWYgKG9ic2VydmVyKSBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgICAgIGJ1cy5vZmYoJ2NsdXN0ZXItc2VsZWN0ZWQnKTtcbiAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG4gICAgICAgIDxkaXYgaWQ9XCJwb2ludHNcIiBAZHJvcD1cIm9uRHJvcCgkZXZlbnQsIDEpXCIgQGRyYWdvdmVyLnByZXZlbnQgQGRyYWdlbnRlci5wcmV2ZW50IHN0eWxlPVwiaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNTAwcHgpO1wiIHRhYmxlU3R5bGU9XCJtYXgtd2lkdGg6IDEyMDBweFwiPlxuICAgICAgICAgICAgPERhdGFUYWJsZSBcbiAgICAgICAgICAgIDp2YWx1ZT1cInBvaW50c1wiIFxuICAgICAgICAgICAgdi1tb2RlbDpleHBhbmRlZFJvd3M9XCJleHBhbmRlZFJvd3NcIiBcbiAgICAgICAgICAgIEByb3dFeHBhbmQ9XCJvblJvd0V4cGFuZFwiXG4gICAgICAgICAgICBzY3JvbGxhYmxlIFxuICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0PVwiZmxleFwiXG4gICAgICAgICAgICBwYWdpbmF0b3IgOnJvd3M9XCIxMDBcIiBcbiAgICAgICAgICAgIGRhdGFLZXk9XCJpZFwiIFxuICAgICAgICAgICAgZmlsdGVyRGlzcGxheT1cInJvd1wiIFxuICAgICAgICAgICAgOmxvYWRpbmc9XCJsb2FkaW5nXCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICA6cm93LWNsYXNzPVwicm93Q2xhc3NcIiBcbiAgICAgICAgICAgIDpjbGFzcz1cInsgJ2hpZGUtc2VsZWN0LWFsbCc6IGZpbHRlcmVkUG9pbnRzLmxlbmd0aCA+IDEwIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicGFuZWxzZWFyY2hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiaGVhZGVyLWFwcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlYXJjaFN0YW5kYXJkIEBzZWFyY2gtc2VsZWN0ZWQ9XCJoYW5kbGVTZWxlY3Rpb25cIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjbG9hZGluZz4gTG9hZGluZyAuIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImlkXCIgaGVhZGVyPVwiSURcIiAgaGVhZGVyU3R5bGU9XCJ3aWR0aDogMjBweFwiLz5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGV4cGFuZGVyICBoZWFkZXJTdHlsZT1cIndpZHRoOiAyMHB4XCIgLz5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGhlYWRlclN0eWxlPVwid2lkdGg6IDIwcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljay5zdG9wPVwidG9nZ2xlQWxsXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC13cmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7ICdkaXNhYmxlZC13cmFwcGVyJzogZmlsdGVyZWRQb2ludHMubGVuZ3RoID4gMTAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJUb3V0IHPDqWxlY3Rpb25uZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGVja2JveCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1vZGVsVmFsdWU9XCJpc0FsbFNlbGVjdGVkXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpiaW5hcnk9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImZpbHRlcmVkUG9pbnRzLmxlbmd0aCA+IDEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTtcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljay5zdG9wPVwidG9nZ2xlUm93KGRhdGEpXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC13cmFwcGVyXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7bWF4LXdpZHRoOiAyMHB4ICFpbXBvcnRhbnQ7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hlY2tib3ggXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptb2RlbFZhbHVlPVwiISFzZWxlY3RlZFByb2R1Y3RzW2RhdGEuaWRdXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpiaW5hcnk9XCJ0cnVlXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmU7XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbHM9XCJvcGVyYXRpb25cIiBoZWFkZXI9XCJPcFwiIGhlYWRlclN0eWxlPVwid2lkdGg6IDUwcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIEBjbGljaz1cInJlZGlyZWN0KGRhdGEub3BlcnRhaW9uLmlkLGRhdGEubWlzc2lvbi5pZClcIiBjbGFzcz1cImxpbmtcIj57eyBkYXRhLm1pc3Npb24ubm9tIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiAgIFxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbHM9XCJub21cIiAgaGVhZGVyPVwiTm9tXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XCJ7ICdmb250LWJsdWUnOiBzZWxlY3RlZFRhYltkYXRhLmlkXSA9PSB0cnVlIH1cIj57eyBkYXRhLmNpdmlsaXRlIH19IHt7IGRhdGEubm9tIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbHM9XCJhbGVydGVcIiBzdHlsZT1cIm1pbi13aWR0aDogM3JlbVwiIGhlYWRlcj1cIkFsZXJ0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRvZ2dsZVN3aXRjaCB2LW1vZGVsPVwiZGF0YS5hbGVydGVcIiBAY2hhbmdlPVwiY2hhbmdlX2FsZXJ0ZShkYXRhKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+ICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibnVtZXJvQ2xpZW50XCIgaGVhZGVyPVwiTsKwIENsaWVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEubnVtZXJvQ2xpZW50IH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+IFxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJudW1lcm9QaHlzaXF1ZVwiIGhlYWRlcj1cIk7CsCBDb21wdFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEubnVtZXJvUGh5c2lxdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gXG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVscz1cInRlbDBcIiBzdHlsZT1cIm1pbi13aWR0aDogODBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG50ZWwyXCIgQGNsaWNrPVwiZW50cmFudFRlbChkYXRhKVwiPjxzcGFuIGNsYXNzPVwicGkgcGktcGhvbmVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj48L2J1dHRvbj48YnI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICBFbnRyYW50XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVscz1cInRlbFwiIHN0eWxlPVwibWluLXdpZHRoOiAxMnJlbVwiIGhlYWRlcj1cIlRlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS50ZWwxXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mbyBidG50ZWxcIiBAY2xpY2s9XCJzZW5kVGVsKGRhdGEsZGF0YS50ZWwxKVwiPjxzcGFuIGNsYXNzPVwicGkgcGktcGhvbmVcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPjwvc3Bhbj4mbmJzcDtURUwge3sgZGF0YS50ZWwxIH19PC9idXR0b24+PC9zcGFuPjxicj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEudGVsMlwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm8gYnRudGVsXCIgQGNsaWNrPVwic2VuZFRlbChkYXRhLGRhdGEudGVsMilcIj48c3BhbiBjbGFzcz1cInBpIHBpLXBob25lXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj48L3NwYW4+Jm5ic3A7VEVMIHt7IGRhdGEudGVsMiB9fTwvYnV0dG9uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uICBmaWVsZD1cImV0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEuZXRhdCAmJiBkYXRhLmV0YXQuaWRcIiA6c3R5bGU9XCJ7IFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMnB4IDhweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6ICcxcHggc29saWQgI2NjYycsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICcxNjBweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNmZmYnLCAvKiBDb3VsZXVyIGRlIHRleHRlIGJsYW5jaGUgcG91ciB1biBtZWlsbGV1ciBjb250cmFzdGUgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogZGF0YS5ldGF0LmNvdWxldXIgXG4gICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5ldGF0Lm5vbSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiZW1wbGFjZW1lbnRDb21wdGV1clwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuZW1wbGFjZW1lbnRDb21wdGV1ciB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgRW1wbGFjZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibW9kdWxlU2V1bFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLm1vZHVsZVNldWxcIj5Nb2R1bGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiIWRhdGEubW9kdWxlU2V1bFwiPkNvbXB0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIHN0eWxlPVwid2lkdGg6IDQwcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwic2xvdFByb3BzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGljb249XCJwaSBwaS1wZW5jaWxcIiB2YXJpYW50PVwib3V0bGluZWRcIiByb3VuZGVkIGNsYXNzPVwibXItMlwiIEBjbGljaz1cImRpc3RhbmNlVXBkYXRlKHNsb3RQcm9wcy5kYXRhLmlkLCA1MDApXCI+NTAwbTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJub21SdWVcIiBoZWFkZXI9XCJSdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLm51bWVyb1J1ZSB9fSB7eyBkYXRhLnRpdHJlUnVlICB9fSB7eyBkYXRhLm5vbVJ1ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJ2aWxsZVwiIGhlYWRlcj1cIlZpbGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5jb2RlUG9zdGFsIH19IHt7IGRhdGEudmlsbGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiYWdlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5hZ2VudFwiPnt7IGRhdGEuYWdlbnQubm9tIH19IDxzcGFuIHYtaWY9XCJkYXRhLmFnZW50LnByZW5vbVwiPnt7IGRhdGEuYWdlbnQucHJlbm9tIH19PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiV2ViXCIgc3R5bGU9XCJ3aWR0aDogMTVweFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEud2ViXCI+PGRpdiBjbGFzcz1cImRvdFwiPjxzcGFuPjxzcGFuPjwvc3Bhbj48L3NwYW4+PC9kaXY+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJkYXRlUlZcIiBzdHlsZT1cIm1pbi13aWR0aDogMTUwcHhcIiBoZWFkZXI9XCJEYXRlIFJWXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5jcmVuZWF1XCI+e3sgZGF0YS5jcmVuZWF1LmRhdGUgfX0ge3sgZGF0YS5jcmVuZWF1LmNyZW5lYXVIb3JhaXJlLm5vbSB9fTxicj5BZ2VudCA6IHt7IGRhdGEuY3JlbmVhdS5hZ2VudC5ub20gfX0gPHNwYW4gdi1pZj1cImRhdGEuY3JlbmVhdS5hZ2VudC5wcmVub21cIj57eyBkYXRhLmNyZW5lYXUuYWdlbnQucHJlbm9tIH19PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICAgPENvbHVtbiBoZWFkZXI9XCJFZGl0XCIgc3R5bGU9XCJ3aWR0aDogNTBweFwiPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInNsb3RQcm9wc1wiPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gaWNvbj1cInBpIHBpLXBlbmNpbFwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHJvdW5kZWQgY2xhc3M9XCJtci0yXCIgQGNsaWNrPVwiZWRpdFByb2R1Y3Qoc2xvdFByb3BzLmRhdGEpXCI+RWRpdDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNleHBhbnNpb249XCJzbG90UHJvcHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogODAwcHg7XCI+Q3LDqW5lYXV4IDogPGJ1dHRvbiBAY2xpY2s9XCJkaXN0YW5jZVVwZGF0ZShzbG90UHJvcHMuZGF0YS5pZCwgNTApXCIgY2xhc3M9XCJtYi0xMFwiPjUwIG08L2J1dHRvbj4mbmJzcDsmbmJzcDs8YnV0dG9uIEBjbGljaz1cImRpc3RhbmNlVXBkYXRlKHNsb3RQcm9wcy5kYXRhLmlkLCAyMDApXCIgY2xhc3M9XCJtYi0xMFwiPjIwMCBtPC9idXR0b24+Jm5ic3A7Jm5ic3A7PGJ1dHRvbiBAY2xpY2s9XCJkaXN0YW5jZVVwZGF0ZShzbG90UHJvcHMuZGF0YS5pZCwgNTAwKVwiIGNsYXNzPVwibWItMTBcIj41MDAgbTwvYnV0dG9uPiZuYnNwOyZuYnNwOzxidXR0b24gQGNsaWNrPVwiZGlzdGFuY2VVcGRhdGUoc2xvdFByb3BzLmRhdGEuaWQgLCAncmVzZXQnKVwiIGNsYXNzPVwibWItMTBcIj5Ub3VzPC9idXR0b24+Jm5ic3A7Jm5ic3A7PHZ1ZS1kYXRlLXBpY2tlciB2LW1vZGVsPVwiZGF0ZVwiICBwbGFjZWhvbGRlcj1cIkRhdGVcIiA6dGVsZXBvcnQ9XCJ0cnVlXCIgOnN0YXJ0LWRhdGU9XCJzdGFydERhdGVcIiBhdXRvLWFwcGx5IEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJzZWFyY2hEYXRlQ3JlbmVhdShzbG90UHJvcHMuZGF0YS5pZClcIj48L3Z1ZS1kYXRlLXBpY2tlcj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJpbmZvc1RhYnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm9zVGFiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNvbW1lbnRhaXJlPC9wPjxCdXR0b24gaWNvbj1cInBpIHBpLXBlbmNpbFwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHJvdW5kZWQgY2xhc3M9XCJtci0yIHRvcC1yaWdodFwiIEBjbGljaz1cImVkaXRQcm9kdWN0KHNsb3RQcm9wcy5kYXRhKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAgc2xvdFByb3BzLmRhdGEuY29tbWVudGFpcmUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm9zVGFiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhpc3RvcmlxdWU8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7bWF4LXdpZHRoOiA0MDBweDtwYWRkaW5nOiAycHggIWltcG9ydGFudDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2LWZvcj1cImxvZyBpbiBzbG90UHJvcHMuZGF0YS5sb2dwb2ludHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgbG9nLmRhdGVjcmVhIH19PC90ZD48dGQ+e3sgbG9nLmFjdGlvbi5ub20gfX08L3RkPjx0ZD57eyBsb2cuY29tbWVudGFpcmUgfX08L3RkPjx0ZD48c3BhbiBjbGFzcz1cInAtYnV0dG9uLWljb24gcGkgcGktdHJhc2hcIiBkYXRhLXA9XCJsZWZ0XCIgZGF0YS1wYy1zZWN0aW9uPVwiaWNvblwiIEBjbGljaz1cImRlbGV0ZV9sb2cobG9nLmlkKVwiPjwvc3Bhbj48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm9zVGFiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkV0YXRzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGVcIiBzdHlsZT1cIndpZHRoOiAxMDAlO21heC13aWR0aDogNDAwcHg7cGFkZGluZzogMnB4ICFpbXBvcnRhbnQ7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XCJsb2cgaW4gc2xvdFByb3BzLmRhdGEubG9nZXRhdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgbG9nLmRhdGVjcmVhIH19PC90ZD48dGQ+e3sgbG9nLmV0YXQubm9tIH19PC90ZD48dGQ+e3sgbG9nLmNvbW1lbnRhaXJlIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgPC9EYXRhVGFibGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxEaWFsb2cgdi1tb2RlbDp2aXNpYmxlPVwicHJvZHVjdERpYWxvZ1wiIDpzdHlsZT1cInsgd2lkdGg6ICc0NTBweCcgfVwiIGhlYWRlcj1cIkTDqXRhaWxzIGR1IHBvaW50XCIgOm1vZGFsPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibnVtZXJvQ2xpZW50XCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPk51bcOpcm8gQ2xpZW50PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cIm51bWVyb0NsaWVudFwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QubnVtZXJvQ2xpZW50XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgYXV0b2ZvY3VzIDppbnZhbGlkPVwic3VibWl0dGVkICYmICFwcm9kdWN0Lm51bWVyb0NsaWVudFwiIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCB2LWlmPVwic3VibWl0dGVkICYmICFwcm9kdWN0Lm51bWVyb0NsaWVudFwiIGNsYXNzPVwidGV4dC1yZWQtNTAwXCI+TnVtw6lybyBDbGllbnQgcmVxdWlzLjwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvbXB0ZXVyQWNjZXNzaWJsZVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5BY2Nlc3NpYmxlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjb21wdGV1ckFjY2Vzc2libGVcIiB2LW1vZGVsPVwicHJvZHVjdC5jb21wdGV1ckFjY2Vzc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIDp2YWx1ZT1cInRydWVcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IGdyZWVuXCI+T3VpPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiA6dmFsdWU9XCJmYWxzZVwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogcmVkXCI+Tm9uPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gXG4gICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJldGF0XCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkNoYW5nZXIgbCfDqXRhdDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3Qgdi1tb2RlbD1cInByb2R1Y3QuZXRhdFwiIDpvcHRpb25zPVwiZXRhdHNcIiBvcHRpb25MYWJlbD1cIm5vbVwiICA6aW5pdGlhbFZhbHVlcz1cInByb2R1Y3QuZXRhdC5pZFwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0aW9ubmVyIHVuIMOpdGF0XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gICBcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2l2aWxpdGVcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+Q2l2aWxpdMOpPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cImNpdmlsaXRlXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5jaXZpbGl0ZVwiIHJlcXVpcmVkPVwidHJ1ZVwiIGF1dG9mb2N1cyA6aW52YWxpZD1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5jaXZpbGl0ZVwiIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCB2LWlmPVwic3VibWl0dGVkICYmICFwcm9kdWN0LmNpdmlsaXRlXCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDBcIj5DaXZpbGl0w6kgcmVxdWlzZS48L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPk5vbTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJuYW1lXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5ub21cIiByZXF1aXJlZD1cInRydWVcIiBhdXRvZm9jdXMgOmludmFsaWQ9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3Qubm9tXCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHYtaWY9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3Qubm9tXCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDBcIj5Ob20gcmVxdWlzLjwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRlbDFcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+VGVsIDE8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwidGVsMVwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QudGVsMVwiIHJlcXVpcmVkPVwiZmFsc2VcIiBhdXRvZm9jdXMgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGVsMlwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5UZWwgMjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJ0ZWwyXCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC50ZWwyXCIgcmVxdWlyZWQ9XCJmYWxzZVwiIGF1dG9mb2N1cyBmbHVpZCAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlbWFpbFwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5FbWFpbDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJlbWFpbFwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QuZW1haWxcIiByZXF1aXJlZD1cImZhbHNlXCIgYXV0b2ZvY3VzIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvbW1lbnRhaXJlXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkNvbW1lbnRhaXJlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPFRleHRhcmVhIGlkPVwiY29tbWVudGFpcmVcIiB2LW1vZGVsPVwicHJvZHVjdC5jb21tZW50YWlyZVwiIHJlcXVpcmVkPVwiZmFsc2VcIiByb3dzPVwiM1wiIGNvbHM9XCIyMFwiIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJBbm51bGVyXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgdGV4dCBAY2xpY2s9XCJoaWRlRGlhbG9nXCIgLz5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiU2F1dmVyXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgQGNsaWNrPVwic2VuZEluZm9zKHByb2R1Y3QuaWQpXCIgLz5cbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvRGlhbG9nPlxuICAgICAgICA8RGlhbG9nIHYtbW9kZWw6dmlzaWJsZT1cImV4Y2VsRGlhbG9nXCIgOnN0eWxlPVwieyB3aWR0aDogJzQ1MHB4JyB9XCIgaGVhZGVyPVwiRXhwb3J0IEV4Y2VsXCIgOm1vZGFsPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHA+VW4gZXhwb3J0IGNvbXBsZXQgZXN0IGfDqW7DqXLDqSBjaGFxdWUgbnVpdC4gVm91cyBwb3V2ZXogY3LDqWVyIHVuIHJhcHBvcnQgcGFydGllbCBsaW1pdMOpIMOgIDUwMCBsaWduZXMgw6AgcGFydGlyIGRlIHZvcyBjcml0w6hyZXMuPC9wPlxuICAgICAgICAgICAgPHRlbXBsYXRlICNmb290ZXI+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIkFubnVsZXJcIiBpY29uPVwicGkgcGktdGltZXNcIiB0ZXh0IEBjbGljaz1cImhpZGVEaWFsb2dcIiAvPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJFeHBvcnRlclwiIGljb249XCJwaSBwaS1jaGVja1wiIEBjbGljaz1cInNlbmRFeGNlbCgpXCIgLz5cbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvRGlhbG9nPlxuPC90ZW1wbGF0ZT5cbjxzdHlsZT5cbjpkZWVwKHRyLm15LWN1c3RvbS1oaWdobGlnaHQpIHtcbiAgICAvKmJhY2tncm91bmQ6ICNmY2Q5YTUgIWltcG9ydGFudDsqL1xuICAgIC8qZm9udC13ZWlnaHQ6IGJvbGQ7Ki9cbn1cbi5wLWRhdGF0YWJsZS10aGVhZCA+IHRyID4gdGggIHtcbiAgICBwYWRkaW5nLXRvcDogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctbGVmdDogNHB4ICFpbXBvcnRhbnQ7XG59XG4ucC1kYXRhdGFibGUtaGVhZGVyLWNlbGwgICB7XG4gICAgcGFkZGluZy10b3A6IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctYm90dG9tOiA0cHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWxlZnQ6IDRweCAhaW1wb3J0YW50O1xufVxuLnAtZGF0YXRhYmxlLWZyb3plbi10Ym9keSA+IHRyID4gdGQge1xuICAvKmJhY2tncm91bmQtY29sb3I6ICNjOGUzZmUgIWltcG9ydGFudDsgKi9cbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiBibHVlICFpbXBvcnRhbnQ7XG59XG4jaGVhZGVyLWFwcCB7ei1pbmRleDogMTA7fVxuLmRwX19pbnB1dCwgLmRwX19tYWlue3dpZHRoOiAyNTBweCAhaW1wb3J0YW50O2Rpc3BsYXk6IGlubGluZS1ibG9jazt9XG5cbiNpbmZvc1RhYnMge2JhY2tncm91bmQtY29sb3I6IGdyZXk7cGFkZGluZzogNXB4O31cbi5pbmZvc1RhYiB7aGVpZ2h0OjMwMHB4OyBvdmVyZmxvdy15OiBhdXRvO2JhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7fVxuXG4uaGlkZS1zZWxlY3QtYWxsIHRoID4gLnAtY2hlY2tib3gge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG4jcGFuZWxzZWFyY2gge3dpZHRoOjEwMCU7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDpjZW50ZXI7fVxuLmJ0bnRlbCB7d2lkdGg6IDE1MHB4ICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZToxMnB4O2hlaWdodCA6IDIwcHggIWltcG9ydGFudDtwYWRkaW5nOiAycHggIWltcG9ydGFudDt9XG4uYnRudGVsMiB7d2lkdGg6IDQwcHggIWltcG9ydGFudDsgbGluZS1oZWlnaHQ6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtmb250LXNpemU6MTJweDtoZWlnaHQgOiAyMHB4ICFpbXBvcnRhbnQ7cGFkZGluZzogMnB4ICFpbXBvcnRhbnQ7fVxuLmxpbmsge2NvbG9yOiBibHVlO3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO31cbi5mb250LWJsdWUge2ZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogcmdiKDMsIDI1MywgNzQpO31cblxuPC9zdHlsZT5cbiIsIjxzY3JpcHQgc2V0dXA+XG5cbmltcG9ydCB7IGNyZWF0ZUFwcCwgcmVmLCBvbk1vdW50ZWQsIG9uVW5tb3VudGVkLCBnZXRDdXJyZW50SW5zdGFuY2UsIGNvbXB1dGVkLCB3YXRjaH0gIGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyBidXMgfSBmcm9tICcuLi9idXMuanMnOyBcbmltcG9ydCBMZWFmbGV0U3RhbmRhcmQgZnJvbSAnLi9MZWFmbGV0U3RhbmRhcmQudnVlJztcbmltcG9ydCBUYWJzIGZyb20gJ3ByaW1ldnVlL3RhYnMnO1xuaW1wb3J0IFRhYkxpc3QgZnJvbSAncHJpbWV2dWUvdGFibGlzdCc7XG5pbXBvcnQgVGFiIGZyb20gJ3ByaW1ldnVlL3RhYic7XG5pbXBvcnQgVGFiUGFuZWxzIGZyb20gJ3ByaW1ldnVlL3RhYnBhbmVscyc7XG5pbXBvcnQgVGFiUGFuZWwgZnJvbSAncHJpbWV2dWUvdGFicGFuZWwnO1xuaW1wb3J0IFRvZ2dsZVN3aXRjaCBmcm9tICdwcmltZXZ1ZS90b2dnbGVzd2l0Y2gnO1xuaW1wb3J0IHsgdXNlVG9hc3QgfSBmcm9tICdwcmltZXZ1ZS91c2V0b2FzdCc7XG5cbiAgICAgICAgY29uc3QgYWdlbnRzID0gcmVmKFtdKTsgLy8gTGEgbGlzdGUgc2VyYSBjaGFyZ8OpZSBldCBtaXNlIMOgIGpvdXIgdmlhIE1lcmN1cmUvQVBJXG4gICAgICAgIHZhciBhZ2VudHMyID0gcmVmKFtdKTtcbiAgICAgICAgY29uc3QgY291bnRjcmVuZWF1ID0gcmVmKCcwJyk7XG4gICAgICAgIGNvbnN0IGRvbm5lZXMgPSBbXTtcbiAgICAgICAgY29uc3QgdG9hc3QgPSB1c2VUb2FzdCgpO1xuICAgICAgICBjb25zdCBhZ2VudHNfbWFqID0gW107XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgICAgIGNvbnN0IGluaXRpYWxBZ2VudHMgPSBbXTtcbiAgICAgICAgY29uc3Qgc2VhcmNoQWdlbnQgPSByZWYoJ1RvdXMnKTtcbiAgICAgICAgY29uc3Qgc2hvd0NvbXBsZXRlZCA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IGxvYWRpbmcgPSByZWYodHJ1ZSk7XG4gICAgICAgIGNvbnN0IHBhcmFtID0gcmVmKG51bGwpO1xuICAgICAgICBjb25zdCBwYXJhbUxlYWZsZXQgPSByZWYobnVsbCk7XG4gICAgICAgIGNvbnN0IGFnZW50U2VsID0gcmVmKG51bGwpO1xuICAgICAgICB2YXIgcG9pbnQgPSAwO1xuICAgICAgICB2YXIgZGlzdGFuY2UgPSAncmVzZXQnO1xuICAgICAgICB2YXIgZGF0ZSAgPSAnJztcbiAgICAgICAgY29uc3QgdGFidmFsdWUgPSByZWYoJzAnKTtcbiAgICAgICAgY29uc3QgY2hlY2tlZCA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgcmVjaERpc3RhbmNlID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3Qgc2hvdyA9IHJlZih0cnVlKTtcbiAgICAgICAgY29uc3QgcmF3RGF0YSA9IHJlZihbXSk7XG5cbiAgICAgICAgY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gICAgICAgICAgcGFyYW06ICB7XG4gICAgICAgICAgICB0eXBlOiBPYmplY3QsIFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUgXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHBhcmFtTGVhZmxldC52YWx1ZSA9IHByb3BzLnBhcmFtO1xuXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUNyZW5lYXVzKGRhdGFDcmVuZWF1KXtcbiAgICAgICAgICAgIGlmKGRhdGFDcmVuZWF1Lm9wZXJhdGlvbil7cHJvcHMucGFyYW0ub3BlcmF0aW9uID0gZGF0YUNyZW5lYXUub3BlcmF0aW9uO31cbiAgICAgICAgICAgIHBvaW50ID0gZGF0YUNyZW5lYXUucG9pbnQ7XG4gICAgICAgICAgICBkaXN0YW5jZSA9IGRhdGFDcmVuZWF1LmRpc3RhbmNlO1xuICAgICAgICAgICAgZGF0ZSAgPSBkYXRhQ3JlbmVhdS5kYXRlO1xuICAgICAgICAgICAgdGFidmFsdWUudmFsdWUgPSAnMSc7XG4gICAgICAgICAgICBpZihkYXRhQ3JlbmVhdS5hZ2VudCl7YWdlbnRTZWwudmFsdWUgPSBkYXRhQ3JlbmVhdS5hZ2VudDt9XG4gICAgICAgICAgICBmZXRjaENyZW5lYXVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmV0Y2hDcmVuZWF1cyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHNlYXJjaEFnZW50LnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgaWYoZGlzdGFuY2UgPT0gJ3Jlc2V0Jyl7cmVjaERpc3RhbmNlLnZhbHVlID0gZmFsc2U7fVxuICAgICAgICAgICAgZWxzZXtyZWNoRGlzdGFuY2UudmFsdWUgPSB0cnVlO31cbiAgICAgICAgICAgIGlmKGRhdGUgPT0gJycpe2RhdGUgPSAwO31cbiAgICAgICAgICAgIGlmKHByb3BzLnBhcmFtLm9wZXJhdGlvbil7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9jcmVuZWF1cy8nK3Byb3BzLnBhcmFtLm9wZXJhdGlvbisnLzAvJyArIHBvaW50ICsgJy8nICsgZGlzdGFuY2UgKyAnLzAvMCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgICAgIGlmKGRhdGEubGVuZ3RoID4gMyl7Y291bnQudmFsdWUgPSBmYWxzZTt9XG4gICAgICAgICAgICAgICAgICAgZWxzZXtjb3VudC52YWx1ZSA9IHRydWU7fVxuICAgICAgICAgICAgICAgICAgIHJhd0RhdGEudmFsdWUgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgY291bnRjcmVuZWF1LnZhbHVlID0gYWdlbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQudmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgbG9ycyBkZSBsYSByw6ljdXDDqXJhdGlvbiBkZXMgcG9pbnRzOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRhYnZhbHVlLnZhbHVlID0gJzEnO1xuICAgICAgICAgICAgICAgIGNoZWNrZWQudmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHNob3cudmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmV0Y2hDcmVuZWF1ID0gYXN5bmMgKGRhdGEyKSA9PiB7XG4gICAgICAgICAgICBzZWFyY2hBZ2VudC52YWx1ZSAgPSAnVG91cyc7XG4gICAgICAgICAgICBsZXQgYWdlbnRfaWQgPSBkYXRhMjtcbiAgICAgICAgICAgIGlmKHByb3BzLnBhcmFtLm9wZXJhdGlvbil7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRhdGUudmFsdWU9Jyc7XG4gICAgICAgICAgICAgICAgc2hvd0NvbXBsZXRlZC52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciBxID0gMDtcbiAgICAgICAgICAgICAgICByZWNoRGlzdGFuY2UudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2NyZW5lYXVzLycrcHJvcHMucGFyYW0ub3BlcmF0aW9uKycvJythZ2VudF9pZCsnLycrIHBvaW50ICsnL3Jlc2V0LzAvMCcpOyAvLyBWb3RyZSBlbmRwb2ludCBBUEkgU3ltZm9ueVxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZGlyZWN0aW9uIGZvcmPDqWUgdmVycyBsYSBwYWdlIGRlIGxvZ2luXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vamUgcmVudm9pZSBsZXMgYWdlbnRzXG4gICAgICAgICAgICAgICAgcmF3RGF0YS52YWx1ZSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgc2hvdy52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgcsOpY3Vww6lyYXRpb24gZGVzIHBvaW50czpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRhYnZhbHVlLnZhbHVlID0gJzEnO1xuICAgICAgICAgICAgY2hlY2tlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfTtcblxuICAgICAgIC8vIDEuIExpc3RlIGRlIHRvdXMgbGVzIGFnZW50cyAoQ29sb25uZXMpXG5jb25zdCB0b3VzTGVzQWdlbnRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICByZXR1cm4gcmF3RGF0YS52YWx1ZS5tYXAoYSA9PiAoe1xuICAgIGlkOiBhLmlkLFxuICAgIG5vbTogYS5ub20sXG4gICAgcHJlbm9tOiBhLnByZW5vbSxcbiAgICB0b3RhbENyZW5lYXVIb3JhaXJlOiBhLnRvdGFsQ3JlbmVhdUhvcmFpcmVcbiAgfSkpO1xufSk7XG5cbi8vIDIuIExpc3RlIGRlIHRvdXRlcyBsZXMgZGF0ZXMgdW5pcXVlcyB0cmnDqWVzIChMaWduZXMpXG5jb25zdCB0b3V0ZXNMZXNEYXRlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3QgZGF0ZXMgPSBuZXcgU2V0KCk7XG4gIHJhd0RhdGEudmFsdWUuZm9yRWFjaChhZ2VudCA9PiB7XG4gICAgYWdlbnQuY3JlbmVhdXMuZm9yRWFjaChjID0+IGRhdGVzLmFkZChjLmRhdGUpKTtcbiAgfSk7XG4gIFxuICByZXR1cm4gQXJyYXkuZnJvbShkYXRlcykuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGQxID0gbmV3IERhdGUoYS5zcGxpdCgnLScpLnJldmVyc2UoKS5qb2luKCctJykpO1xuICAgIGNvbnN0IGQyID0gbmV3IERhdGUoYi5zcGxpdCgnLScpLnJldmVyc2UoKS5qb2luKCctJykpO1xuICAgIHJldHVybiBkMSAtIGQyO1xuICB9KTtcbn0pO1xuXG4vLyAzLiBIZWxwZXIgcG91ciByw6ljdXDDqXJlciBsZXMgY3LDqW5lYXV4IGQndW4gYWdlbnQgcHLDqWNpcyDDoCB1bmUgZGF0ZSBwcsOpY2lzZVxuY29uc3QgZ2V0U2xvdHNGb3JBZ2VudEFuZERhdGUgPSAoYWdlbnRJZCwgZGF0ZSkgPT4ge1xuICBjb25zdCBhZ2VudCA9IHJhd0RhdGEudmFsdWUuZmluZChhID0+IGEuaWQgPT09IGFnZW50SWQpO1xuICBpZiAoIWFnZW50KSByZXR1cm4gW107XG4gIHJldHVybiBhZ2VudC5jcmVuZWF1cy5maWx0ZXIoYyA9PiBjLmRhdGUgPT09IGRhdGUpO1xufTtcblxuLy8gNC4gSGVscGVyIHBvdXIgYWZmaWNoZXIgbGUgam91ciBkZSBsYSBzZW1haW5lIChleDogTHVuZGkpXG5jb25zdCBnZXRKb3VyU2VtYWluZSA9IChkYXRlU3RyKSA9PiB7XG4gIC8vIE9uIHLDqWN1cMOocmUgbGUgbm9tIGR1IGpvdXIgZGVwdWlzIGxlIHByZW1pZXIgY3LDqW5lYXUgdHJvdXbDqSBwb3VyIGNldHRlIGRhdGVcbiAgZm9yIChsZXQgYWdlbnQgb2YgcmF3RGF0YS52YWx1ZSkge1xuICAgIGNvbnN0IG1hdGNoID0gYWdlbnQuY3JlbmVhdXMuZmluZChjID0+IGMuZGF0ZSA9PT0gZGF0ZVN0cik7XG4gICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2guam91clNlbWFpbmVGcjtcbiAgfVxuICByZXR1cm4gXCJcIjtcbn07XG5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ2FydGUoKXtcbiAgICAgICAgICAgIHRhYnZhbHVlLnZhbHVlID0gJzAnO1xuICAgICAgICAgICAgY2hlY2tlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGNvbnN0IGFnZW50c0ZpbHRlcmVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0b3VzTGVzQWdlbnRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VhcmNoQWdlbnQudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0b3VzTGVzQWdlbnRzLnZhbHVlLmZpbHRlcihhID0+IGEuaWQgPT09IHBhcnNlSW50KHNlYXJjaEFnZW50LnZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtyZXR1cm4gdG91c0xlc0FnZW50cy52YWx1ZTt9XG5cbiAgICAgICAgfSlcblxuICAgICAgICBmdW5jdGlvbiByZXNldENyZW5lYXUoKSB7XG4gICAgICAgICAgICAvL3BvaW50ID0gMDtcbiAgICAgICAgICAgIGRpc3RhbmNlID0gJ3Jlc2V0JztcbiAgICAgICAgICAgIGRhdGUgID0gJyc7XG4gICAgICAgICAgICBmZXRjaENyZW5lYXVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXNhY3RpdmVyID0gYXN5bmMoYWdlbnRfaWQsaWQpID0+IHsgXG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2NyZW5lYXUvYWN0aXZlci8nK2lkLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFnZW50ID0gcmF3RGF0YS52YWx1ZS5maW5kKGEgPT4gYS5pZCA9PT0gYWdlbnRfaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gYWdlbnQuY3JlbmVhdXMuZmluZChjID0+IGMuaWQgPT09IGlkKTtcbiAgICAgICAgICAgICAgICAvL2xldCBjcmVuZWF1SW5kZXggPSBhZ2VudHMudmFsdWVbYWdlbnRfaWRdLmNyZW5lYXVzLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgICAgICBtYXRjaC5hY3RpZiA9ICFtYXRjaC5hY3RpZjtcblxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc3RhcnREcmFnKGV2dCwgaXRlbSwgYWdlbnQsIGFjdGlmLCB0b3RhbENyZW5lYXUpIHtcbiAgICAgICAgaWYoIWFjdGlmKXthbGVydCgnQ3LDqW5lYXUgaW5hY3RpZiA6IE9ww6lyYXRpb24gaW1wb3NzaWJsZScpO3JldHVybjt9XG4gICAgICAgIGNvbnNvbGUubG9nKCdjcmVuZWF1JytpdGVtKydhZ2VudCcrYWdlbnQpXG4gICAgICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnXG4gICAgICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnXG4gICAgICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0b3RhbENyZW5lYXUnLCB0b3RhbENyZW5lYXUpXG4gICAgICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5zZXREYXRhKCdpdGVtSUQnLCBpdGVtKVxuICAgICAgICAgIGV2dC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgnYWdlbnRJRCcsIGFnZW50KVxuICAgICAgICAgIGNvbnN0IGl0ZW1JRCA9IGV2dC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgnaXRlbUlEJylcbiAgICAgICAgfVxuXG4gICAgICAgIHdhdGNoKGNoZWNrZWQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHZhciBGZW4xID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BvaW50cycpO1xuICAgICAgICAgICAgdmFyIEZlbjIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVudS1iYXMnKTtcbiAgICAgICAgICAgIGlmKGNoZWNrZWQudmFsdWUgPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgRmVuMS5zdHlsZS5oZWlnaHQgPSAnY2FsYygxMDB2aCAtIDUwMHB4KSc7XG4gICAgICAgICAgICAgICAgaWYoRmVuMil7RmVuMi5zdHlsZS5oZWlnaHQgPSAnNDAwcHgnO31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgRmVuMS5zdHlsZS5oZWlnaHQgPSAnY2FsYygxMDB2aCAtIDEwMHB4KSc7XG4gICAgICAgICAgICAgICAgaWYoRmVuMil7RmVuMi5zdHlsZS5oZWlnaHQgPScwcHgnO31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUG9pbnRTZWxlY3Rpb24ocG9pbnREYXRhKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ2FydGU6IMOJdsOpbmVtZW50IHBvaW50LXNlbGVjdGVkIHJlw6d1ICEnLCBwb2ludERhdGEpO1xuICAgICAgICAgICAgLy8gTG9naXF1ZSBkZSBsYSBjYXJ0ZSA6IGNlbnRyZXIgc3VyIGxlIHBvaW50LCBvdXZyaXIgdW5lIHBvcHVwLCBldGMuXG4gICAgICAgICAgICAvLyBwYXIgZXhlbXBsZSA6IG1hcC5mbHlUbyhbcG9pbnREYXRhLmxhdCwgcG9pbnREYXRhLmxuZ10sIDE1KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlc2V0RGF0YSgpe1xuICAgICAgICAgICAgcmF3RGF0YS52YWx1ZSA9IFtdO1xuICAgICAgICAgICAgY2hlY2tlZC52YWx1ZT1mYWxzZTtcbiAgICAgICAgICAgIHNob3cudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgICAgICAgICAvL2ZldGNoQ3JlbmVhdXMoKTtcbiAgICAgICAgICAgIGNoZWNrZWQudmFsdWU9ZmFsc2U7XG4gICAgICAgICAgICBzaG93LnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9pbnRzJykuc3R5bGUuaGVpZ2h0ID0gJ2NhbGMoMTAwdmggLSAxMDBweCknO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2NoZWNrZWQnK2NoZWNrZWQudmFsdWUpXG4gICAgICAgICAgICBidXMub24oJ2NyZW5lYXUtdXBkYXRlZCcsIGZldGNoQ3JlbmVhdXMpO1xuICAgICAgICAgICAgYnVzLm9uKCdjcmVuZWF1LXRvVXBkYXRlJywgdXBkYXRlQ3JlbmVhdXMpO1xuICAgICAgICAgICAgYnVzLm9uKCdjYXJ0ZS10b1VwZGF0ZScsIHVwZGF0ZUNhcnRlKTtcbiAgICAgICAgICAgIGJ1cy5vbigncmVzZXQtc3RhbmRhcmQnLCByZXNldERhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2JzZXJ2ZXIpIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIHRvdXNMZXNBZ2VudHMudmFsdWU9IFtdO1xuICAgICAgICAgICAgcmF3RGF0YS52YWx1ZT0gW107XG4gICAgICAgICAgICB0YWJ2YWx1ZS52YWx1ZSA9ICcwJztcbiAgICAgICAgICAgIGJ1cy5vZmYoJ2NyZW5lYXUtdXBkYXRlZCcsIGZldGNoQ3JlbmVhdXMpO1xuICAgICAgICAgICAgYnVzLm9mZignY3JlbmVhdS10b1VwZGF0ZScsIHVwZGF0ZUNyZW5lYXVzKTtcbiAgICAgICAgICAgIGJ1cy5vZmYoJ2NhcnRlLXRvVXBkYXRlJyk7XG4gICAgICAgICAgICBidXMub2ZmKCdyZXNldC1zdGFuZGFyZCcsIHJlc2V0RGF0YSk7XG4gICAgICAgIH0pO1xuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG48ZGl2IGlkPVwibWVudS1iYXNcIiBzdHlsZT1cImhlaWdodDogMHB4O1wiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyXCIgc3R5bGU9XCJmbG9hdDogcmlnaHQ7bWFyZ2luOiAyMHB4IDIwcHggMCAwO1wiIHYtaWY9XCJzaG93XCI+XG4gICAgICAgIDxzcGFuIHYtaWY9XCJ0YWJ2YWx1ZSA9PSAxXCI+XG4gICAgICAgICAgICA8c2VsZWN0IGlkPVwiZXRhdC1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoQWdlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91c1wiPlRvdXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwiYWdlbnROIGluIHRvdXNMZXNBZ2VudHNcIiA6a2V5PVwiYWdlbnROLmlkXCIgOnZhbHVlPVwiYWdlbnROLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFnZW50Ti5ub20gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgJm5ic3A7Jm5ic3A7XG4gICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cInJlc2V0Q3JlbmVhdSgpO1wiPlRvdXMgY3LDqW5lYXV4PC9idXR0b24+PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxUb2dnbGVTd2l0Y2ggdi1tb2RlbD1cImNoZWNrZWRcIiAvPlxuICAgIDwvZGl2PlxuPGRpdiBpZD1cImFnZW50c1wiIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XCIgY2xhc3M9XCJtLTBcIiA+XG48ZGl2IHYtaWY9XCJhZ2VudHNGaWx0ZXJlZC5sZW5ndGggPT0gMFwiPiBQYXMgZGUgY3LDqW5lYXUgdHJvdXbDqS4gPC9kaXY+XG48ZGl2IHYtZWxzZSBjbGFzcz1cImNhbGVuZGFyLWNvbnRhaW5lclwiPlxuICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJVwiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8IS0tIEVuLXTDqnRlIDogTGVzIG5vbXMgZGVzIGFnZW50cyBlbiBjb2xvbm5lcyAtLT5cbiAgICAgICAgICAgIDx0aCB2LWZvcj1cImFnZW50IGluIGFnZW50c0ZpbHRlcmVkXCIgOmtleT1cImFnZW50LmlkXCIgY2xhc3M9XCJzdGlja3ktaGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuICA6Y2xhc3M9XCJbYWdlbnRTZWwgPT0gYWdlbnQuaWQgPyAnZ3JlZW4nIDogJyddXCI+e3sgYWdlbnQubm9tIH19IHt7IGFnZW50LnByZW5vbSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDwhLS0gVW5lIGxpZ25lIHBhciBEYXRlIHVuaXF1ZSAtLT5cbiAgICAgICAgICA8dHIgdi1mb3I9XCJkYXRlIGluIHRvdXRlc0xlc0RhdGVzXCIgOmtleT1cImRhdGVcIj5cbiAgICAgICAgICAgIDx0ZCB2LWZvcj1cImFnZW50IGluIGFnZW50c0ZpbHRlcmVkXCIgOmtleT1cImFnZW50LmlkXCIgY2xhc3M9XCJzbG90LWNlbGxcIj5cbiAgPGRpdiB2LWlmPVwiZ2V0U2xvdHNGb3JBZ2VudEFuZERhdGUoYWdlbnQuaWQsIGRhdGUpLmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IHYtZm9yPVwic2xvdCBpbiBnZXRTbG90c0ZvckFnZW50QW5kRGF0ZShhZ2VudC5pZCwgZGF0ZSlcIiA6a2V5PVwic2xvdC5pZFwiICBjbGFzcz1cInNsb3QtYmFkZ2UgZWwtZHJhZ1wiICAgZHJhZ2dhYmxlPVwidHJ1ZVwiIFxuICBAZHJhZ3N0YXJ0PVwic3RhcnREcmFnKCRldmVudCwgc2xvdC5pZCwgYWdlbnQuaWQsIHNsb3QuYWN0aWYsIHNsb3QudG90YWxDcmVuZWF1SG9yYWlyZSlcIiA6Y2xhc3M9XCJbc2xvdC5jb21wbGV0ID8gJ2NyZW5lYXUtY29tcGxldCcgOiAnJ11cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzbG90LWhlYWRlclwiPlxuICAgICAgICAgIDxkaXY+PHNwYW4gY2xhc3M9XCJ0aW1lXCI+e3sgc2xvdC5qb3VyU2VtYWluZUZyIH19IHt7IHNsb3QuZGF0ZSB9fTxicj57eyBzbG90LmNyZW5lYXVIb3JhaXJlLm5vbSB9fTwvc3Bhbj48L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICA8cCBAY2xpY2s9XCJkZXNhY3RpdmVyKGFnZW50LmlkLHNsb3QuaWQpXCI+e3sgc2xvdC5hY3RpZiA/ICfinIUnIDogJ+KdjCcgfX08L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbG90LWZvb3RlclwiIHYtaWY9XCJzbG90LnBvaW50cy5sZW5ndGggIT09IDBcIiA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby13cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5mby10cmlnZ2VyXCI+4oS577iPPC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1wb3B1cFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgdi1mb3I9XCJwb2ludCBpbiBzbG90LnBvaW50c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgLSA8c3Ryb25nPnt7cG9pbnQubm9tfX08L3N0cm9uZz4gOiB7e3BvaW50LnRpdHJlUnVlfX0ge3twb2ludC5udW1lcm9SdWV9fSB7e3BvaW50LnRpdHJlUnVlfX0ge3twb2ludC5ub21SdWV9fSB7e3BvaW50LnZpbGxlfX0gKHt7cG9pbnQuaWR9fSk8YnI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNsb3QtYm9keVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXQtaXRlbVwiPlxuICAgICAgICA8c3BhbiA6Y2xhc3M9XCJbc2xvdC50b3RhbCA+IDAgPyAnZ3JlZW4nIDogJyddXCI+e3sgc2xvdC50b3RhbCB9fSBSVjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gdGl0bGU9XCJUb3RhbCBwb3VyIGNldHRlIHRyYW5jaGUgaG9yYWlyZVwiIDpjbGFzcz1cIltzbG90LnRvdGFsQ3JlbmVhdUhvcmFpcmUgID49IGFnZW50LnRvdGFsQ3JlbmVhdUhvcmFpcmUgPyAnYWxlcnRlLXJvdWdlJyA6ICd0cmFuY2hlLXRvdGFsJ11cIj4oe3sgc2xvdC50b3RhbENyZW5lYXVIb3JhaXJlIH19KTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gdi1pZj1cInNsb3QuZGlzdGFuY2UgPj0gMCAmJiBzbG90LnRvdGFsID4gMCAmJiBzbG90LnBvaW50cy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJncmVlblwiPjxzdHJvbmc+e3sgc2xvdC5kaXN0YW5jZSB9fW08L3N0cm9uZz48L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gZWxzZT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj4mbmJzcDs8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PiAgICBcbiAgICA8L2Rpdj5cbiAgICA8L2Rpdj48L2Rpdj5cbjwvdGQ+XG5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgIFxuPC90ZW1wbGF0ZT5cbjxzdHlsZT5cbi5ibG9jLWNyZW5lYXUtZGF0ZSB7ZGlzcGxheTogZmxleDtmbGV4LWRpcmVjdGlvbjogY29sdW1uO31cbi5wLXRhYiB7cGFkZGluZy1ib3R0b206IDJweCAhaW1wb3J0YW50O3BhZGRpbmctdG9wOiAycHggIWltcG9ydGFudDt9XG4uZmxleGNvbHVtbiB7ZGlzcGxheTogZmxleCAhaW1wb3J0YW50O2ZsZXgtZGlyZWN0aW9uOiByb3cgIWltcG9ydGFudDt9XG4uY3JlbmVhdS1pZGVudCB7aGVpZ2h0OiA1MnB4O31cbi5hZ2VudC1ub20ge3Bvc2l0aW9uOiBzdGlja3kgIWltcG9ydGFudDt9XG4uY3JlbmVhdS1kZXNhY3RpdmVyIHtwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMnB4OyByaWdodDoycHg7fVxuXG4uY2FsZW5kYXItY29udGFpbmVyIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIG1heC1oZWlnaHQ6IDgwdmg7IC8qIFNjcm9sbCB2ZXJ0aWNhbCBzaSBiZWF1Y291cCBkZSBkYXRlcyAqL1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICB3aWR0aDogMTAwJTtcbn1cblxudGFibGUge1xuICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyAvKiBJbXBvcnRhbnQgcG91ciBsZSBzdGlja3kgKi9cbiAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uY2FsZW5kYXItY29udGFpbmVyIHRoLCAuY2FsZW5kYXItY29udGFpbmVyIHRkIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2VlZTtcbiAgcGFkZGluZzogMnB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gIG1pbi13aWR0aDogMTAwcHg7XG59XG5cbi8qIEZpeGVyIGwnZW4tdMOqdGUgZW4gaGF1dCAqL1xuLnN0aWNreS1oZWFkZXIge1xuICBwb3NpdGlvbjogc3RpY2t5ICFpbXBvcnRhbnQ7XG4gIHRvcDogMDtcbiAgYmFja2dyb3VuZDogI2Y4ZjlmYSAhaW1wb3J0YW50O1xuICB6LWluZGV4OiAxMDtcbiAgYm94LXNoYWRvdzogMCAycHggMnB4IC0xcHggcmdiYSgwLDAsMCwwLjEpO1xufVxuXG4vKiBGaXhlciBsYSBjb2xvbm5lIGRlcyBkYXRlcyDDoCBnYXVjaGUgKi9cbi5zdGlja3ktY29sIHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgbGVmdDogMDtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgei1pbmRleDogMTE7XG4gIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICNkZGQ7XG59XG5cbi8qIENlbGx1bGUgZCdhbmdsZSAoaGF1dC1nYXVjaGUpIDogZG9pdCDDqnRyZSBhdSBkZXNzdXMgZGUgdG91dCAqL1xudGguc3RpY2t5LWNvbC5zdGlja3ktaGVhZGVyIHtcbiAgei1pbmRleDogMjA7XG4gIGJhY2tncm91bmQ6ICNlY2VjZWM7XG59XG5cbi5kYXRlLWNvbHVtbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG59XG5cbi5kYXRlLWxhYmVsIHtcbiAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogIzY2NjtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG4uZGF0ZS12YWx1ZSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogIzMzMztcbn1cbi8qIFN0cnVjdHVyZSBkZSBsYSBjYXJ0ZSBkZSBjcsOpbmVhdSAqL1xuLnNsb3QtY2VsbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogTsOpY2Vzc2FpcmUgcG91ciBsZSB6LWluZGV4ICovXG4gIHRyYW5zaXRpb246IHotaW5kZXggMC4ycztcbn1cblxuLnNsb3QtY2VsbDpob3ZlciB7XG4gIHotaW5kZXg6IDUwOyAvKiBQYXNzZSBhdS1kZXNzdXMgZGVzIGF1dHJlcyBjZWxsdWxlcyBldCBkZXMgaGVhZGVycyBzdGlja3kgKi9cbn1cbi8qIC0tLSBGSVggVklTSUJJTElUw4kgLS0tICovXG4uc2xvdC1jZWxsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBOw6ljZXNzYWlyZSBwb3VyIGxlIHotaW5kZXggKi9cbiAgdHJhbnNpdGlvbjogei1pbmRleCAwLjJzO1xufVxuXG4uc2xvdC1jZWxsOmhvdmVyIHtcbiAgei1pbmRleDogNTA7IC8qIFBhc3NlIGF1LWRlc3N1cyBkZXMgYXV0cmVzIGNlbGx1bGVzIGV0IGRlcyBoZWFkZXJzIHN0aWNreSAqL1xufVxuXG4vKiAtLS0gREVTSUdOIERFIExBIENBUlRFIC0tLSAqL1xuLnNsb3QtYmFkZ2Uge1xuICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTVlN2ViO1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIHBhZGRpbmc6IDRweDtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLDAsMCwwLjUpO1xuICBtaW4td2lkdGg6IDEzMHB4O1xuICBoZWlnaHQ6IDkwcHg7XG59XG5cbi5zbG90LWhlYWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgbWFyZ2luLWJvdHRvbTogMnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICNjY2M7XG4gIHBhZGRpbmctYm90dG9tOiAycHg7XG59XG5cbi50aW1lIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcbiAgY29sb3I6ICMyNTYzZWI7XG59XG5cbi50cmFuY2hlLXRvdGFsIHtcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xuICBiYWNrZ3JvdW5kOiAjZjNmNGY2O1xuICBwYWRkaW5nOiAwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICM0YjU1NjM7XG59XG5cbi5zbG90LWJvZHkge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyAvKiBPcmdhbmlzYXRpb24gdmVydGljYWxlIGRlcyBzdGF0cyAqL1xuICBnYXA6IDJweDtcbiAgbWFyZ2luLWJvdHRvbTogMHB4O1xufVxuXG4uc3RhdC1pdGVtIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA1cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbn1cblxuLmljb24ge1xuICBmb250LXNpemU6IDAuOXJlbTtcbn1cblxuLnZhbHVlIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgY29sb3I6ICMxZjI5Mzc7XG59XG5cbi5zbG90LWZvb3RlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnNsb3QtZGF0ZSB7XG4gIGZvbnQtc2l6ZTogMC43cmVtO1xuICBjb2xvcjogIzljYTNhZjtcbn1cblxuLyogLS0tIFNUWUxFIERVIFBPUFVQIC0tLSAqL1xuLmluZm8td3JhcHBlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgY3Vyc29yOiBoZWxwO1xufVxuXG4uaW5mby10cmlnZ2VyIHtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBvcGFjaXR5OiAwLjY7XG59XG5cbi5pbmZvLXRyaWdnZXI6aG92ZXIge1xuICBvcGFjaXR5OiAxO1xufVxuXG4uaW5mby1wb3B1cCB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBvc2l0aW9uOiBmaXhlZCAhaW1wb3J0YW50O1xuICB0b3A6IGNhbGMoMTAwdmggLSA0MDBweCk7IC8qIFMnYWZmaWNoZSBhdS1kZXNzdXMgZGUgbCdpY8O0bmUgKi9cbiAgbGVmdDogMTBweDtcbiAgd2lkdGg6IDI1MHB4ICFpbXBvcnRhbnQ7XG4gIGhlaWdodDogYXV0bztcbiAgYmFja2dyb3VuZDogIzFmMjkzNzsgLyogRm9uZCBzb21icmUgbW9kZXJuZSAqL1xuICBjb2xvcjogd2hpdGU7XG4gIHBhZGRpbmc6IDEwcHggIWltcG9ydGFudDtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBib3gtc2hhZG93OiAwIDEwcHggMTVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgei1pbmRleDogMTAwMDA7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyAvKiBQb3VyIG5lIHBhcyBnw6puZXIgbGEgc291cmlzICovXG4gIGZvbnQtc2l6ZTogMC44cmVtO1xuICBsaW5lLWhlaWdodDogMS40O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xufVxuXG4ucG9wdXAtdGl0bGUge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xuICBjb2xvcjogIzYwYTVmYTtcbn1cblxuLmluZm8tcG9wdXAgaHIge1xuICBib3JkZXI6IDA7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMzc0MTUxO1xuICBtYXJnaW46IDVweCAwO1xufVxuXG4uaW5mby13cmFwcGVyOmhvdmVyIC5pbmZvLXBvcHVwIHtcbiAgZGlzcGxheTogYmxvY2s7IC8qIEFmZmljaGUgbGEgYnVsbGUgYXUgc3Vydm9sICovXG59XG5cbi8qIFBldGl0IHRyaWFuZ2xlIGVuIGJhcyBkZSBsYSBidWxsZSAqL1xuLmluZm8tcG9wdXAyOjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxMDAlO1xuICByaWdodDogMTBweDtcbiAgYm9yZGVyLXdpZHRoOiA2cHg7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1jb2xvcjogIzFmMjkzNyB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcbn1cbi5ncmVlbiB7Zm9udC1zaXplOiAxNHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7Y29sb3I6IHJnYigzLCAyNTMsIDc0KSAhaW1wb3J0YW50O2ZvbnQtd2VpZ2h0OiBib2xkO31cbi5lbXB0eS1jZWxsIHtcbiAgY29sb3I6ICNkZGQ7XG59XG4uY3JlbmVhdS1jb21wbGV0IHtiYWNrZ3JvdW5kLWNvbG9yOiAjZDdkN2Q3ICFpbXBvcnRhbnQ7fVxuXG4uYWxlcnRlLXJvdWdlIHtmb250LXNpemU6IDE0cHggIWltcG9ydGFudDsgY29sb3I6IHJlZCAhaW1wb3J0YW50O3BhZGRpbmc6IDBweDt9XG48L3N0eWxlPiIsIjxzY3JpcHQgc2V0dXA+XG5cbmltcG9ydCB7IGNyZWF0ZUFwcCwgcmVmLCBvbk1vdW50ZWQsIG9uQmVmb3JlVW5tb3VudCwgb25Vbm1vdW50ZWQsIGdldEN1cnJlbnRJbnN0YW5jZSwgY29tcHV0ZWR9ICBmcm9tICd2dWUnO1xuaW1wb3J0IHsgRmlsdGVyTWF0Y2hNb2RlLCBGaWx0ZXJPcGVyYXRvciB9IGZyb20gJ0BwcmltZXZ1ZS9jb3JlL2FwaSc7XG5cbmltcG9ydCB7IGJ1cyB9IGZyb20gJy4uL2J1cy5qcyc7IFxuaW1wb3J0IHsgRnVuY3Rpb25zIH0gZnJvbSAnLi9zZXJ2aWNlL0Z1bmN0aW9ucyc7XG5cbmltcG9ydCB7IFZ1ZURhdGVQaWNrZXIgfSBmcm9tICdAdnVlcGljL3Z1ZS1kYXRlcGlja2VyJztcbmltcG9ydCAnQHZ1ZXBpYy92dWUtZGF0ZXBpY2tlci9kaXN0L21haW4uY3NzJ1xuXG5pbXBvcnQgUHJvZ3Jlc3NCYXIgZnJvbSAncHJpbWV2dWUvcHJvZ3Jlc3NiYXInO1xuaW1wb3J0IERhdGFUYWJsZSBmcm9tICdwcmltZXZ1ZS9kYXRhdGFibGUnO1xuaW1wb3J0IENvbHVtbiBmcm9tICdwcmltZXZ1ZS9jb2x1bW4nO1xuaW1wb3J0IENvbHVtbkdyb3VwIGZyb20gJ3ByaW1ldnVlL2NvbHVtbmdyb3VwJzsgICBcbmltcG9ydCBSb3cgZnJvbSAncHJpbWV2dWUvcm93JzsgICAgIFxuaW1wb3J0IFRvZ2dsZVN3aXRjaCBmcm9tICdwcmltZXZ1ZS90b2dnbGVzd2l0Y2gnO1xuXG5cbmltcG9ydCBUb29sYmFyIGZyb20gJ3ByaW1ldnVlL3Rvb2xiYXInO1xuaW1wb3J0IHsgdXNlVG9hc3QgfSBmcm9tICdwcmltZXZ1ZS91c2V0b2FzdCc7XG5cbmltcG9ydCBJbnB1dFRleHQgZnJvbSAncHJpbWV2dWUvaW5wdXR0ZXh0JztcbmltcG9ydCBTZWxlY3QgZnJvbSAncHJpbWV2dWUvc2VsZWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAncHJpbWV2dWUvYnV0dG9uJztcbmltcG9ydCBUZXh0YXJlYSBmcm9tICdwcmltZXZ1ZS90ZXh0YXJlYSc7XG5pbXBvcnQgQ2hlY2tib3ggZnJvbSAncHJpbWV2dWUvY2hlY2tib3gnO1xuaW1wb3J0IENoZWNrYm94R3JvdXAgZnJvbSAncHJpbWV2dWUvY2hlY2tib3hncm91cCc7XG5cbmltcG9ydCBEaWFsb2cgZnJvbSAncHJpbWV2dWUvZGlhbG9nJztcblxuaW1wb3J0IEljb25GaWVsZCBmcm9tICdwcmltZXZ1ZS9pY29uZmllbGQnO1xuaW1wb3J0IElucHV0SWNvbiBmcm9tICdwcmltZXZ1ZS9pbnB1dGljb24nO1xuXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcbiAgcGFyYW06ICB7XG4gICAgdHlwZTogT2JqZWN0LCBcbiAgICByZXF1aXJlZDogdHJ1ZSBcbiAgfVxufSk7XG5cbiAgICAgICAgY29uc3QgZXRhdHMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbGlzdGVhZ2VudHMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSByZWYoMzAwKTtcbiAgICAgICAgY29uc3QgbWlzc2lvbklEID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklEID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXRlbXAgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXNfdHlwZXMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXNUeXBlID0gcmVmKFtdKTsgXG5cbiAgICAgICAgY29uc3QgcG9pbnRzID0gcmVmKFtdKTsgLy8gTGEgbGlzdGUgc2VyYSBjaGFyZ8OpZSBldCBtaXNlIMOgIGpvdXIgdmlhIE1lcmN1cmUvQVBJXG4gICAgICAgIGNvbnN0IG1lc3NhZ2V1ciA9IHJlZignJyk7XG4gICAgICAgIGNvbnN0IG5vbWJyZSA9IHJlZigpO1xuICAgICAgICBjb25zdCB0b3RhbCA9IHJlZigpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZigpO1xuICAgICAgICBjb25zdCBwb3VyY2VudCA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlU01TPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZUV4Y2VsPSByZWYoKTtcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gcmVmKFtdKTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IDA7XG4gICAgICAgIGxldCBzZWwgPSAwO1xuICAgICAgICBsZXQgc2VhcmNoID0gMDtcbiAgICAgICAgY29uc3QgbWFWYWxldXIgPSByZWYoMClcbiAgICAgICAgY29uc3Qgc2hvd1dpdGhSViA9IHJlZih0cnVlKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkID0gJyc7XG4gICAgICAgIGNvbnN0IG1vaXMgPSByZWYoKTtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IGRhdGUgPSByZWYobmV3IERhdGUoKSk7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJJRCA9IHJlZigpO1xuICAgICAgICBjb25zdCBsb2FkaW5nID1yZWYoKTtcbiAgICAgICAgbG9hZGluZy52YWx1ZSA9IHRydWU7XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoTm9tID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU3RhdHVzID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNlYXJjaE51bWVyb1BoeXNpcXVlID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaE51bWVyb0NsaWVudCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hOb21SdWUgPSByZWYoJ1RvdXRlcycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoRGF0ZVJWID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFBsYW5pZlJWID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFF1YXJ0aWVyID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNlYXJjaFZpbGxlID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaEV0YXQgPSByZWYoJ1RvdXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFRlbCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMiA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMyA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyNCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyNSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hFbXBsYWNlbWVudCA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoQWxlcnRlID0gcmVmKCdUb3VzJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hBZ2VudCA9IHJlZignVG91cycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoTWlzc2lvbiA9IHJlZigpO1xuICAgICAgICBjb25zdCBsaXN0ZW1pc3Npb25zID0gcmVmKFtdKTtcbiAgICAgICAgY29uc3Qgc2xvdFByb3BzID0gcmVmKCk7IFxuXG4gICAgICAgIGNvbnN0IGNsaWNrZWRSb3dJZCA9IHJlZihudWxsKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWJsZVBvaW50cyA9IHJlZihbXSk7IFxuICAgICAgICBjb25zdCBzZWxlY3RlZFRhYiA9IHJlZihbXSk7XG5cbiAgICAgICAgY29uc3QgQ29sb3JzID0gcmVmKFtdKTsgXG5cbiAgICAgICAgY29uc3QgZXhwYW5kZWRSb3dzID0gcmVmKFtdKTtcbiAgICAgICAgY29uc3QgdG9hc3QgPSB1c2VUb2FzdCgpO1xuICAgICAgICBjb25zdCBwcm9kdWN0RGlhbG9nID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgZXhjZWxEaWFsb2cgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCBwcm9kdWN0ID0gcmVmKHt9KTtcbiAgICAgICAgY29uc3Qgc3VibWl0dGVkID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWYoMCk7XG4gICAgICAgIGNvbnN0IGRhdGFDcmVuZWF1ID0ge307XG4gICAgICAgIGNvbnN0IGRhdGVFeGNlbCA9IHt9O1xuICAgICAgICBjb25zdCBkYXRhQ2FydGUgPSB7fTtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gKGRhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKTtcbiAgICAgICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSsxO1xuICAgICAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9kdWN0cyA9IHJlZih7fSk7XG4gICAgICAgIGNvbnN0IG1ldGFLZXkgPSByZWYodHJ1ZSk7XG5cbi8vQ0VOVFJBTEUgREUgQ09NTVVOSUNBVElPTlxuICAgICAgICAvLyBGb25jdGlvbiBwb3VyIHLDqWN1cMOpcmVyIGxlcyBpbml0aWF1eCBkZXB1aXMgbCdBUEkgU3ltZm9ueVxuXG4gICAgICAgIGZ1bmN0aW9uIGZldGNoUG9pbnRzKGNsdXN0ZXJfaWQpeyAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAvLyB5b3VyIG9wdGlvbnMuLi4gbWV0aG9kOiBQT1NULCBoZWFkZXJzLCBjb3JzLCBldGMuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGUudmFsdWU9JydcbiAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL2NsdXN0ZXIvJytjbHVzdGVyX2lkLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWIudmFsdWUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0YS5zdGF0dXMnK2RhdGEuc3RhdHVzKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWRpcmVjdGlvbiBmb3Jjw6llIHZlcnMgbGEgcGFnZSBkZSBsb2dpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NoYXJnZW1lbnQgcG9pbnRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlID0gZGF0YS5yZXNwb25zZS5tYXAocCA9PiAoeyAuLi5wLCBpc0VkaXRpbmc6IGZhbHNlLCBvcmlnaW5hbDoge30sIHNlbGVjdGVkOiBmYWxzZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdEl0ZW0gPSBwb2ludHMudmFsdWUuZmluZCh4PT54IT09dW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VhcmNoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gc2VhcmNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFBvaW50KHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiBjb25zb2xlLmxvZyhlcnJvcikpIC8vIGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCBlcnJvclxuXG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gZmV0Y2hQb2ludHNPcGVyYXRpb24oKXsgICAgICBcbiAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnQ2hhcmdlbWVudCBlbiBjb3Vycyc7XG4gICAgICAgICAgICAgICAgdG9hc3QuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0luZm8nLCBkZXRhaWw6IG1lc3NhZ2V1ci52YWx1ZSwgbGlmZTogMzAwMCB9KTsgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLy8geW91ciBvcHRpb25zLi4uIG1ldGhvZDogUE9TVCwgaGVhZGVycywgY29ycywgZXRjLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRlLnZhbHVlPScnXG4gICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy9wbGFubmluZy8nK29wZXJhdGlvbklELnZhbHVlLCBvcHRpb25zKS8vK29wZXJhdGlvbklELnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFRhYi52YWx1ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkYXRhLnN0YXR1cycrZGF0YS5zdGF0dXMpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZGlyZWN0aW9uIGZvcmPDqWUgdmVycyBsYSBwYWdlIGRlIGxvZ2luXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY2hhcmdlbWVudCBwb2ludHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWUgPSBkYXRhLnJlc3BvbnNlLm1hcChwID0+ICh7IC4uLnAsIGlzRWRpdGluZzogZmFsc2UsIG9yaWdpbmFsOiB7fSwgc2VsZWN0ZWQ6IGZhbHNlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0SXRlbSA9IHBvaW50cy52YWx1ZS5maW5kKHg9PnghPT11bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZWFyY2ggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBzZWFyY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0UG9pbnQocG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtjb25zb2xlLmxvZyhlcnJvcik7d2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzt9KSAvLyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggZXJyb3JcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBjaGFuZ2VfYWxlcnRlKHBvaW50KXsgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLy8geW91ciBvcHRpb25zLi4uIG1ldGhvZDogUE9TVCwgaGVhZGVycywgY29ycywgZXRjLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEZ1bmN0aW9ucy5tYWtlUmVxdWVzdCgnL2FwaS9wb2ludHMvYWxlcnRlLycrcG9pbnQuaWQrJy8nK3BvaW50LmFsZXJ0ZSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7Y29uc29sZS5sb2coZXJyb3IpO3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7fSkgLy8gZG8gc29tZXRoaW5nIHVzZWZ1bCB3aXRoIGVycm9yXG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0SW5mb3MoZGF0YSl7ICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHBvaW50czogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRlLnZhbHVlPScnXG4gICAgICAgICAgICAgICAgRnVuY3Rpb25zLm1ha2VSZXF1ZXN0KCcvYXBpL3BvaW50cy9nZXRWMi8nLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhdGEuc3RhdHVzJytkYXRhLnN0YXR1cylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlc3BvbnNlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXgyID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRJbmRleDIgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleDJdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleDMgPSBmaWx0ZXJlZFBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBlbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRQb2ludHMudmFsdWVbcG9pbnRJbmRleDNdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBmcm96ZW5Qb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gZWxlbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plblBvaW50cy52YWx1ZVtwb2ludEluZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNhcnRlLmNsdXN0ZXJJZCA9IGVsZW1lbnQuY2x1c3RlcjU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNhcnRlLm1pc3Npb24gPSBlbGVtZW50Lm1pc3Npb24uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NhcnRlLXJlZnJlc2gnLCBkYXRhQ2FydGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSBwcm9kdWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgnVW5lIGVycmV1ciBzXFwnZXN0IHByb2R1aXRlIG91IHZvdXMgw6p0ZXMgZMOpY29ubmVjdMOpJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVNZXJjdXJlTWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7IFxuICAgICAgICAgICAgZGF0YS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGVsZW1lbnQuYWN0aW9uO1xuICAgICAgICAgICAgICAgIHZhciByZWZyZXNoX2NyZW5lYXUgPSAwO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIC8vbWlzZSDDoCBqb3VyIGRlcyBjbHVzdGVycyBjb21wbGV0XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NsdXN0ZXJfY29tcGxldGVkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdjbHVzdGVyc2NvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGVsZW1lbnQsIC8vIFBhc3MgeW91ciBkYXRhIGluIHRoZSAnZGV0YWlsJyBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwcm9kdWN0X3VwZGF0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmZvcyhlbGVtZW50LnBvaW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfY3JlbmVhdSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjcmVuZWF1X3VwZGF0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlbmVhdV91cGRhdGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfY3JlbmVhdSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFVwZGF0ZShlbGVtZW50LmRvbm5lZXMubm9tYnJlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHJlZnJlc2hfY3JlbmVhdSA9PSAxKXtcbiAgICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS11cGRhdGVkJywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbi8vIElOVEVSRkFDRVxuXG4gICAgICAgIGNvbnN0IGFnZW50cyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsQWdlbnRzV2l0aER1cGxpY2F0ZXMgPSBwb2ludHMudmFsdWUubWFwKHBvaW50ID0+IChwb2ludC5hZ2VudC5ub20rJyAnKyhwb2ludC5hZ2VudC5wcmVub20/PycnKSkpXG4gICAgICAgICAgICBjb25zdCB1bmlxdWVBZ2VudFNldCA9IG5ldyBTZXQoYWxsQWdlbnRzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlQWdlbnRTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdmlsbGVzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxDaXRpZXNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnQudmlsbGUpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlQ2l0eVNldCA9IG5ldyBTZXQoYWxsQ2l0aWVzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlQ2l0eVNldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBxdWFydGllcnMgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbFF1YXJ0aWVyc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC5xdWFydGllcik7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVRdWFydGllclNldCA9IG5ldyBTZXQoYWxsUXVhcnRpZXJzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlUXVhcnRpZXJTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcnVlcyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsUnVlc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC5ub21SdWUpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlUnVlU2V0ID0gbmV3IFNldChhbGxSdWVzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlUnVlU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGVtcGxhY2VtZW50cyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsTGliZWxsZXNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnQuZW1wbGFjZW1lbnRDb21wdGV1cik7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVMaWJlbGxlc1NldCA9IG5ldyBTZXQoYWxsTGliZWxsZXNXaXRoRHVwbGljYXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1bmlxdWVMaWJlbGxlc1NldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkYXRlc1JWICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxEYXRlc1JWV2l0aER1cGxpY2F0ZXMgPSBwb2ludHMudmFsdWUubWFwKHBvaW50ID0+IHBvaW50X1JWKHBvaW50KSk7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVhbGxEYXRlc1JWU2V0ID0gbmV3IFNldChhbGxEYXRlc1JWV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlYWxsRGF0ZXNSVlNldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwbGFuaWZSViA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBvaW50c1RlbXAgPSBbXVxuICAgICAgICAgICAgcG9pbnRzVGVtcC52YWx1ZSA9IHBvaW50cy52YWx1ZS5maWx0ZXIocG9pbnQgPT4gcG9pbnQuZXRhdC5pZCA9PT0gNSlcbiAgICAgICAgICAgIGNvbnN0IGxhc3REYXRlc1BlclBvaW50ID0gcG9pbnRzVGVtcC52YWx1ZS5tYXAocG9pbnQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3NQbGFuaWZpZXMgPSAocG9pbnQubG9nZXRhdHMgfHwgW10pLmZpbHRlcihsb2cgPT4gbG9nLmV0YXQuaWQgPT09IDUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3NQbGFuaWZpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIDIuIE9uIHLDqWN1cMOocmUgVU5JUVVFTUVOVCBsZSBkZXJuaWVyIGxvZyBkZSBsYSBsaXN0ZSAobGUgcGx1cyByw6ljZW50KVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcm5pZXJMb2cgPSBsb2dzUGxhbmlmaWVzW2xvZ3NQbGFuaWZpZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICAgICAgICAvLyAzLiBPbiBleHRyYWl0IGxhIGRhdGUgZHUgY29tbWVudGFpcmUgKGV4OiBcIjA5LTAyLTIwMjZcIilcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IGRlcm5pZXJMb2cuZGF0ZWNyZWE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2ggOiBudWxsO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIDQuIE9uIG5ldHRvaWUgOiBvbiBlbmzDqHZlIGxlcyBudWxsIChwb2ludHMgc2FucyBSVikgZXQgb24gZMOpZG91Ymxvbm5lIGF2ZWMgU2V0XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVEYXRlcyA9IEFycmF5LmZyb20obmV3IFNldChsYXN0RGF0ZXNQZXJQb2ludC5maWx0ZXIoZCA9PiBkICE9PSBudWxsKSkpO1xuXG4gICAgICAgICAgICAvLyA1LiBPbiB0cmllIHBhciBvcmRyZSBjaHJvbm9sb2dpcXVlIChZWVlZLU1NLUREKVxuICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZURhdGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlQSA9IGEuc3BsaXQoJy0nKS5yZXZlcnNlKCkuam9pbignJyk7IC8vIFwiMDktMDItMjAyNlwiIC0+IFwiMjAyNjAyMDlcIlxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVCID0gYi5zcGxpdCgnLScpLnJldmVyc2UoKS5qb2luKCcnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZUEubG9jYWxlQ29tcGFyZShkYXRlQik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gcG9pbnRfUlYocG9pbnQpe1xuICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUpeyBcbiAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUpe3JldHVybiBwb2ludC5jcmVuZWF1LmRhdGU7fWVsc2V7cmV0dXJuICdTYW5zIFJWJzt9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2V7cmV0dXJuICdTYW5zIFJWJzt9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjb25kaXRpb25fcG9pbnRfUGxhbmlmKHBvaW50LCBkYXRlUlYpe1xuICAgICAgICAgICAgICBpZihwb2ludC5sb2dldGF0cyl7IFxuICAgICAgICAgICAgICAgIGZvcihjb25zdCBsb2dldGF0IG9mIHBvaW50LmxvZ2V0YXRzKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2V0YXQuZGF0ZWNyZWEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGxvZ2V0YXQuZGF0ZWNyZWEgPT0gZGF0ZVJWKSAmJiAocG9pbnQuZXRhdC5pZCA9PSA1KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0ZVJWJytsb2dldGF0LmRhdGVjcmVhKycgJytkYXRlUlYpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dldGF0LmRhdGVjcmVhID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgaWYoZGF0ZVJWID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAvLyBQcm9wcmnDqXTDqSBjYWxjdWzDqWUgcXVpIHJlbnZlcnJhIGxhIGxpc3RlIGZpbHRyw6llIMOgIGxhIERhdGFUYWJsZVxuICAgICAgICBjb25zdCBmaWx0ZXJlZFBvaW50cyA9IGNvbXB1dGVkKCgpID0+IHtcblxuICAgICAgICAgICAgLy8gU2kgb24gbidhIHBhcyBlbmNvcmUgZGUgZG9ubsOpZXMsIG9uIHJlbnZvaWUgdW4gdGFibGVhdSB2aWRlXG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT24gY29tbWVuY2UgYXZlYyB1bmUgY29waWUgZGUgdG91dGVzIGxlcyBkb25uw6llc1xuICAgICAgICAgICAgbGV0IHBvaW50c1RvRmlsdGVyID0gWy4uLnBvaW50cy52YWx1ZV07XG5cbiAgICAgICAgICAgIC8vIEZpbHRyZSBwYXIgbm9tXG4gICAgICAgICAgICBpZiAoc2VhcmNoTm9tLnZhbHVlICYmIHNlYXJjaE5vbS52YWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG93ZXJDYXNlU2VhcmNoID0gc2VhcmNoTm9tLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIC8vIEFqb3V0ZXogaWNpIHRvdSBsZXMgY2hhbXBzIGRhbnMgbGVzcXVlbHMgdm91cyB2b3VsZXogY2hlcmNoZXJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubm9tLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbHRyZSBwYXIgTnVtZXJvUGh5c2lxdWVcbiAgICAgICAgICAgIGlmIChzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZSAmJiBzZWFyY2hOdW1lcm9QaHlzaXF1ZS52YWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG93ZXJDYXNlU2VhcmNoID0gc2VhcmNoTnVtZXJvUGh5c2lxdWUudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubnVtZXJvUGh5c2lxdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlckNhc2VTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsdHJlIHBhciBOdW1lcm9DbGllbnRcbiAgICAgICAgICAgIGlmIChzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUgJiYgc2VhcmNoTnVtZXJvQ2xpZW50LnZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlckNhc2VTZWFyY2ggPSBzZWFyY2hOdW1lcm9DbGllbnQudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubnVtZXJvQ2xpZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbHRyZSBwYXIgTm9tUnVlXG4gICAgICAgICAgICBpZiAoc2VhcmNoTm9tUnVlLnZhbHVlICYmIHNlYXJjaE5vbVJ1ZS52YWx1ZS50cmltKCkgIT09ICdUb3V0ZXMnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG93ZXJDYXNlU2VhcmNoID0gc2VhcmNoTm9tUnVlLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50Lm5vbVJ1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyQ2FzZVNlYXJjaClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgVmlsbGVcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3ZpbGxlJytzZWFyY2hWaWxsZS52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hWaWxsZS52YWx1ZSAmJiBzZWFyY2hWaWxsZS52YWx1ZSAhPT0gJ1RvdXRlcycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQudmlsbGUgPT09IHNlYXJjaFZpbGxlLnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIFRlbFxuICAgICAgICAgICAgaWYgKHNlYXJjaFRlbC52YWx1ZSAmJiBzZWFyY2hUZWwudmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnRlbDEudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZWwudmFsdWUpfHxwb2ludC50ZWwyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVsLnZhbHVlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBRdWFydGllclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncXVhcnRpZXInK3NlYXJjaFF1YXJ0aWVyLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaFF1YXJ0aWVyLnZhbHVlICYmIHNlYXJjaFF1YXJ0aWVyLnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQucXVhcnRpZXIgPT09IHNlYXJjaFF1YXJ0aWVyLnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBBZ2VudFxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncXVhcnRpZXInK3NlYXJjaFF1YXJ0aWVyLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaEFnZW50LnZhbHVlICYmIHNlYXJjaEFnZW50LnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgKHBvaW50LmFnZW50Lm5vbSsnICcrKHBvaW50LmFnZW50LnByZW5vbT8/JycpKSA9PT0gc2VhcmNoQWdlbnQudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIEVtcGxhY2VtZW50XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWFydGllcicrc2VhcmNoUXVhcnRpZXIudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoRW1wbGFjZW1lbnQudmFsdWUgJiYgc2VhcmNoRW1wbGFjZW1lbnQudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5lbXBsYWNlbWVudENvbXB0ZXVyID09PSBzZWFyY2hFbXBsYWNlbWVudC52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBEYXRlUlZcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3F1YXJ0aWVyJytzZWFyY2hRdWFydGllci52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hEYXRlUlYudmFsdWUgJiYgc2VhcmNoRGF0ZVJWLnZhbHVlICE9PSAnVG91dGVzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25fcG9pbnRfUlYocG9pbnQsIHNlYXJjaERhdGVSVi52YWx1ZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VhcmNoUGxhbmlmUlYudmFsdWUgJiYgc2VhcmNoUGxhbmlmUlYudmFsdWUgIT09ICdUb3V0ZXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9wb2ludF9QbGFuaWYocG9pbnQsIHNlYXJjaFBsYW5pZlJWLnZhbHVlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gY29uZGl0aW9uX3BvaW50X1JWKHBvaW50LCBkYXRlUlYpe1xuICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1KXsgXG4gICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSl7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUgPT0gZGF0ZVJWKXtyZXR1cm4gdHJ1ZTt9XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGVSViA9PSAnU2FucyBSVicpe3JldHVybiB0cnVlO31cbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgaWYoZGF0ZVJWID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gY29uZGl0aW9uX3BvaW50X1BsYW5pZihwb2ludCwgZGF0ZVJWKXtcbiAgICAgICAgICAgICAgaWYocG9pbnQubG9nZXRhdHMpeyBcbiAgICAgICAgICAgICAgICBmb3IoY29uc3QgbG9nZXRhdCBvZiBwb2ludC5sb2dldGF0cykge1xuXG4gICAgICAgICAgICAgICAgICAgICBpZihsb2dldGF0LmRhdGVjcmVhKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKChsb2dldGF0LmRhdGVjcmVhID09IGRhdGVSVikgJiYgKHBvaW50LmV0YXQuaWQgPT0gNSkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhdGVSVicrbG9nZXRhdC5kYXRlY3JlYSsnICcrZGF0ZVJWKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nZXRhdC5kYXRlY3JlYSA9PSAnU2FucyBSVicpe3JldHVybiB0cnVlO31cbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9ICAgICBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIGlmKGRhdGVSViA9PSAnU2FucyBSVicpe3JldHVybiB0cnVlO31cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBFdGF0XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdldGF0JytzZWFyY2hFdGF0LnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaEV0YXQudmFsdWUgJiYgc2VhcmNoRXRhdC52YWx1ZSAhPT0gJ1RvdXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmV0YXQuaWQgPT09IHNlYXJjaEV0YXQudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIENsdXN0ZXIgMVxuICAgICAgICAgICAgaWYgKHNlYXJjaENsdXN0ZXIxLnZhbHVlICYmIHNlYXJjaENsdXN0ZXIxLnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5jbHVzdGVyMSA9PT0gc2VhcmNoQ2x1c3RlcjEudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIENsdXN0ZXIgMlxuICAgICAgICAgICAgaWYgKHNlYXJjaENsdXN0ZXIyLnZhbHVlICYmIHNlYXJjaENsdXN0ZXIyLnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5jbHVzdGVyMiA9PT0gc2VhcmNoQ2x1c3RlcjIudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIENsdXN0ZXIgM1xuICAgICAgICAgICAgaWYgKHNlYXJjaENsdXN0ZXIzLnZhbHVlICYmIHNlYXJjaENsdXN0ZXIzLnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5jbHVzdGVyMyA9PT0gc2VhcmNoQ2x1c3RlcjMudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIENsdXN0ZXIgNFxuICAgICAgICAgICAgaWYgKHNlYXJjaENsdXN0ZXI0LnZhbHVlICYmIHNlYXJjaENsdXN0ZXI0LnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5jbHVzdGVyNCA9PT0gc2VhcmNoQ2x1c3RlcjQudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIENsdXN0ZXIgNVxuICAgICAgICAgICAgaWYgKHNlYXJjaENsdXN0ZXI1LnZhbHVlICYmIHNlYXJjaENsdXN0ZXI1LnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5jbHVzdGVyNSA9PT0gc2VhcmNoQ2x1c3RlcjUudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgRGF0ZVJWXG4gICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uX3NlbGVjdGVkKHBvaW50KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmdW5jdGlvbiBjb25kaXRpb25fc2VsZWN0ZWQocG9pbnQpe1xuICAgICAgICAgICAgICAgICBpZihwb2ludC5mcm96ZW4pe1xuICAgICAgICAgICAgICAgICAgICAgIGlmKHBvaW50LmZyb3plbiA9PSB0cnVlKXtyZXR1cm4gZmFsc2U7fVxuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgQWxlcnRlXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChzZWFyY2hBbGVydGUudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIGlmKHNlYXJjaEFsZXJ0ZS52YWx1ZSA9PSAndHJ1ZScpe1xuICAgICAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LmFsZXJ0ZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHNlYXJjaEFsZXJ0ZS52YWx1ZSA9PSAnZmFsc2UnKXtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC5hbGVydGUgPT09IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY291bnQudmFsdWUgPSBwb2ludHNUb0ZpbHRlci5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gcG9pbnRzVG9GaWx0ZXI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNsZWFyRmlsdGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgc2VhcmNoTm9tLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hFdGF0LnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgc2VhcmNoUXVhcnRpZXIudmFsdWUgPSAnVG91cyc7XG4gICAgICAgICAgICBzZWFyY2hFbXBsYWNlbWVudC52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaFRlbC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoVmlsbGUudmFsdWUgPSAnVG91dGVzJztcbiAgICAgICAgICAgIHNlYXJjaE5vbVJ1ZS52YWx1ZSA9ICdUb3V0ZXMnO1xuICAgICAgICAgICAgc2VhcmNoTnVtZXJvQ2xpZW50LnZhbHVlICA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoTnVtZXJvUGh5c2lxdWUudmFsdWUgID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hDbHVzdGVyMS52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoQ2x1c3RlcjIudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaENsdXN0ZXIzLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hDbHVzdGVyNC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoQ2x1c3RlcjUudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHNlYXJjaERhdGVSVi52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoQWxlcnRlLnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgc2VhcmNoQWdlbnQudmFsdWUgPSAnVG91cyc7XG4gICAgICAgIH1cblxuICAgICAgICAvL29uIHJlY29pdCB1biBtZXNzYWdlIGRlIGxlYWZsZXRcbiAgICAgICAgY29uc3QgdXBkYXRlQ2x1c3RlciA9IChjbHVzdGVyU2VhcmNoKSA9PiB7XG4gICAgICAgICAgICBjbGVhckZpbHRlcigpO1xuICAgICAgICAgICAgZXZhbCgnc2VhcmNoQ2x1c3RlcicrY2x1c3RlclNlYXJjaC50eXBlKycudmFsdWUgPSAnK2NsdXN0ZXJTZWFyY2gudmFsdWUpO1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY2xpYyByZWNpZXZlZCcgKyBjbHVzdGVyU2VhcmNoLnR5cGUgKydpZCcrICsgY2x1c3RlclNlYXJjaC52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL29uIHLDqWluaXRhbGlzZSBsJ2FmZmljaGFnZSwgb24gbMOodmUgbGUgbG9ja1xuICAgICAgICBjb25zdCBnbG9iYWxFeHRlcm5hbENhbGwgPSAoY2x1c3Rlcl9pZCwgc2VsKSA9PiB7XG4gICAgICAgICAgICAvL3NlbmRMb2NrKG51bGwsIDIpO1xuICAgICAgICAgICAgc2VhcmNoID0gc2VsO1xuICAgICAgICAgICAgZmV0Y2hQb2ludHMoY2x1c3Rlcl9pZCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZWRpdFBvaW50ID0gKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50cy52YWx1ZS5maW5kKHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKHBvaW50KSB7XG4gICAgICAgICAgICAgICAgcG9pbnQub3JpZ2luYWwgPSB7IC4uLnBvaW50IH07XG4gICAgICAgICAgICAgICAgcG9pbnQuaXNFZGl0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdwb2ludEMnK3BvaW50LmlkKTtcbiAgICAgICAgICAgICAgICBpZiAocG9pbnQuY3JlbmVhdSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwb2ludC5jcmVuZWF1ID0ge307XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNyZW5lYXUuaWQgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9zZW5kTG9jayhwb2ludCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2FuY2VsRWRpdCA9IChpZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAocG9pbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSB7IC4uLnBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5vcmlnaW5hbCwgaXNFZGl0aW5nOiBmYWxzZSwgb3JpZ2luYWw6IHt9IH07XG4gICAgICAgICAgICAgICAgLy9zZW5kTG9jayhwb2ludHMudmFsdWVbcG9pbnRJbmRleF0sIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzZW5kRXRhdCA9IGFzeW5jKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9pbnRzL3VwZGF0ZVYyLycraWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGF0OiA2XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ01vZGlmaWNhdGlvbiBlbnZvecOpZSDDoCBTeW1mb255LiBBdHRlbnRlIGRlIGxhIG1pc2Ugw6Agam91ciBNZXJjdXJlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnRmljaGUgbWlzZSDDoCBqb3VyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Byb2R1Y3QuaXNFZGl0aW5nID0gZmFsc2U7IC8vIFNvcnRpciBkdSBtb2RlIMOpZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9wb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSBwcm9kdWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkdSBwcm9kdWl0OlwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0VycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZGUgbGEgZmljaGUgOiAnK2F3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgcsOpc2VhdSBsb3JzIGRlIGxhIHNhdXZlZ2FyZGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdldEluZm9zKGlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHNlbmRJbmZvcyhpZCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzZW5kSW5mb3MnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBwcm9kdWN0LnZhbHVlLmNvbW1lbnRhaXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2libGU6IHByb2R1Y3QudmFsdWUuY29tcHRldXJBY2Nlc3NpYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpdmlsaXRlOiBwcm9kdWN0LnZhbHVlLmNpdmlsaXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbTogcHJvZHVjdC52YWx1ZS5ub20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJvQ2xpZW50OiBwcm9kdWN0LnZhbHVlLm51bWVyb0NsaWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWwxOiBwcm9kdWN0LnZhbHVlLnRlbDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsMjogcHJvZHVjdC52YWx1ZS50ZWwyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiBwcm9kdWN0LnZhbHVlLmVtYWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YXQ6IHByb2R1Y3QudmFsdWUuZXRhdC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VudDogcHJvZHVjdC52YWx1ZS5hZ2VudC5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL3VwZGF0ZVYyLycraWQsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc2VjdXJpdMOpIG1lcmN1cmUgZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEluZm9zKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS11cGRhdGVkJywgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QuaXNFZGl0aW5nID0gZmFsc2U7IC8vIFNvcnRpciBkdSBtb2RlIMOpZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtjb25zb2xlLmxvZyhlcnJvcik7Ly93aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBmdW5jdGlvbiBzZW5kUHJvZ3JhbW1lcigpIHtcblxuICAgICAgICAgIGlmKGZyb3plblBvaW50cy52YWx1ZS5sZW5ndGggPT0gMCl7YWxlcnQoJ01lcmNpIGRlIHPDqWxlY3Rpb25uZXIgYXUgbW9pbnMgdW4gcG9pbnQnKTtyZXR1cm47fVxuXG4gICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHNlbmRFdGF0KGVsZW1lbnQuaWQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZT0gW107XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzZW5kRXhjZWwoKXtcbiAgICAgICAgICAgIGhpZGVEaWFsb2coKTtcbiAgICAgICAgICAgIGxldCBjaGFpbmUgPSAnJztcbiAgICAgICAgICAgIGZyb3plblBvaW50cy52YWx1ZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY2hhaW5lID0gY2hhaW5lICsgZWxlbWVudC5pZCArICcsJztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBmaWx0ZXJlZFBvaW50cy52YWx1ZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY2hhaW5lID0gY2hhaW5lICsgZWxlbWVudC5pZCArICcsJztcblxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNoYWluZS5zbGljZSgwLCAtMSlcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZldGNoKCcvYWRtaW4vZXhjZWwvZXhwb3J0LycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5lOiBjaGFpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uX2lkOiBvcGVyYXRpb25JRC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpLnRoZW4oZGF0YSA9PiB3aW5kb3cub3BlbihVUkwuY3JlYXRlT2JqZWN0VVJMKGRhdGEpKSlcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgZXhjZWxcIik7XG4gICAgICAgICAgICAgfSAgIFxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2VuZEV4Y2VsQ3Jvbigpe1xuICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2goJy9hZG1pbi9leGNlbC9leHBvcnRDcm9uLycrcHJvcHMucGFyYW0ub3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnRXhwb3J0IGVuIGNvdXJzJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgZXhjZWxcIik7XG4gICAgICAgICAgICAgfSAgIFxuICAgICAgICB9XG5cblxuICAgICAgICBjb25zdCBkaXN0YW5jZVVwZGF0ZSA9IChwb2ludCwgZGlzdGFuY2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IHBvaW50KTtcbiAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1Lm9wZXJhdGlvbiA9IHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5vcGVydGFpb24uaWQ7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUucG9pbnQgPSBwb2ludDtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LmRhdGUgPSAwO1xuICAgICAgICAgICAgICAgIGJ1cy5lbWl0KCdjcmVuZWF1LXRvVXBkYXRlJywgZGF0YUNyZW5lYXUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FydGVVcGRhdGUgPSAocG9pbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IHBvaW50KTtcbiAgICAgICAgICAgICAgICBkYXRhQ2FydGUuY2x1c3RlcklkID0gcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmNsdXN0ZXI1O1xuICAgICAgICAgICAgICAgIGJ1cy5lbWl0KCdjYXJ0ZS10b1VwZGF0ZScsIGRhdGFDYXJ0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbFVwZGF0ZSA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWN1bm9tYnJlJytkYXRhKTtcbiAgICAgICAgICAgICAgIHZhbHVlLnZhbHVlID0gTWF0aC5yb3VuZChkYXRhKjEwMCAvIHRvdGFsLnZhbHVlKTtcbiAgICAgICAgICAgICAgIG5vbWJyZS52YWx1ZSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGZ1bmN0aW9uIHNlbGVjdGVkUG9pbnRzKCkge1xuICAgICAgICAgIHJldHVybiBwb2ludHMudmFsdWUuZmlsdGVyKHBvaW50ID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cocG9pbnQuc2VsZWN0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuIChwb2ludC5zZWxlY3RlZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gc2VhcmNoRGF0ZUNyZW5lYXUoaWQpIHtcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5wb2ludCA9IGlkO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LmRpc3RhbmNlID0gJ3Jlc2V0JztcbiAgICAgICAgICAgICAgICBkYXRhQ3JlbmVhdS5kYXRlID0gZm9ybWF0RGF0ZShkYXRlLnZhbHVlKTtcbiAgICAgICAgICAgICAgYnVzLmVtaXQoJ2NyZW5lYXUtdG9VcGRhdGUnLCBkYXRhQ3JlbmVhdSk7XG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJMYSBkYXRlIGEgw6l0w6kgc8OpbGVjdGlvbm7DqWUgOlwiLCBmb3JtYXREYXRlKGRhdGUudmFsdWUpKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlVG9Gb3JtYXQpe1xuICAgICAgICAgIGlmICghZGF0ZVRvRm9ybWF0KSByZXR1cm4gJyc7XG4gICAgICAgICAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGVUb0Zvcm1hdC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZVRvRm9ybWF0LmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOyAvLyBMZXMgbW9pcyBzb250IGluZGV4w6lzIMOgIHBhcnRpciBkZSAwXG4gICAgICAgICAgY29uc3QgeWVhciA9IGRhdGVUb0Zvcm1hdC5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb25DaGFuZ2VNaXNzaW9uKCl7XG4gICAgICAgICAgICBpZiAoc2VhcmNoTWlzc2lvbi52YWx1ZSAmJiBzZWFyY2hNaXNzaW9uLnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgbWlzc2lvbklELnZhbHVlID0gc2VhcmNoTWlzc2lvbi52YWx1ZTtcbiAgICAgICAgICAgICAgIGZldGNoUG9pbnRzTWlzc2lvbihtaXNzaW9uSUQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb25Ecm9wID0gYXN5bmMoZXZ0LCBsaXN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbUlEID0gZXZ0LmRhdGFUcmFuc2Zlci5nZXREYXRhKCdpdGVtSUQnKVxuICAgICAgICAgIGNvbnN0IGFnZW50SUQgPSBldnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ2FnZW50SUQnKVxuICAgICAgICAgIGNvbnN0IHRvdGFsQ3JlbmVhdSA9IGV2dC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndG90YWxDcmVuZWF1JylcbiAgICAgICAgICBpZih0b3RhbENyZW5lYXUgPj0zMCl7XG4gICAgICAgICAgICBpZiAoIXdpbmRvdy5jb25maXJtKFwiQXR0ZW50aW9uLCBtYXggMzAgcGFyIGNyw6luZWF1IGhvcmFpcmUgOiBzb3VoYWl0ZXogdm91cyBjb25maXJtZXIgP1wiKSl7cmV0dXJuO31cbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IGNvbmZpcm0gPSAwO1xuICAgICAgICAgIHNlbGVjdGVkID0gJ1wic2VsZWN0ZWRcIiA6IFsnO1xuICAgICAgICAgIGlmKGZyb3plblBvaW50cy52YWx1ZS5sZW5ndGggPT0gMCl7YWxlcnQoJ01lcmNpIGRlIHPDqWxlY3Rpb25uZXIgYXUgbW9pbnMgdW4gcG9pbnQnKTtyZXR1cm47fVxuICAgICAgICAgIGZyb3plblBvaW50cy52YWx1ZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkICsgZWxlbWVudC5pZCArIFwiLFwiO1xuICAgICAgICAgICAgaWYoZWxlbWVudC5hZ2VudC5pZCAhPSBhZ2VudElEKXtjb25maXJtID0gMTt9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2VsZWN0ZWQgPSBzZWxlY3RlZC5zbGljZSgwLCAtMSkgKyAnXSc7XG4gICAgICAgICAgc2VsZWN0ZWQgPSAne1wiaWRcIjonKyBpdGVtSUQgKyAnLCcgKyBzZWxlY3RlZCArJ30nO1xuICAgICAgICAgIGlmKGNvbmZpcm0gPT0gMSl7XG4gICAgICAgICAgICBpZiAoIXdpbmRvdy5jb25maXJtKFwiQXR0ZW50aW9uLCBhZ2VudHMgZGlmZsOpcmVudHMgOiBzb3VoYWl0ZXogdm91cyBjb25maXJtZXIgP1wiKSl7cmV0dXJuO31cbiAgICAgICAgICB9XG4gICAgICAgICAgLy9jb25zb2xlLmxvZygnc2VsZWN0ZWQnICsgc2VsZWN0ZWQpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVudm95ZXIgbGVzIG1vZGlmaWNhdGlvbnMgw6AgbCdBUEkgU3ltZm9ueVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAvYXBpL3BvaW50cy9jcmVuZWF1L3VwZGF0ZS9gLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIHLDqXNlYXUgdXBkYXRlIGNlcmVuYXUgOlwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIHLDqXNlYXUgdXBkYXRlIGNlcmVuYXVcIik7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBnZXRJbmZvcyhlbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJ1cy5lbWl0KCdjcmVuZWF1LXVwZGF0ZWQnLCAnJyk7XG4gICAgICAgICAgICAvL3Jlc2V0IGRlcyBmcm96ZW5cbiAgICAgICAgICAgIHNlbGVjdGVkUHJvZHVjdHMudmFsdWU9W107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZW5kVGVsID0gYXN5bmMocG9pbnQsIHRlbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKHRlbC5sZW5ndGggPT0gOSl7dGVsID0gJzAnICsgdGVsO31cbiAgICAgICAgICAgICAgICB3aW5kb3cub3BlbigndGVsOicrdGVsLCAnX2JsYW5rJykuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3RlbC8nK3BvaW50LmlkKycvc2VuZCcsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZ2V0SW5mb3MocG9pbnQuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cmFudFRlbCA9IGFzeW5jKHBvaW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS90ZWwvJytwb2ludC5pZCsnL2VudHJhbnQnLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdUZWwgZW50cmFudCBlbnJlZ2lzdHLDqSc7XG4gICAgICAgICAgICAgICAgdG9hc3QuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0luZm8nLCBkZXRhaWw6IG1lc3NhZ2V1ci52YWx1ZSwgbGlmZTogMzAwMCB9KTtcbiAgICAgICAgICAgICAgICBnZXRJbmZvcyhwb2ludC5pZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZW5kU01TID0gYXN5bmMocG9pbnQsIHRlbCwgbWVzc2FnZUlEKSA9PiB7XG4gICAgICAgICAgICAgICAgdGVsID0gdGVsLnJlcGxhY2VBbGwoXCIgXCIsIFwiXCIpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRlbClcbiAgICAgICAgICAgICAgICBpZih0ZWwubGVuZ3RoID09IDkpe3RlbCA9ICcwJyArIHRlbDt9XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2codGVsKVxuICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gbWVzc2FnZXMudmFsdWUuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5pZCA9PT0gbWVzc2FnZUlEXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2V0ZW1wLnZhbHVlID0gbWVzc2FnZS52YWx1ZVswXS50ZXh0ZS5yZXBsYWNlKFwiTk9NXCIsIHBvaW50LmNpdmlsaXRlKycgJytwb2ludC5ub20pO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2V0ZW1wLnZhbHVlID0gbWVzc2FnZXRlbXAudmFsdWUucmVwbGFjZShcIkFEUkVTU0VcIiwgcG9pbnQubnVtZXJvUnVlKycgJysgcG9pbnQudGl0cmVSdWUrJyAnK3BvaW50Lm5vbVJ1ZSsnICcrcG9pbnQuY29kZVBvc3RhbCsnICcrcG9pbnQudmlsbGUpO1xuICAgICAgICAgICAgICAgIGxldCBsaWVuID0gICdodHRwczovLycrd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKycvZWFlL2Nvbm5lY3QvJytvcGVyYXRpb25JRC52YWx1ZSsnLycrcG9pbnQuaWQ7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXRlbXAudmFsdWUgPSBtZXNzYWdldGVtcC52YWx1ZS5yZXBsYWNlKFwiTElFTlwiLCBsaWVuKTtcbiAgICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1KXtcbiAgICAgICAgICAgICAgICAgICAgaWYocG9pbnQuY3JlbmVhdS5kYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V0ZW1wLnZhbHVlID0gbWVzc2FnZXRlbXAudmFsdWUucmVwbGFjZShcIkRBVEVcIiwgcG9pbnQuY3JlbmVhdS5kYXRlKycgJysgcG9pbnQuY3JlbmVhdS5jcmVuZWF1SG9yYWlyZS5ub20gKycgQWdlbnQgOiAnK3BvaW50LmNyZW5lYXUuYWdlbnQubm9tKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZW5jb2RlZFRleHQgPSBlbmNvZGVVUklDb21wb25lbnQobWVzc2FnZXRlbXAudmFsdWUpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFzdHVjZSBwb3VyIGNvbXBhdGliaWxpdMOpIGlPUyB2cyBBbmRyb2lkXG4gICAgICAgICAgICAgICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHZhciBpc2lPUyA9IC9pcGhvbmV8aXBhZHxpcG9kLy50ZXN0KHVhKTtcbiAgICAgICAgICAgICAgICB2YXIgc2VwYXJhdG9yID0gaXNpT1MgPyAnJicgOiAnPyc7XG5cbiAgICAgICAgICAgICAgICB3aW5kb3cub3Blbignc21zOicgKyB0ZWwgKyBzZXBhcmF0b3IgKyAnYm9keT0nICsgZW5jb2RlZFRleHQsICdfYmxhbmsnKS5mb2N1cygpO1xuXG4gICAgICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvc21zLycrcG9pbnQuaWQrJy8nK21lc3NhZ2UudmFsdWVbMF0uaWQrJy9zZW5kJywge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgIC8vIG1lc3NhZ2V1cj0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGdldEluZm9zKHBvaW50LmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRFbWFpbCA9IGFzeW5jKGlkLCBtZXNzYWdlX0lEKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvbWFpbC8nK2lkKycvJyttZXNzYWdlX0lEKycvbWFpbHNlbmQnLCB7XG4gICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge21lc3NhZ2V1ci52YWx1ZSA9IFwiRXJyZXVyIGVudm9pIG1haWxcIjt9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9IGRhdGEuZGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciByw6lzZWF1XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0SW5mb3MoaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVsZXRlX2xvZz0gYXN5bmMoaWQpID0+IHtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2xvZy9kZWxldGUvJytpZCwge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHttZXNzYWdldXIudmFsdWUgPSBcIkVycmV1ciBlbnZvaSBkZWxldGVcIjt9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdkZWxldGUgb2snXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSBcIkVycmV1ciByw6lzZWF1XCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyZXVyIHLDqXNlYXVcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldEluZm9zKGlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvd0NsYXNzID0gKGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4geyAnY3VzdG9tLWZyb3plbi1yb3cnOiBkYXRhLmZyb3plbiB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNoZWNrVGVsID0gKHRlbCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRlbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBjb25zdCByZWdleCA9IC9eKDZ8MDZ8N3wwNykvOyBcbiAgICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QoU3RyaW5nKHRlbCkpO1xuICAgICAgICB9XG5cbi8vbGVzIHBvaW50cyBzw6lsZWN0aW9ubsOpc1xuXG4vL0VWRU5UIElOVEVSRkFDRSAgXG4gICAgICAgICAgICBjb25zdCBnZXRMYXN0UGxhbmlmaWVkRGF0ZSA9IChwb2ludCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXBvaW50LmxvZ2V0YXRzIHx8IHBvaW50LmxvZ2V0YXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgICAgICAgLy8gMS4gRmlsdHJlciBsZXMgbG9ncyBwYXIgaWQgZCfDqXRhdCA1XG4gICAgICAgICAgICAgIGNvbnN0IHBsYW5pZmllcyA9IHBvaW50LmxvZ2V0YXRzLmZpbHRlcihsb2cgPT4gbG9nLmV0YXQuaWQgPT09IDUpO1xuXG4gICAgICAgICAgICAgIC8vIDIuIFbDqXJpZmllciBzJ2lsIHkgZW4gYSBhdSBtb2lucyB1blxuICAgICAgICAgICAgICBpZiAocGxhbmlmaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiSmFtYWlzIHBsYW5pZmnDqVwiO1xuXG4gICAgICAgICAgICAgIC8vIDMuIFLDqWN1cMOpcmVyIGxlIGRlcm5pZXIgKGVuIHN1cHBvc2FudCBxdWUgbGUgSlNPTiBlc3QgdHJpw6kgcGFyIGRhdGUvSUQgY3JvaXNzYW50KVxuICAgICAgICAgICAgICAvLyBTaSB2b3VzIG4nw6p0ZXMgcGFzIHPDu3IgZHUgdHJpLCB2b3VzIHBvdXZleiBham91dGVyIC5zb3J0KChhLCBiKSA9PiBiLmlkIC0gYS5pZCkgYXZhbnQgbGUgWzBdXG4gICAgICAgICAgICAgIGNvbnN0IGRlcm5pZXJMb2cgPSBwbGFuaWZpZXNbcGxhbmlmaWVzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgICAgICAgIHJldHVybiBkZXJuaWVyTG9nLmRhdGVjcmVhO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFxuICAgICAgICBjb25zdCBpc0FsbFNlbGVjdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbHRlcmVkUG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgLy8gT24gdsOpcmlmaWUgc2kgY2hhcXVlIHByb2R1aXQgZGUgbGEgbGlzdGUgYSBzYSBjbMOpIMOgICd0cnVlJyBkYW5zIGwnb2JqZXQgZGUgc8OpbGVjdGlvblxuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkUG9pbnRzLnZhbHVlLmV2ZXJ5KHAgPT4gc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZVtwLmlkXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRvZ2dsZUFsbCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJlZFBvaW50cy52YWx1ZS5sZW5ndGggPiAxMDApIHtcbiAgICAgICAgICAgICAgICBhbGVydChcIkltcG9zc2libGUgZGUgdG91dCBzw6lsZWN0aW9ubmVyIDogdHJvcCBkZSByw6lzdWx0YXRzICg+MTAwKS5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzQWxsU2VsZWN0ZWQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlID0ge307XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNpbm9uIC0+IG9uIGNvbnN0cnVpdCB1biBvYmpldCBhdmVjIHRvdXMgbGVzIElEcyAoU8OpbGVjdGlvbiB0b3RhbGUpXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0ge307XG4gICAgICAgICAgICAgICAgZmlsdGVyZWRQb2ludHMudmFsdWUuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbmV3U2VsZWN0aW9uW3AuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlID0gbmV3U2VsZWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRvZ2dsZVJvdyA9IChwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHByb2R1Y3QuaWQ7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gISFzZWxlY3RlZFByb2R1Y3RzLnZhbHVlW2lkXTtcblxuICAgICAgICAgICAgLy8gQ3LDqWF0aW9uIGQndW5lIGNvcGllIHBvdXIgbGEgcsOpYWN0aXZpdMOpXG4gICAgICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB7IC4uLnNlbGVjdGVkUHJvZHVjdHMudmFsdWUgfTtcblxuICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV3U2VsZWN0aW9uW2lkXTsgLy8gT24gcmV0aXJlIGxhIGNsw6lcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRhYi52YWx1ZVtpZF0gPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3U2VsZWN0aW9uW2lkXSA9IHRydWU7IC8vIE9uIGFqb3V0ZSBsYSBjbMOpXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWIudmFsdWVbaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy52YWx1ZSA9IG5ld1NlbGVjdGlvbjtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyAxLiBMZXMgw6lsw6ltZW50cyBmaWfDqXMgKGNldXggc8OpbGVjdGlvbm7DqXMpXG4gICAgICAgIGNvbnN0IGZyb3plblBvaW50cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFBvaW50cy52YWx1ZS5maWx0ZXIocCA9PiBzZWxlY3RlZFByb2R1Y3RzLnZhbHVlW3AuaWRdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gMi4gTGVzIMOpbMOpbWVudHMgcmVzdGFudHMgKGNldXggTk9OIHPDqWxlY3Rpb25uw6lzKVxuICAgICAgICBjb25zdCB1bnNlbGVjdGVkUG9pbnRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkUG9pbnRzLnZhbHVlLmZpbHRlcihwID0+ICFzZWxlY3RlZFByb2R1Y3RzLnZhbHVlW3AuaWRdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgb25Sb3dFeHBhbmQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV4cGFuZGVkUm93cy52YWx1ZSA9IHsgW2V2ZW50LmRhdGEuaWRdOiB0cnVlIH07XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdkZXBsb3kgaWQnICsgZXZlbnQuZGF0YS5pZClcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UHJvZHVjdCA9IChwcm9kKSA9PiB7XG4gICAgICAgICAgICBwcm9kdWN0LnZhbHVlID0gey4uLnByb2R9O1xuICAgICAgICAgICAgcHJvZHVjdERpYWxvZy52YWx1ZSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV4cG9ydEV4Y2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgZXhjZWxEaWFsb2cudmFsdWUgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoaWRlRGlhbG9nID0gKCkgPT4ge1xuICAgICAgICAgICAgZXhjZWxEaWFsb2cudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHByb2R1Y3REaWFsb2cudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHN1Ym1pdHRlZC52YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBldmVudFNvdXJjZSA9IG51bGw7XG4gICAgICAgIGNvbnN0IGh1YlVybCA9IFwiaHR0cHM6Ly9tZXJjdXJlLmVhZS1jb25uZWN0LmNvbS8ud2VsbC1rbm93bi9tZXJjdXJlXCI7XG4gICAgICAgIGNvbnN0IHRvcGljID0gXCIvY2FydGVcIjtcblxuICAgICAgICBjb25zdCBjb25uZWN0VG9NZXJjdXJlID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gMS4gRmVybWVyIGwnYW5jaWVubmUgY29ubmV4aW9uIHNpIGVsbGUgZXhpc3RlIHBvdXIgw6l2aXRlciBsZXMgZG91YmxvbnNcbiAgICAgICAgICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoaHViVXJsKTtcbiAgICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwidG9waWNcIiwgdG9waWMpO1xuXG4gICAgICAgICAgICAvLyBOb3RlOiBTaSB2b3VzIHV0aWxpc2V6IHVuIEpXVCwgYXNzdXJlei12b3VzIGRlIGxlIHLDqWfDqW7DqXJlciBpY2kgc2kgYmVzb2luXG4gICAgICAgICAgICBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBoYW5kbGVNZXJjdXJlTWVzc2FnZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignY2FydGUnLCBoYW5kbGVNZXJjdXJlTWVzc2FnZSk7XG5cbiAgICAgICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIEV2ZW50U291cmNlIChkw6ljb25uZXhpb24pIDpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIDIuIFbDqXJpZmllciBsJ8OpdGF0IGRlIGxhIGNvbm5leGlvblxuICAgICAgICAgICAgICAgIC8vIHJlYWR5U3RhdGUgMiBzaWduaWZpZSBxdWUgbGEgY29ubmV4aW9uIGVzdCBkw6lmaW5pdGl2ZW1lbnQgZmVybcOpZVxuICAgICAgICAgICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUZW50YXRpdmUgZGUgcmVjb25uZXhpb24gZGFucyAyIHNlY29uZGVzLi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gMy4gVGVudGVyIHVuZSByZWNvbm5leGlvbiBhcHLDqHMgdW4gZMOpbGFpXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdFRvTWVyY3VyZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBldmVudFNvdXJjZS5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDb25uZXhpb24gYXUgSHViIE1lcmN1cmUgcsOpdXNzaWUgIVwiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgb25Nb3VudGVkKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0VG9NZXJjdXJlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvYWRpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgbW9pcy52YWx1ZSA9IHByb3BzLnBhcmFtLm1vaXM7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsLnZhbHVlID0gcHJvcHMucGFyYW0udG90YWw7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZS52YWx1ZSA9IHByb3BzLnBhcmFtLnN0YXJ0RGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9tYnJlLnZhbHVlID0gcHJvcHMucGFyYW0ubm9tYnJlO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbC52YWx1ZSA9IHByb3BzLnBhcmFtLnRvdGFsO1xuICAgICAgICAgICAgICAgICAgICBwb3VyY2VudC52YWx1ZSA9IE1hdGgucm91bmQocHJvcHMucGFyYW0ubm9tYnJlKjEwMCAvIHByb3BzLnBhcmFtLnRvdGFsKTtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uSUQudmFsdWUgPSBwcm9wcy5wYXJhbS5vcGVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIG1pc3Npb25JRC52YWx1ZSA9IHByb3BzLnBhcmFtLm1pc3Npb247XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaE1pc3Npb24udmFsdWUgPSBtaXNzaW9uSUQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJJRC52YWx1ZSA9IHByb3BzLnBhcmFtLmNsdXN0ZXJJZDtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVNNUy52YWx1ZSA9IHByb3BzLnBhcmFtLm1lc3NhZ2VTTVM7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlYWdlbnRzLnZhbHVlID0gcHJvcHMucGFyYW0uYWdlbnRzO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW1pc3Npb25zLnZhbHVlID0gcHJvcHMucGFyYW0ubWlzc2lvbnM7XG4gICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlLnZhbHVlID0gcHJvcHMucGFyYW0uZGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgIGV0YXRzLnZhbHVlID0gcHJvcHMucGFyYW0uZXRhdHM7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnZhbHVlID0gcHJvcHMucGFyYW0ubWVzc2FnZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgYnVzLm9uKCdjbHVzdGVyLXNlbGVjdGVkJywgdXBkYXRlQ2x1c3Rlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hQb2ludHNPcGVyYXRpb24oKTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBvblVubW91bnRlZCgoKSA9PiB7XG5cbiAgICAgICAgICAgIGJ1cy5vZmYoJ2NsdXN0ZXItc2VsZWN0ZWQnLCB1cGRhdGVDbHVzdGVyKTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiTWVyY3VyZSBFdmVudFNvdXJjZSBjbG9zZWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgLy8gb25CZWZvcmVVbm1vdW50IGVzdCBhcHBlbMOpIGp1c3RlIGF2YW50IHF1ZSBsZSBjb21wb3NhbnQgbmUgc29pdCByZXRpcsOpIGR1IERPTS5cbiAgICAgICAgb25CZWZvcmVVbm1vdW50KCgpID0+IHtcbiAgICAgICAgICBidXMub2ZmKCdjbHVzdGVyLXNlbGVjdGVkJyk7XG4gICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbiAgICAgICAgPGRpdiBpZD1cInBvaW50c1wiIEBkcm9wPVwib25Ecm9wKCRldmVudCwgMSlcIiBAZHJhZ292ZXIucHJldmVudCBAZHJhZ2VudGVyLnByZXZlbnQgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoMTAwdmggLSA1MDBweCk7XCIgdGFibGVTdHlsZT1cIm1heC13aWR0aDogMTIwMHB4XCI+XG4gICAgICAgICAgICA8RGF0YVRhYmxlIFxuICAgICAgICAgICAgOnZhbHVlPVwiZmlsdGVyZWRQb2ludHNcIiBcbiAgICAgICAgICAgIHYtbW9kZWw6ZXhwYW5kZWRSb3dzPVwiZXhwYW5kZWRSb3dzXCIgXG4gICAgICAgICAgICBAcm93RXhwYW5kPVwib25Sb3dFeHBhbmRcIlxuICAgICAgICAgICAgc2Nyb2xsYWJsZSBcbiAgICAgICAgICAgIHNjcm9sbEhlaWdodD1cImZsZXhcIlxuICAgICAgICAgICAgcGFnaW5hdG9yIDpyb3dzPVwiMTAwXCIgXG4gICAgICAgICAgICBkYXRhS2V5PVwiaWRcIiBcbiAgICAgICAgICAgIGZpbHRlckRpc3BsYXk9XCJyb3dcIiBcbiAgICAgICAgICAgIDpsb2FkaW5nPVwibG9hZGluZ1wiXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgOnJvdy1jbGFzcz1cInJvd0NsYXNzXCIgXG4gICAgICAgICAgICA6Y2xhc3M9XCJ7ICdoaWRlLXNlbGVjdC1hbGwnOiBmaWx0ZXJlZFBvaW50cy5sZW5ndGggPiAxMDAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWZpbHRlci1zbGFzaFwiIGxhYmVsPVwiQ2xlYXIgRmlsdHJlXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgQGNsaWNrPVwiY2xlYXJGaWx0ZXIoKVwiIHN0eWxlPVwiaGVpZ2h0OjQwcHg7XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImhlYWRlci1hcHBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOiA2MjBweDtjb2xvcjojMDAwO1wiPjx0Ym9keT48dHI+PHRkIHN0eWxlPVwid2lkdGg6IDEyMHB4O3RleHQtYWxpZ246cmlnaHRcIj4mbmJzcDt7eyBjb3VudCB9fSByw6lzdWx0YXRzPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj4gXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmQgcGItNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b24gaWNvbj1cInBpIHBpLWV4dGVybmFsLWxpbmtcIiBsYWJlbD1cIk1hcnF1ZXIgY29tbWUgUHJvZ3JhbW3DqVwiIEBjbGljaz1cInNlbmRQcm9ncmFtbWVyKClcIiAvPiZuYnNwOyZuYnNwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b24gaWNvbj1cInBpIHBpLWV4dGVybmFsLWxpbmtcIiBsYWJlbD1cIkV4cG9ydFwiIEBjbGljaz1cImV4cG9ydEV4Y2VsKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNlbXB0eT4gUGFzIGRlIHBvaW50IHRyb3V2w6kgb3UgYXV0cmUgbWlzc2lvbi4gPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2xvYWRpbmc+IExvYWRpbmcgLiA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJpZFwiIGhlYWRlcj1cIklEXCIgLz5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGV4cGFuZGVyIHN0eWxlPVwid2lkdGg6IDIwcHhcIiAvPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cInRvZ2dsZUFsbFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzPVwieyAnZGlzYWJsZWQtd3JhcHBlcic6IGZpbHRlcmVkUG9pbnRzLmxlbmd0aCA+IDEwMCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvdXQgc8OpbGVjdGlvbm5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bW9kZWxWYWx1ZT1cImlzQWxsU2VsZWN0ZWRcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJpbmFyeT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZmlsdGVyZWRQb2ludHMubGVuZ3RoID4gMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTtcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljay5zdG9wPVwidG9nZ2xlUm93KGRhdGEpXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC13cmFwcGVyXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGVja2JveCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1vZGVsVmFsdWU9XCIhIXNlbGVjdGVkUHJvZHVjdHNbZGF0YS5pZF1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJpbmFyeT1cInRydWVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTtcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVscz1cIm5vbVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVwieyAnZm9udC1ibHVlJzogc2VsZWN0ZWRUYWJbZGF0YS5pZF0gPT0gdHJ1ZSB9XCI+e3sgZGF0YS5jaXZpbGl0ZSB9fSB7eyBkYXRhLm5vbSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IHYtbW9kZWw9XCJzZWFyY2hOb21cIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiTm9tXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gICAgICBcbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxzPVwiYWxlcnRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VG9nZ2xlU3dpdGNoIHYtbW9kZWw9XCJkYXRhLmFsZXJ0ZVwiIEBjaGFuZ2U9XCJjaGFuZ2VfYWxlcnRlKGRhdGEpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV0YXQtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaEFsZXJ0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3VzXCI+VG91czwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ0cnVlXCI+T3VpPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImZhbHNlXCI+Tm9uPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm51bWVyb0NsaWVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEubnVtZXJvQ2xpZW50IH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCB2LW1vZGVsPVwic2VhcmNoTnVtZXJvQ2xpZW50XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk7CsCBjbGllbnRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPiAgXG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm51bWVyb1BoeXNpcXVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5udW1lcm9QaHlzaXF1ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgdi1tb2RlbD1cInNlYXJjaE51bWVyb1BoeXNpcXVlXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk7CsCBwaHlzXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj4gIFxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbHM9XCJ0ZWwwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDgwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRudGVsMlwiIEBjbGljaz1cImVudHJhbnRUZWwoZGF0YSlcIj48c3BhbiBjbGFzcz1cInBpIHBpLXBob25lXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj48L3NwYW4+PC9idXR0b24+PGJyPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgRW50cmFudFxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbHM9XCJ0ZWxcIiBzdHlsZT1cIm1pbi13aWR0aDogODBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gIHYtZm9yPVwibWVzc2FnZSBpbiBtZXNzYWdlc1wiIDprZXk9XCJtZXNzYWdlLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS50ZWwxICYmIGNoZWNrVGVsKGRhdGEudGVsMSkgJiYgbWVzc2FnZS50eXBlID09IDIgJiYgbWVzc2FnZS5zdWpldC5pbmNsdWRlcygnUmVuZGV6LXZvdXMnKVwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm8gYnRuc21zXCIgQGNsaWNrPVwic2VuZFNNUyhkYXRhLGRhdGEudGVsMSxtZXNzYWdlLmlkKVwiIHN0eWxlPVwid2lkdGg6IDI1MHB4ICFpbXBvcnRhbnQ7IGhlaWdodDo1MHB4O1wiPjxzcGFuIGNsYXNzPVwicGkgcGktbW9iaWxlXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj48L3NwYW4+Jm5ic3A7Jm5ic3A7e3sgbWVzc2FnZS5ub20gfX0ve3sgbWVzc2FnZS5zdWpldCB9fTxicj57eyBkYXRhLnRlbDEgfX08L2J1dHRvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEudGVsMiAmJiBjaGVja1RlbChkYXRhLnRlbDIpICYmIG1lc3NhZ2UudHlwZSA9PSAyICYmIG1lc3NhZ2Uuc3VqZXQuaW5jbHVkZXMoJ1JlbmRlei12b3VzJylcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvIGJ0bnNtc1wiIEBjbGljaz1cInNlbmRTTVMoZGF0YSxkYXRhLnRlbDIsbWVzc2FnZS5pZClcIiBzdHlsZT1cIndpZHRoOiAyNTBweCAhaW1wb3J0YW50OyBoZWlnaHQ6NTBweDtcIj48c3BhbiBjbGFzcz1cInBpIHBpLW1vYmlsZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwOyZuYnNwO3t7IG1lc3NhZ2Uubm9tIH19L3t7IG1lc3NhZ2Uuc3VqZXQgfX08YnI+e3sgZGF0YS50ZWwyIH19PC9idXR0b24+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEudGVsMVwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm8gYnRudGVsXCIgQGNsaWNrPVwic2VuZFRlbChkYXRhLGRhdGEudGVsMSlcIj48c3BhbiBjbGFzcz1cInBpIHBpLXBob25lXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj48L3NwYW4+Jm5ic3A7VEVMIHt7IGRhdGEudGVsMSB9fTwvYnV0dG9uPjwvc3Bhbj48YnI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLnRlbDJcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1pbmZvIGJ0bnRlbFwiIEBjbGljaz1cInNlbmRUZWwoZGF0YSxkYXRhLnRlbDIpXCI+PHNwYW4gY2xhc3M9XCJwaSBwaS1waG9uZVwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+PC9zcGFuPiZuYnNwO1RFTCB7eyBkYXRhLnRlbDIgfX08L2J1dHRvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCB2LW1vZGVsPVwic2VhcmNoVGVsXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlRlbFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiAgZmllbGQ9XCJldGF0XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmV0YXQgJiYgZGF0YS5ldGF0LmlkXCIgOnN0eWxlPVwieyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzJweCA4cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkICNjY2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTYwcHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZmZmJywgLyogQ291bGV1ciBkZSB0ZXh0ZSBibGFuY2hlIHBvdXIgdW4gbWVpbGxldXIgY29udHJhc3RlICovXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRhdGEuZXRhdC5jb3VsZXVyIFxuICAgICAgICAgICAgICAgICAgICB9XCIgQGNsaWNrPVwic2VuZEV0YXQoZGF0YS5pZClcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZGF0YS5ldGF0Lm5vbSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZXRhdC1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoRXRhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3VzXCI+VG91czwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJldGF0IGluIGV0YXRzXCIgOmtleT1cImV0YXRcIiA6dmFsdWU9XCJldGF0LmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGV0YXQubm9tIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiZW1wbGFjZW1lbnRDb21wdGV1clwiIHN0eWxlPVwibWluLXdpZHRoOiAxMDBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLmVtcGxhY2VtZW50Q29tcHRldXIgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJsaWJlbGxlLWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hFbXBsYWNlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvdXNcIj5Ub3VzIGxlcyBlbXBsYWMuPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwiZW1wbGFjZW1lbnQgaW4gZW1wbGFjZW1lbnRzXCIgOmtleT1cImVtcGxhY2VtZW50XCIgOnZhbHVlPVwiZW1wbGFjZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBlbXBsYWNlbWVudCAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwibW9kdWxlU2V1bFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLm1vZHVsZVNldWxcIj5Nb2R1bGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiIWRhdGEubW9kdWxlU2V1bFwiPkNvbXB0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIHN0eWxlPVwid2lkdGg6IDQwcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwic2xvdFByb3BzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGljb249XCJwaSBwaS1wZW5jaWxcIiB2YXJpYW50PVwib3V0bGluZWRcIiByb3VuZGVkIGNsYXNzPVwibXItMlwiIEBjbGljaz1cImRpc3RhbmNlVXBkYXRlKHNsb3RQcm9wcy5kYXRhLmlkLCBkaXN0YW5jZSlcIj57e2Rpc3RhbmNlfX1tPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIm5vbVJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEubnVtZXJvUnVlIH19IHt7IGRhdGEudGl0cmVSdWUgIH19IHt7IGRhdGEubm9tUnVlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwibm9tUnVlLWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hOb21SdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3V0ZXNcIj5Ub3V0ZXMgbGVzIHJ1ZXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJydWUgaW4gcnVlc1wiIDprZXk9XCJydWVcIiA6dmFsdWU9XCJydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBydWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwidmlsbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhLmNvZGVQb3N0YWwgfX0ge3sgZGF0YS52aWxsZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJ2aWxsZS1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoVmlsbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91dGVzXCI+VG91dGVzIHZpbGxlczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJ2aWxsZSBpbiB2aWxsZXNcIiA6a2V5PVwidmlsbGVcIiA6dmFsdWU9XCJ2aWxsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2aWxsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cImFnZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEuYWdlbnRcIj57eyBkYXRhLmFnZW50Lm5vbSB9fSA8c3BhbiB2LWlmPVwiZGF0YS5hZ2VudC5wcmVub21cIj57eyBkYXRhLmFnZW50LnByZW5vbSB9fTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImFnZW50LWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hBZ2VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3VzXCI+VG91cyBhZ2VudHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwiYWdlbnQgaW4gYWdlbnRzXCIgOmtleT1cImFnZW50XCIgOnZhbHVlPVwiYWdlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWdlbnQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJXZWJcIiBzdHlsZT1cIndpZHRoOiAxNXB4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS53ZWJcIj48ZGl2IGNsYXNzPVwiZG90XCI+PHNwYW4+PHNwYW4+PC9zcGFuPjwvc3Bhbj48L2Rpdj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICAgICAgPENvbHVtbiBmaWVsZD1cIlBsYW5pZlwiIHN0eWxlPVwibWluLXdpZHRoOiA1MHB4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInsgZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiZGF0YS5jcmVuZWF1XCI+e3sgZ2V0TGFzdFBsYW5pZmllZERhdGUoZGF0YSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJkYXRlUGxhbmlmLWZpbHRlclwiIHYtbW9kZWw9XCJzZWFyY2hQbGFuaWZSVlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3V0ZXNcIj5QbGFuaWY8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwicGxhblJWIGluIHBsYW5pZlJWXCIgOmtleT1cInBsYW5SVlwiIDp2YWx1ZT1cInBsYW5SVlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwbGFuUlYgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJkYXRlUlZcIiBzdHlsZT1cIm1pbi13aWR0aDogMTUwcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmNyZW5lYXVcIj57eyBkYXRhLmNyZW5lYXUuZGF0ZSB9fSB7eyBkYXRhLmNyZW5lYXUuY3JlbmVhdUhvcmFpcmUubm9tIH19PGJyPkFnZW50IDoge3sgZGF0YS5jcmVuZWF1LmFnZW50Lm5vbSB9fSA8c3BhbiB2LWlmPVwiZGF0YS5jcmVuZWF1LmFnZW50LnByZW5vbVwiPnt7IGRhdGEuY3JlbmVhdS5hZ2VudC5wcmVub20gfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJkYXRlUlYtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaERhdGVSVlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3V0ZXNcIj5SViAvIFRvdXRlcyBkYXRlczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJkYXRlUlYgaW4gZGF0ZXNSVlwiIDprZXk9XCJkYXRlUlZcIiA6dmFsdWU9XCJkYXRlUlZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZVJWIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+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+IHRyID4gdGQge1xuICAvKmJhY2tncm91bmQtY29sb3I6ICNjOGUzZmUgIWltcG9ydGFudDsgKi9cbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiBibHVlICFpbXBvcnRhbnQ7XG59XG4uZHBfX2lucHV0LCAuZHBfX21haW57d2lkdGg6IDI1MHB4ICFpbXBvcnRhbnQ7ZGlzcGxheTogaW5saW5lLWJsb2NrO31cbiNpbmZvc1RhYnMge2JhY2tncm91bmQtY29sb3I6IGdyZXk7cGFkZGluZzogNXB4O31cbi5pbmZvc1RhYiB7aGVpZ2h0OjMwMHB4OyBvdmVyZmxvdy15OiBhdXRvO2JhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7fVxuXG4uaGlkZS1zZWxlY3QtYWxsIHRoID4gLnAtY2hlY2tib3gge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG4ucC10b2dnbGVzd2l0Y2gtc2xpZGVyW2RhdGEtcD1cImNoZWNrZWRcIl0ge2JhY2tncm91bmQtY29sb3I6IHJlZCAhaW1wb3J0YW50O31cblxuLmRyb3Bkb3duLWNvbnRlbnQge2JhY2tncm91bmQtY29sb3I6ICNmZmY7IHotaW5kZXg6IDEwMDAgIWltcG9ydGFudDt9XG5cbnNlbGVjdCB7bWF4LXdpZHRoOiAxMjBweDt9XG5idXR0b24ge31cbi5idG50ZWwge3dpZHRoOiAxNTBweCAhaW1wb3J0YW50OyBmb250LXNpemU6MTJweDtoZWlnaHQgOiAyMHB4ICFpbXBvcnRhbnQ7cGFkZGluZzogMnB4ICFpbXBvcnRhbnQ7fVxuLmJ0bnRlbDIge3dpZHRoOiA0MHB4ICFpbXBvcnRhbnQ7IGxpbmUtaGVpZ2h0OiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Zm9udC1zaXplOjEycHg7aGVpZ2h0IDogMjBweCAhaW1wb3J0YW50O3BhZGRpbmc6IDJweCAhaW1wb3J0YW50O31cbi5idG5zbXMge3dpZHRoOiAxNTBweCAhaW1wb3J0YW50OyBmb250LXNpemU6MTJweDtoZWlnaHQgOiA1MHB4ICFpbXBvcnRhbnQ7cGFkZGluZzogMnB4ICFpbXBvcnRhbnQ7fVxuLmZvbnQtYmx1ZSB7Zm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiByZ2IoMywgMjUzLCA3NCk7fVxuLnAtZGF0YXRhYmxlLWNvbHVtbi1oZWFkZXItY29udGVudCBpbnB1dFt0eXBlPVwidGV4dFwiXSB7bWF4LXdpZHRoOiAxMDBweCAhaW1wb3J0YW50O31cbjwvc3R5bGU+IiwiPHNjcmlwdCBzZXR1cD5cblxuaW1wb3J0IHsgY3JlYXRlQXBwLCByZWYsIG9uTW91bnRlZCwgb25Vbm1vdW50ZWQsIGdldEN1cnJlbnRJbnN0YW5jZSwgY29tcHV0ZWQsIHdhdGNofSAgZnJvbSAndnVlJztcbmltcG9ydCB7IGJ1cyB9IGZyb20gJy4uL2J1cy5qcyc7IFxuaW1wb3J0IExlYWZsZXRTdGFuZGFyZCBmcm9tICcuL0xlYWZsZXRTdGFuZGFyZC52dWUnO1xuaW1wb3J0IFRhYnMgZnJvbSAncHJpbWV2dWUvdGFicyc7XG5pbXBvcnQgVGFiTGlzdCBmcm9tICdwcmltZXZ1ZS90YWJsaXN0JztcbmltcG9ydCBUYWIgZnJvbSAncHJpbWV2dWUvdGFiJztcbmltcG9ydCBUYWJQYW5lbHMgZnJvbSAncHJpbWV2dWUvdGFicGFuZWxzJztcbmltcG9ydCBUYWJQYW5lbCBmcm9tICdwcmltZXZ1ZS90YWJwYW5lbCc7XG5pbXBvcnQgVG9nZ2xlU3dpdGNoIGZyb20gJ3ByaW1ldnVlL3RvZ2dsZXN3aXRjaCc7XG5pbXBvcnQgeyB1c2VUb2FzdCB9IGZyb20gJ3ByaW1ldnVlL3VzZXRvYXN0JztcblxuICAgICAgICBjb25zdCBhZ2VudHMgPSByZWYoW10pOyAvLyBMYSBsaXN0ZSBzZXJhIGNoYXJnw6llIGV0IG1pc2Ugw6Agam91ciB2aWEgTWVyY3VyZS9BUElcbiAgICAgICAgdmFyIGFnZW50czIgPSByZWYoW10pO1xuICAgICAgICBjb25zdCBjb3VudGNyZW5lYXUgPSByZWYoJzAnKTtcbiAgICAgICAgY29uc3QgZG9ubmVlcyA9IFtdO1xuICAgICAgICBjb25zdCB0b2FzdCA9IHVzZVRvYXN0KCk7XG4gICAgICAgIGNvbnN0IGFnZW50c19tYWogPSBbXTtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICAgICAgY29uc3QgaW5pdGlhbEFnZW50cyA9IFtdO1xuICAgICAgICBjb25zdCBzZWFyY2hBZ2VudCA9IHJlZignVG91cycpO1xuICAgICAgICBjb25zdCBzaG93Q29tcGxldGVkID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgbG9hZGluZyA9IHJlZih0cnVlKTtcbiAgICAgICAgY29uc3QgcGFyYW0gPSByZWYobnVsbCk7XG4gICAgICAgIGNvbnN0IHBhcmFtTGVhZmxldCA9IHJlZihudWxsKTtcbiAgICAgICAgY29uc3QgYWdlbnRTZWwgPSByZWYobnVsbCk7XG4gICAgICAgIHZhciBwb2ludCA9IDA7XG4gICAgICAgIHZhciBkaXN0YW5jZSA9ICdyZXNldCc7XG4gICAgICAgIHZhciBkYXRlICA9ICcnO1xuICAgICAgICBjb25zdCB0YWJ2YWx1ZSA9IHJlZignMCcpO1xuICAgICAgICBjb25zdCBjaGVja2VkID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCByZWNoRGlzdGFuY2UgPSByZWYoZmFsc2UpO1xuICAgICAgICBjb25zdCByYXdEYXRhID0gcmVmKFtdKTtcblxuICAgICAgICBjb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcbiAgICAgICAgICBwYXJhbTogIHtcbiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwgXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSBcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcGFyYW1MZWFmbGV0LnZhbHVlID0gcHJvcHMucGFyYW07XG5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ3JlbmVhdXMoZGF0YUNyZW5lYXUpe1xuICAgICAgICAgICAgaWYoZGF0YUNyZW5lYXUub3BlcmF0aW9uKXtwcm9wcy5wYXJhbS5vcGVyYXRpb24gPSBkYXRhQ3JlbmVhdS5vcGVyYXRpb247fVxuICAgICAgICAgICAgcG9pbnQgPSBkYXRhQ3JlbmVhdS5wb2ludDtcbiAgICAgICAgICAgIGRpc3RhbmNlID0gZGF0YUNyZW5lYXUuZGlzdGFuY2U7XG4gICAgICAgICAgICBkYXRlICA9IGRhdGFDcmVuZWF1LmRhdGU7XG4gICAgICAgICAgICB0YWJ2YWx1ZS52YWx1ZSA9ICcxJztcbiAgICAgICAgICAgIGlmKGRhdGFDcmVuZWF1LmFnZW50KXthZ2VudFNlbC52YWx1ZSA9IGRhdGFDcmVuZWF1LmFnZW50O31cbiAgICAgICAgICAgIGZldGNoQ3JlbmVhdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmZXRjaENyZW5lYXVzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgc2VhcmNoQWdlbnQudmFsdWUgPSAnVG91cyc7XG4gICAgICAgICAgICBpZihkaXN0YW5jZSA9PSAncmVzZXQnKXtyZWNoRGlzdGFuY2UudmFsdWUgPSBmYWxzZTt9XG4gICAgICAgICAgICBlbHNle3JlY2hEaXN0YW5jZS52YWx1ZSA9IHRydWU7fVxuICAgICAgICAgICAgaWYoZGF0ZSA9PSAnJyl7ZGF0ZSA9IDA7fVxuICAgICAgICAgICAgaWYocHJvcHMucGFyYW0ub3BlcmF0aW9uKXtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2NyZW5lYXVzLycrcHJvcHMucGFyYW0ub3BlcmF0aW9uKycvMC8nICsgcG9pbnQgKyAnLycgKyBkaXN0YW5jZSArICcvMC8yJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgaWYoZGF0YS5sZW5ndGggPiAzKXtjb3VudC52YWx1ZSA9IGZhbHNlO31cbiAgICAgICAgICAgICAgICAgICBlbHNle2NvdW50LnZhbHVlID0gdHJ1ZTt9XG4gICAgICAgICAgICAgICAgICAgcmF3RGF0YS52YWx1ZSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICBjb3VudGNyZW5lYXUudmFsdWUgPSBhZ2VudHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIHLDqWN1cMOpcmF0aW9uIGRlcyBwb2ludHM6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgLy93aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdGFidmFsdWUudmFsdWUgPSAnMSc7XG4gICAgICAgICAgICAgICAgY2hlY2tlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmZXRjaENyZW5lYXUgPSBhc3luYyAoZGF0YTIpID0+IHtcbiAgICAgICAgICAgIHNlYXJjaEFnZW50LnZhbHVlICA9ICdUb3VzJztcbiAgICAgICAgICAgIGxldCBhZ2VudF9pZCA9IGRhdGEyO1xuICAgICAgICAgICAgaWYocHJvcHMucGFyYW0ub3BlcmF0aW9uKXtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGF0ZS52YWx1ZT0nJztcbiAgICAgICAgICAgICAgICBzaG93Q29tcGxldGVkLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFyIHEgPSAwO1xuICAgICAgICAgICAgICAgIHJlY2hEaXN0YW5jZS52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvY3JlbmVhdXMvJytwcm9wcy5wYXJhbS5vcGVyYXRpb24rJy8nK2FnZW50X2lkKycvMC9yZXNldC8wLzInKTsgLy8gVm90cmUgZW5kcG9pbnQgQVBJIFN5bWZvbnlcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZWRpcmVjdGlvbiBmb3Jjw6llIHZlcnMgbGEgcGFnZSBkZSBsb2dpblxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL2plIHJlbnZvaWUgbGVzIGFnZW50c1xuICAgICAgICAgICAgICAgIHJhd0RhdGEudmFsdWUgPSBkYXRhO1xuICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIHLDqWN1cMOpcmF0aW9uIGRlcyBwb2ludHM6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAvL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9sb2dpbic7IFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0YWJ2YWx1ZS52YWx1ZSA9ICcxJztcbiAgICAgICAgICAgIGNoZWNrZWQudmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH07XG5cbiAgICAgICAvLyAxLiBMaXN0ZSBkZSB0b3VzIGxlcyBhZ2VudHMgKENvbG9ubmVzKVxuY29uc3QgdG91c0xlc0FnZW50cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIHJhd0RhdGEudmFsdWUubWFwKGEgPT4gKHtcbiAgICBpZDogYS5pZCxcbiAgICBub206IGEubm9tLFxuICAgIHByZW5vbTogYS5wcmVub20sXG4gICAgdG90YWxDcmVuZWF1SG9yYWlyZTogYS50b3RhbENyZW5lYXVIb3JhaXJlXG4gIH0pKTtcbn0pO1xuXG4vLyAyLiBMaXN0ZSBkZSB0b3V0ZXMgbGVzIGRhdGVzIHVuaXF1ZXMgdHJpw6llcyAoTGlnbmVzKVxuY29uc3QgdG91dGVzTGVzRGF0ZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGNvbnN0IGRhdGVzID0gbmV3IFNldCgpO1xuICByYXdEYXRhLnZhbHVlLmZvckVhY2goYWdlbnQgPT4ge1xuICAgIGFnZW50LmNyZW5lYXVzLmZvckVhY2goYyA9PiBkYXRlcy5hZGQoYy5kYXRlKSk7XG4gIH0pO1xuICBcbiAgcmV0dXJuIEFycmF5LmZyb20oZGF0ZXMpLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBkMSA9IG5ldyBEYXRlKGEuc3BsaXQoJy0nKS5yZXZlcnNlKCkuam9pbignLScpKTtcbiAgICBjb25zdCBkMiA9IG5ldyBEYXRlKGIuc3BsaXQoJy0nKS5yZXZlcnNlKCkuam9pbignLScpKTtcbiAgICByZXR1cm4gZDEgLSBkMjtcbiAgfSk7XG59KTtcblxuLy8gMy4gSGVscGVyIHBvdXIgcsOpY3Vww6lyZXIgbGVzIGNyw6luZWF1eCBkJ3VuIGFnZW50IHByw6ljaXMgw6AgdW5lIGRhdGUgcHLDqWNpc2VcbmNvbnN0IGdldFNsb3RzRm9yQWdlbnRBbmREYXRlID0gKGFnZW50SWQsIGRhdGUpID0+IHtcbiAgY29uc3QgYWdlbnQgPSByYXdEYXRhLnZhbHVlLmZpbmQoYSA9PiBhLmlkID09PSBhZ2VudElkKTtcbiAgaWYgKCFhZ2VudCkgcmV0dXJuIFtdO1xuICByZXR1cm4gYWdlbnQuY3JlbmVhdXMuZmlsdGVyKGMgPT4gYy5kYXRlID09PSBkYXRlKTtcbn07XG5cbi8vIDQuIEhlbHBlciBwb3VyIGFmZmljaGVyIGxlIGpvdXIgZGUgbGEgc2VtYWluZSAoZXg6IEx1bmRpKVxuY29uc3QgZ2V0Sm91clNlbWFpbmUgPSAoZGF0ZVN0cikgPT4ge1xuICAvLyBPbiByw6ljdXDDqHJlIGxlIG5vbSBkdSBqb3VyIGRlcHVpcyBsZSBwcmVtaWVyIGNyw6luZWF1IHRyb3V2w6kgcG91ciBjZXR0ZSBkYXRlXG4gIGZvciAobGV0IGFnZW50IG9mIHJhd0RhdGEudmFsdWUpIHtcbiAgICBjb25zdCBtYXRjaCA9IGFnZW50LmNyZW5lYXVzLmZpbmQoYyA9PiBjLmRhdGUgPT09IGRhdGVTdHIpO1xuICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLmpvdXJTZW1haW5lRnI7XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59O1xuXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUNhcnRlKCl7XG4gICAgICAgICAgICB0YWJ2YWx1ZS52YWx1ZSA9ICcwJztcbiAgICAgICAgICAgIGNoZWNrZWQudmFsdWUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBjb25zdCBhZ2VudHNGaWx0ZXJlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdG91c0xlc0FnZW50cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNlYXJjaEFnZW50LnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG91c0xlc0FnZW50cy52YWx1ZS5maWx0ZXIoYSA9PiBhLmlkID09PSBwYXJzZUludChzZWFyY2hBZ2VudC52YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7cmV0dXJuIHRvdXNMZXNBZ2VudHMudmFsdWU7fVxuXG4gICAgICAgIH0pXG5cbiAgICAgICAgZnVuY3Rpb24gcmVzZXRDcmVuZWF1KCkge1xuICAgICAgICAgICAgLy9wb2ludCA9IDA7XG4gICAgICAgICAgICBkaXN0YW5jZSA9ICdyZXNldCc7XG4gICAgICAgICAgICBkYXRlICA9ICcnO1xuICAgICAgICAgICAgZmV0Y2hDcmVuZWF1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVzYWN0aXZlciA9IGFzeW5jKGFnZW50X2lkLGlkKSA9PiB7IFxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9jcmVuZWF1L2FjdGl2ZXIvJytpZCwge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZ2VudCA9IHJhd0RhdGEudmFsdWUuZmluZChhID0+IGEuaWQgPT09IGFnZW50X2lkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IGFnZW50LmNyZW5lYXVzLmZpbmQoYyA9PiBjLmlkID09PSBpZCk7XG4gICAgICAgICAgICAgICAgLy9sZXQgY3JlbmVhdUluZGV4ID0gYWdlbnRzLnZhbHVlW2FnZW50X2lkXS5jcmVuZWF1cy5maW5kSW5kZXgocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICAgICAgbWF0Y2guYWN0aWYgPSAhbWF0Y2guYWN0aWY7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0RHJhZyhldnQsIGl0ZW0sIGFnZW50LCBhY3RpZiwgdG90YWxDcmVuZWF1KSB7XG4gICAgICAgIGlmKCFhY3RpZil7YWxlcnQoJ0Nyw6luZWF1IGluYWN0aWYgOiBPcMOpcmF0aW9uIGltcG9zc2libGUnKTtyZXR1cm47fVxuICAgICAgICBjb25zb2xlLmxvZygnY3JlbmVhdScraXRlbSsnYWdlbnQnK2FnZW50KVxuICAgICAgICAgIGV2dC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJ1xuICAgICAgICAgIGV2dC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJ1xuICAgICAgICAgIGV2dC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndG90YWxDcmVuZWF1JywgdG90YWxDcmVuZWF1KVxuICAgICAgICAgIGV2dC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgnaXRlbUlEJywgaXRlbSlcbiAgICAgICAgICBldnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ2FnZW50SUQnLCBhZ2VudClcbiAgICAgICAgICBjb25zdCBpdGVtSUQgPSBldnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ2l0ZW1JRCcpXG4gICAgICAgIH1cblxuICAgICAgICB3YXRjaChjaGVja2VkLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgRmVuMSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb2ludHMnKTtcbiAgICAgICAgICAgIHZhciBGZW4yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lbnUtYmFzJyk7XG4gICAgICAgICAgICBpZihjaGVja2VkLnZhbHVlID09IHRydWUpe1xuICAgICAgICAgICAgICAgIEZlbjEuc3R5bGUuaGVpZ2h0ID0gJ2NhbGMoMTAwdmggLSA1MDBweCknO1xuICAgICAgICAgICAgICAgIEZlbjIuc3R5bGUuaGVpZ2h0ID0gJzQwMHB4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgRmVuMS5zdHlsZS5oZWlnaHQgPSAnY2FsYygxMDB2aCAtIDE4MHB4KSc7XG4gICAgICAgICAgICAgICAgRmVuMi5zdHlsZS5oZWlnaHQgPScxMDBweCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVBvaW50U2VsZWN0aW9uKHBvaW50RGF0YSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0NhcnRlOiDDiXbDqW5lbWVudCBwb2ludC1zZWxlY3RlZCByZcOndSAhJywgcG9pbnREYXRhKTtcbiAgICAgICAgICAgIC8vIExvZ2lxdWUgZGUgbGEgY2FydGUgOiBjZW50cmVyIHN1ciBsZSBwb2ludCwgb3V2cmlyIHVuZSBwb3B1cCwgZXRjLlxuICAgICAgICAgICAgLy8gcGFyIGV4ZW1wbGUgOiBtYXAuZmx5VG8oW3BvaW50RGF0YS5sYXQsIHBvaW50RGF0YS5sbmddLCAxNSk7XG4gICAgICAgIH1cblxuICAgICAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgICAgICAgLy9mZXRjaENyZW5lYXVzKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnY2hlY2tlZCcrY2hlY2tlZC52YWx1ZSlcbiAgICAgICAgICAgIGJ1cy5vbignY3JlbmVhdS11cGRhdGVkJywgZmV0Y2hDcmVuZWF1cyk7XG4gICAgICAgICAgICBidXMub24oJ2NyZW5lYXUtdG9VcGRhdGUnLCB1cGRhdGVDcmVuZWF1cyk7XG4gICAgICAgICAgICBidXMub24oJ2NhcnRlLXRvVXBkYXRlJywgdXBkYXRlQ2FydGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2JzZXJ2ZXIpIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIHRvdXNMZXNBZ2VudHMudmFsdWU9IFtdO1xuICAgICAgICAgICAgcmF3RGF0YS52YWx1ZT0gW107XG4gICAgICAgICAgICB0YWJ2YWx1ZS52YWx1ZSA9ICcwJztcbiAgICAgICAgICAgIGJ1cy5vZmYoJ2NyZW5lYXUtdXBkYXRlZCcsIGZldGNoQ3JlbmVhdXMpO1xuICAgICAgICAgICAgYnVzLm9mZignY3JlbmVhdS10b1VwZGF0ZScsIHVwZGF0ZUNyZW5lYXVzKTtcbiAgICAgICAgICAgIGJ1cy5vZmYoJ2NhcnRlLXRvVXBkYXRlJyk7XG4gICAgICAgIH0pO1xuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG48ZGl2IGlkPVwibWVudS1iYXNcIiBzdHlsZT1cImhlaWdodDogNDAwcHg7XCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXJcIiBzdHlsZT1cImZsb2F0OiByaWdodDttYXJnaW46IDIwcHggMjBweCAwIDA7XCI+XG4gICAgICAgIDxzcGFuIHYtaWY9XCJ0YWJ2YWx1ZSA9PSAxXCI+XG4gICAgICAgICAgICA8c2VsZWN0IGlkPVwiZXRhdC1maWx0ZXJcIiB2LW1vZGVsPVwic2VhcmNoQWdlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiVG91c1wiPlRvdXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwiYWdlbnROIGluIHRvdXNMZXNBZ2VudHNcIiA6a2V5PVwiYWdlbnROLmlkXCIgOnZhbHVlPVwiYWdlbnROLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFnZW50Ti5ub20gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgJm5ic3A7Jm5ic3A7XG4gICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cInJlc2V0Q3JlbmVhdSgpO1wiPlRvdXMgY3LDqW5lYXV4PC9idXR0b24+PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxUb2dnbGVTd2l0Y2ggdi1tb2RlbD1cImNoZWNrZWRcIiAvPlxuICAgIDwvZGl2PlxuPGRpdiBpZD1cImFnZW50c1wiIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XCIgY2xhc3M9XCJtLTBcIiA+XG48ZGl2IHYtaWY9XCJhZ2VudHNGaWx0ZXJlZC5sZW5ndGggPT0gMFwiPiBQYXMgZGUgY3LDqW5lYXUgdHJvdXbDqS4gPC9kaXY+XG48ZGl2IHYtZWxzZSBjbGFzcz1cImNhbGVuZGFyLWNvbnRhaW5lclwiPlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8IS0tIEVuLXTDqnRlIDogTGVzIG5vbXMgZGVzIGFnZW50cyBlbiBjb2xvbm5lcyAtLT5cbiAgICAgICAgICAgIDx0aCB2LWZvcj1cImFnZW50IGluIGFnZW50c0ZpbHRlcmVkXCIgOmtleT1cImFnZW50LmlkXCIgY2xhc3M9XCJzdGlja3ktaGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuICA6Y2xhc3M9XCJbYWdlbnRTZWwgPT0gYWdlbnQuaWQgPyAnZ3JlZW4nIDogJyddXCI+e3sgYWdlbnQubm9tIH19IHt7IGFnZW50LnByZW5vbSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDwhLS0gVW5lIGxpZ25lIHBhciBEYXRlIHVuaXF1ZSAtLT5cbiAgICAgICAgICA8dHIgdi1mb3I9XCJkYXRlIGluIHRvdXRlc0xlc0RhdGVzXCIgOmtleT1cImRhdGVcIj5cbiAgICAgICAgICAgIDx0ZCB2LWZvcj1cImFnZW50IGluIGFnZW50c0ZpbHRlcmVkXCIgOmtleT1cImFnZW50LmlkXCIgY2xhc3M9XCJzbG90LWNlbGxcIj5cbiAgPGRpdiB2LWlmPVwiZ2V0U2xvdHNGb3JBZ2VudEFuZERhdGUoYWdlbnQuaWQsIGRhdGUpLmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IHYtZm9yPVwic2xvdCBpbiBnZXRTbG90c0ZvckFnZW50QW5kRGF0ZShhZ2VudC5pZCwgZGF0ZSlcIiA6a2V5PVwic2xvdC5pZFwiICBjbGFzcz1cInNsb3QtYmFkZ2UgZWwtZHJhZ1wiICAgZHJhZ2dhYmxlPVwidHJ1ZVwiIFxuICBAZHJhZ3N0YXJ0PVwic3RhcnREcmFnKCRldmVudCwgc2xvdC5pZCwgYWdlbnQuaWQsIHNsb3QuYWN0aWYsIHNsb3QudG90YWxDcmVuZWF1SG9yYWlyZSlcIiA6Y2xhc3M9XCJbc2xvdC5jb21wbGV0ID8gJ2NyZW5lYXUtY29tcGxldCcgOiAnJ11cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzbG90LWhlYWRlclwiPlxuICAgICAgICAgIDxkaXY+PHNwYW4gY2xhc3M9XCJ0aW1lXCI+e3sgc2xvdC5qb3VyU2VtYWluZUZyIH19IHt7IHNsb3QuZGF0ZSB9fTxicj57eyBzbG90LmNyZW5lYXVIb3JhaXJlLm5vbSB9fTwvc3Bhbj48L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICA8cCBAY2xpY2s9XCJkZXNhY3RpdmVyKGFnZW50LmlkLHNsb3QuaWQpXCI+e3sgc2xvdC5hY3RpZiA/ICfinIUnIDogJ+KdjCcgfX08L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbG90LWZvb3RlclwiIHYtaWY9XCJzbG90LnBvaW50cy5sZW5ndGggIT09IDBcIiA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby13cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5mby10cmlnZ2VyXCI+4oS577iPPC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1wb3B1cFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgdi1mb3I9XCJwb2ludCBpbiBzbG90LnBvaW50c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgLSA8c3Ryb25nPnt7cG9pbnQubm9tfX08L3N0cm9uZz4gOiB7e3BvaW50LnRpdHJlUnVlfX0ge3twb2ludC5udW1lcm9SdWV9fSB7e3BvaW50LnRpdHJlUnVlfX0ge3twb2ludC5ub21SdWV9fSB7e3BvaW50LnZpbGxlfX0gKHt7cG9pbnQuaWR9fSk8YnI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNsb3QtYm9keVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXQtaXRlbVwiPlxuICAgICAgICA8c3BhbiA6Y2xhc3M9XCJbc2xvdC50b3RhbCA+IDAgPyAnZ3JlZW4nIDogJyddXCI+e3sgc2xvdC50b3RhbCB9fSBSVjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gdGl0bGU9XCJUb3RhbCBwb3VyIGNldHRlIHRyYW5jaGUgaG9yYWlyZVwiIDpjbGFzcz1cIltzbG90LnRvdGFsQ3JlbmVhdUhvcmFpcmUgID49IGFnZW50LnRvdGFsQ3JlbmVhdUhvcmFpcmUgPyAnYWxlcnRlLXJvdWdlJyA6ICd0cmFuY2hlLXRvdGFsJ11cIj4oe3sgc2xvdC50b3RhbENyZW5lYXVIb3JhaXJlIH19KTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gdi1pZj1cInNsb3QuZGlzdGFuY2UgPj0gMCAmJiBzbG90LnRvdGFsID4gMCAmJiBzbG90LnBvaW50cy5sZW5ndGggPiAwXCI+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+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsMS5pZCA8IHZhbDIuaWQgPyAtMSA6IDE7XG4gICAgICAgICAgICB9KTsgICAgICAgICAgICBcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UHJvZHVjdCA9IChwcm9kKSA9PiB7XG4gICAgICAgICAgICBwcm9kdWN0LnZhbHVlID0gey4uLnByb2R9O1xuICAgICAgICAgICAgcHJvZHVjdERpYWxvZy52YWx1ZSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV4cG9ydEV4Y2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgZXhjZWxEaWFsb2cudmFsdWUgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoaWRlRGlhbG9nID0gKCkgPT4ge1xuICAgICAgICAgICAgZXhjZWxEaWFsb2cudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHByb2R1Y3REaWFsb2cudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHN1Ym1pdHRlZC52YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZV9sb2c9IGFzeW5jKGlkKSA9PiB7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9sb2cvZGVsZXRlLycraWQsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7bWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgZW52b2kgZGVsZXRlXCI7fVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnZGVsZXRlIG9rJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciByw6lzZWF1XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hlY2tUZWwgPSAodGVsKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghdGVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gL14oNnwwNnw3fDA3KS87IFxuICAgICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdChTdHJpbmcodGVsKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuICAgICAgICBjb25zdCBodWJVcmwgPSBcImh0dHBzOi8vbWVyY3VyZS5lYWUtY29ubmVjdC5jb20vLndlbGwta25vd24vbWVyY3VyZVwiO1xuICAgICAgICBcbiAgICAgICAgLy9jb25zdCB7IHN0YXR1cywgZGF0YU0sIGVycm9yIH0gPSB1c2VFdmVudFNvdXJjZSh1cmwudG9TdHJpbmcoKSwgWydjYXJ0ZSddKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGNvbm5lY3RUb01lcmN1cmUgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyAxLiBGZXJtZXIgbCdhbmNpZW5uZSBjb25uZXhpb24gc2kgZWxsZSBleGlzdGUgcG91ciDDqXZpdGVyIGxlcyBkb3VibG9uc1xuICAgICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDb25uZXhpb24gYXUgSHViIGZlcm3DqWUgIVwiKTtcbiAgICAgICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChodWJVcmwpO1xuICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJ0b3BpY1wiLCBcIi9jYXJ0ZVwiKTtcbiAgICAgICAgICAgIGNvbnN0IHRvcGljID0gXCIvY2FydGVcIjtcblxuICAgICAgICAgICAgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gaGFuZGxlTWVyY3VyZU1lc3NhZ2U7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NhcnRlJywgaGFuZGxlTWVyY3VyZU1lc3NhZ2UpO1xuICAgICAgICBcbiAgICAgICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIEV2ZW50U291cmNlIChkw6ljb25uZXhpb24pIDpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIDIuIFbDqXJpZmllciBsJ8OpdGF0IGRlIGxhIGNvbm5leGlvblxuICAgICAgICAgICAgICAgIC8vIHJlYWR5U3RhdGUgMiBzaWduaWZpZSBxdWUgbGEgY29ubmV4aW9uIGVzdCBkw6lmaW5pdGl2ZW1lbnQgZmVybcOpZVxuICAgICAgICAgICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUZW50YXRpdmUgZGUgcmVjb25uZXhpb24gZGFucyAzIHNlY29uZGVzLi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gMy4gVGVudGVyIHVuZSByZWNvbm5leGlvbiBhcHLDqHMgdW4gZMOpbGFpXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdFRvTWVyY3VyZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LCAzMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBldmVudFNvdXJjZS5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDb25uZXhpb24gYXUgSHViIE1lcmN1cmUgcsOpdXNzaWUgIVwiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgb25Nb3VudGVkKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0VG9NZXJjdXJlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGFubmluZycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwRWxlbWVudCAmJiBhcHBFbGVtZW50LmRhdGFzZXQudXNlclByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdva1BsYW4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlclByb3BzSnNvbiA9IGFwcEVsZW1lbnQuZGF0YXNldC51c2VyUHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS52YWx1ZSA9IEpTT04ucGFyc2UodXNlclByb3BzSnNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwYXJhbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBldGF0cy52YWx1ZSA9IHBhcmFtLnZhbHVlLmV0YXRzO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZWFnZW50cy52YWx1ZSA9IHBhcmFtLnZhbHVlLmFnZW50cztcbiAgICAgICAgICAgICAgICAgICAgZXRhdHMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JzLnZhbHVlW2VsZW1lbnQuaWRdID0gZWxlbWVudC5jb3VsZXVyO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25JRC52YWx1ZSA9IHBhcmFtLnZhbHVlLm9wZXJhdGlvbklEO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb3BJZCcrcGFyYW0udmFsdWUub3BlcmF0aW9uSUQpXG4gICAgICAgICAgICAgICAgICAgIGZldGNoUG9pbnRzT3BlcmF0aW9uKG9wZXJhdGlvbklELnZhbHVlKVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+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+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uIGZpZWxkPVwiV2ViXCIgc3R5bGU9XCJ3aWR0aDogMTVweFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2JvZHk9XCJ7IGRhdGEgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImRhdGEud2ViXCI+PGRpdiBjbGFzcz1cImRvdFwiPjxzcGFuPjxzcGFuPjwvc3Bhbj48L3NwYW4+PC9kaXY+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgICAgICAgIDxDb2x1bW4gZmllbGQ9XCJkYXRlUlZcIiBzdHlsZT1cIm1pbi13aWR0aDogMTUwcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlICNib2R5PVwieyBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJkYXRhLmNyZW5lYXVcIj57eyBkYXRhLmNyZW5lYXUuZGF0ZSB9fSB7eyBkYXRhLmNyZW5lYXUuY3JlbmVhdUhvcmFpcmUubm9tIH19PGJyPkFnZW50IDoge3sgZGF0YS5jcmVuZWF1LmFnZW50Lm5vbSB9fSA8c3BhbiB2LWlmPVwiZGF0YS5jcmVuZWF1LmFnZW50LnByZW5vbVwiPnt7IGRhdGEuY3JlbmVhdS5hZ2VudC5wcmVub20gfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJkYXRlUlYtZmlsdGVyXCIgdi1tb2RlbD1cInNlYXJjaERhdGVSVlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3V0ZXNcIj5SViAvIFRvdXRlcyBkYXRlczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJkYXRlUlYgaW4gZGF0ZXNSVlwiIDprZXk9XCJkYXRlUlZcIiA6dmFsdWU9XCJkYXRlUlZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZVJWIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICAgICAgICAgPENvbHVtbiBoZWFkZXI9XCJFZGl0XCIgc3R5bGU9XCJ3aWR0aDogNTBweFwiPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYm9keT1cInNsb3RQcm9wc1wiPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gaWNvbj1cInBpIHBpLXBlbmNpbFwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHJvdW5kZWQgY2xhc3M9XCJtci0yXCIgQGNsaWNrPVwiZWRpdFByb2R1Y3Qoc2xvdFByb3BzLmRhdGEpXCI+RWRpdDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9Db2x1bW4+XG4gICAgICAgICAgICA8L0RhdGFUYWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPERpYWxvZyB2LW1vZGVsOnZpc2libGU9XCJwcm9kdWN0RGlhbG9nXCIgOnN0eWxlPVwieyB3aWR0aDogJzQ1MHB4JyB9XCIgaGVhZGVyPVwiRMOpdGFpbHMgZHUgcG9pbnRcIiA6bW9kYWw9XCJ0cnVlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNlwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJudW1lcm9DbGllbnRcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+TnVtw6lybyBDbGllbnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwibnVtZXJvQ2xpZW50XCIgdi1tb2RlbC50cmltPVwicHJvZHVjdC5udW1lcm9DbGllbnRcIiByZXF1aXJlZD1cInRydWVcIiBhdXRvZm9jdXMgOmludmFsaWQ9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QubnVtZXJvQ2xpZW50XCIgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHYtaWY9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QubnVtZXJvQ2xpZW50XCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDBcIj5OdW3DqXJvIENsaWVudCByZXF1aXMuPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY29tcHRldXJBY2Nlc3NpYmxlXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkFjY2Vzc2libGU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImNvbXB0ZXVyQWNjZXNzaWJsZVwiIHYtbW9kZWw9XCJwcm9kdWN0LmNvbXB0ZXVyQWNjZXNzaWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gOnZhbHVlPVwidHJ1ZVwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogZ3JlZW5cIj5PdWk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIDp2YWx1ZT1cImZhbHNlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiByZWRcIj5Ob248L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PiBcbiAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV0YXRcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+Q2hhbmdlciBsJ8OpdGF0PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdCB2LW1vZGVsPVwicHJvZHVjdC5ldGF0XCIgOm9wdGlvbnM9XCJldGF0c1wiIG9wdGlvbkxhYmVsPVwibm9tXCIgIDppbml0aWFsVmFsdWVzPVwicHJvZHVjdC5ldGF0LmlkXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3Rpb25uZXIgdW4gw6l0YXRcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgXG4gICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWdlbnRcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+QWdlbnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0IHYtbW9kZWw9XCJwcm9kdWN0LmFnZW50XCIgOm9wdGlvbnM9XCJsaXN0ZWFnZW50c1wiIG9wdGlvbkxhYmVsPVwibm9tXCIgIDppbml0aWFsVmFsdWVzPVwicHJvZHVjdC5hZ2VudC5pZFwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0aW9ubmVyIHVuIGFnZW50XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gXG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNpdmlsaXRlXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPkNpdmlsaXTDqTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFRleHQgaWQ9XCJjaXZpbGl0ZVwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QuY2l2aWxpdGVcIiByZXF1aXJlZD1cInRydWVcIiBhdXRvZm9jdXMgOmludmFsaWQ9XCJzdWJtaXR0ZWQgJiYgIXByb2R1Y3QuY2l2aWxpdGVcIiBmbHVpZCAvPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgdi1pZj1cInN1Ym1pdHRlZCAmJiAhcHJvZHVjdC5jaXZpbGl0ZVwiIGNsYXNzPVwidGV4dC1yZWQtNTAwXCI+Q2l2aWxpdMOpIHJlcXVpc2UuPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5Ob208L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwibmFtZVwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3Qubm9tXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgYXV0b2ZvY3VzIDppbnZhbGlkPVwic3VibWl0dGVkICYmICFwcm9kdWN0Lm5vbVwiIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCB2LWlmPVwic3VibWl0dGVkICYmICFwcm9kdWN0Lm5vbVwiIGNsYXNzPVwidGV4dC1yZWQtNTAwXCI+Tm9tIHJlcXVpcy48L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0ZWwxXCIgY2xhc3M9XCJibG9jayBmb250LWJvbGQgbWItNlwiPlRlbCAxPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0VGV4dCBpZD1cInRlbDFcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0LnRlbDFcIiByZXF1aXJlZD1cImZhbHNlXCIgYXV0b2ZvY3VzIGZsdWlkIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRlbDJcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+VGVsIDI8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwidGVsMlwiIHYtbW9kZWwudHJpbT1cInByb2R1Y3QudGVsMlwiIHJlcXVpcmVkPVwiZmFsc2VcIiBhdXRvZm9jdXMgZmx1aWQgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZW1haWxcIiBjbGFzcz1cImJsb2NrIGZvbnQtYm9sZCBtYi02XCI+RW1haWw8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGlkPVwiZW1haWxcIiB2LW1vZGVsLnRyaW09XCJwcm9kdWN0LmVtYWlsXCIgcmVxdWlyZWQ9XCJmYWxzZVwiIGF1dG9mb2N1cyBmbHVpZCAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb21tZW50YWlyZVwiIGNsYXNzPVwiYmxvY2sgZm9udC1ib2xkIG1iLTZcIj5Db21tZW50YWlyZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxUZXh0YXJlYSBpZD1cImNvbW1lbnRhaXJlXCIgdi1tb2RlbD1cInByb2R1Y3QuY29tbWVudGFpcmVcIiByZXF1aXJlZD1cImZhbHNlXCIgcm93cz1cIjNcIiBjb2xzPVwiMjBcIiBmbHVpZCAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8dGVtcGxhdGUgI2Zvb3Rlcj5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiQW5udWxlclwiIGljb249XCJwaSBwaS10aW1lc1wiIHRleHQgQGNsaWNrPVwiaGlkZURpYWxvZ1wiIC8+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIlNhdXZlclwiIGljb249XCJwaSBwaS1jaGVja1wiIEBjbGljaz1cInNlbmRJbmZvcyhwcm9kdWN0LmlkKVwiIC8+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L0RpYWxvZz5cbiAgICAgICAgPERpYWxvZyB2LW1vZGVsOnZpc2libGU9XCJleGNlbERpYWxvZ1wiIDpzdHlsZT1cInsgd2lkdGg6ICc0NTBweCcgfVwiIGhlYWRlcj1cIkV4cG9ydCBFeGNlbFwiIDptb2RhbD1cInRydWVcIj5cbiAgICAgICAgICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gbGFiZWw9XCJBbm51bGVyXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgdGV4dCBAY2xpY2s9XCJoaWRlRGlhbG9nXCIgLz5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIGxhYmVsPVwiRXhwb3J0ZXIgbWEgc8OpbGVjdGlvblwiIGljb249XCJwaSBwaS1jaGVja1wiIEBjbGljaz1cInNlbmRFeGNlbCgpXCIgLz5cbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvRGlhbG9nPlxuPC90ZW1wbGF0ZT5cbjxzdHlsZT5cbjpkZWVwKHRyLm15LWN1c3RvbS1oaWdobGlnaHQpIHtcbiAgICAvKmJhY2tncm91bmQ6ICNmY2Q5YTUgIWltcG9ydGFudDsqL1xuICAgIC8qZm9udC13ZWlnaHQ6IGJvbGQ7Ki9cbn1cbi5wLWRhdGF0YWJsZS10aGVhZCA+IHRyID4gdGggIHtcbiAgICBwYWRkaW5nLXRvcDogNHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctbGVmdDogNHB4ICFpbXBvcnRhbnQ7XG59XG4ucC1kYXRhdGFibGUtaGVhZGVyLWNlbGwgICB7XG4gICAgcGFkZGluZy10b3A6IDRweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctYm90dG9tOiA0cHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWxlZnQ6IDRweCAhaW1wb3J0YW50O1xufVxuc2VsZWN0IHttYXgtd2lkdGg6IDEyMHB4O31cbjwvc3R5bGU+IiwiPHNjcmlwdCBzZXR1cD5cblxuaW1wb3J0IHsgY3JlYXRlQXBwLCByZWYsIG9uTW91bnRlZCwgb25CZWZvcmVVbm1vdW50LCBvblVubW91bnRlZCwgZ2V0Q3VycmVudEluc3RhbmNlLCBjb21wdXRlZCwgd2F0Y2h9ICBmcm9tICd2dWUnO1xuXG5pbXBvcnQgeyBGaWx0ZXJNYXRjaE1vZGUsIEZpbHRlck9wZXJhdG9yIH0gZnJvbSAnQHByaW1ldnVlL2NvcmUvYXBpJztcblxuaW1wb3J0IHsgYnVzIH0gZnJvbSAnLi4vYnVzLmpzJzsgXG5pbXBvcnQgeyBGdW5jdGlvbnMgfSBmcm9tICcuL3NlcnZpY2UvRnVuY3Rpb25zJztcblxuaW1wb3J0IHsgVnVlRGF0ZVBpY2tlciB9IGZyb20gJ0B2dWVwaWMvdnVlLWRhdGVwaWNrZXInO1xuaW1wb3J0ICdAdnVlcGljL3Z1ZS1kYXRlcGlja2VyL2Rpc3QvbWFpbi5jc3MnXG5cbmltcG9ydCBTZWFyY2ggZnJvbSAnLi9TZWFyY2gudnVlJztcblxuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJ3ByaW1ldnVlL3Byb2dyZXNzYmFyJztcbmltcG9ydCBEYXRhVGFibGUgZnJvbSAncHJpbWV2dWUvZGF0YXRhYmxlJztcbmltcG9ydCBDb2x1bW4gZnJvbSAncHJpbWV2dWUvY29sdW1uJztcbmltcG9ydCBDb2x1bW5Hcm91cCBmcm9tICdwcmltZXZ1ZS9jb2x1bW5ncm91cCc7ICAgXG5pbXBvcnQgUm93IGZyb20gJ3ByaW1ldnVlL3Jvdyc7ICAgICBcblxuaW1wb3J0IFRvb2xiYXIgZnJvbSAncHJpbWV2dWUvdG9vbGJhcic7XG5pbXBvcnQgeyB1c2VUb2FzdCB9IGZyb20gJ3ByaW1ldnVlL3VzZXRvYXN0JztcblxuaW1wb3J0IElucHV0VGV4dCBmcm9tICdwcmltZXZ1ZS9pbnB1dHRleHQnO1xuaW1wb3J0IFNlbGVjdCBmcm9tICdwcmltZXZ1ZS9zZWxlY3QnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdwcmltZXZ1ZS9idXR0b24nO1xuaW1wb3J0IFRleHRhcmVhIGZyb20gJ3ByaW1ldnVlL3RleHRhcmVhJztcblxuaW1wb3J0IERpYWxvZyBmcm9tICdwcmltZXZ1ZS9kaWFsb2cnO1xuXG5pbXBvcnQgSWNvbkZpZWxkIGZyb20gJ3ByaW1ldnVlL2ljb25maWVsZCc7XG5pbXBvcnQgSW5wdXRJY29uIGZyb20gJ3ByaW1ldnVlL2lucHV0aWNvbic7XG5cblxuICAgICAgICBjb25zdCBldGF0cyA9IHJlZigpO1xuICAgICAgICBjb25zdCBvcGVyYXRpb25JRCA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IHBhcmFtID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VTZWwgPSByZWYoJ1PDqWxlY3Rpb25uZXonKTtcbiAgICAgICAgY29uc3QgdHlwZVNlbCA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlc190eXBlcyA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlc1R5cGUgPSByZWYoW10pOyBcbiAgICAgICAgY29uc3QgcG9pbnRzID0gcmVmKFtdKTsgLy8gTGEgbGlzdGUgc2VyYSBjaGFyZ8OpZSBldCBtaXNlIMOgIGpvdXIgdmlhIE1lcmN1cmUvQVBJXG4gICAgICAgIGNvbnN0IGxvY2tlZFBvaW50cyA9IHJlZihbXSk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2V1ciA9IHJlZignJyk7XG4gICAgICAgIGNvbnN0IG5vbWJyZSA9IHJlZigpO1xuICAgICAgICBjb25zdCB0b3RhbCA9IHJlZigpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZigpO1xuICAgICAgICBjb25zdCBwb3VyY2VudCA9IHJlZigpO1xuICAgICAgICBjb25zdCBtZXNzYWdlU01TPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZUV4Y2VsPSByZWYoKTtcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gcmVmKFtdKTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IDA7XG4gICAgICAgIGxldCBzZWwgPSAwO1xuICAgICAgICBsZXQgc2VhcmNoID0gMDtcbiAgICAgICAgY29uc3QgbWFWYWxldXIgPSByZWYoMClcbiAgICAgICAgY29uc3Qgc2hvd1dpdGhSViA9IHJlZih0cnVlKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkID0gJyc7XG4gICAgICAgIGNvbnN0IG1vaXMgPSByZWYoKTtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gcmVmKCk7XG4gICAgICAgIGNvbnN0IGRhdGUgPSByZWYobmV3IERhdGUoKSk7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJJRCA9IHJlZigpO1xuICAgICAgICBjb25zdCBsb2FkaW5nID1yZWYoKTtcbiAgICAgICAgbG9hZGluZy52YWx1ZSA9IHRydWU7XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoTm9tID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU3RhdHVzID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNlYXJjaE51bWVyb1BoeXNpcXVlID0gcmVmKCcnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaE51bWVyb0NsaWVudCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hOb21SdWUgPSByZWYoJ1RvdXRlcycpOyBcbiAgICAgICAgY29uc3Qgc2VhcmNoRGF0ZVJWID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFF1YXJ0aWVyID0gcmVmKCdUb3VzJyk7XG4gICAgICAgIGNvbnN0IHNlYXJjaFZpbGxlID0gcmVmKCdUb3V0ZXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaEV0YXQgPSByZWYoJ1RvdXMnKTsgXG4gICAgICAgIGNvbnN0IHNlYXJjaFRlbCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMiA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyMyA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyNCA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hDbHVzdGVyNSA9IHJlZignJyk7IFxuICAgICAgICBjb25zdCBzZWFyY2hMaWJlbGxlID0gcmVmKCdUb3VzJyk7IFxuICAgICAgICBjb25zdCBzbG90UHJvcHMgPSByZWYoKTsgXG5cbiAgICAgICAgY29uc3QgY2xpY2tlZFJvd0lkID0gcmVmKG51bGwpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZFRhYmxlUG9pbnRzID0gcmVmKFtdKTsgXG4gICAgICAgIGNvbnN0IENvbG9ycyA9IHJlZihbXSk7IFxuXG4gICAgICAgIGNvbnN0IGV4cGFuZGVkUm93c1RhYiA9IHJlZihbXSk7XG4gICAgICAgIGNvbnN0IHRvYXN0ID0gdXNlVG9hc3QoKTtcbiAgICAgICAgY29uc3QgcHJvZHVjdERpYWxvZyA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IGV4Y2VsRGlhbG9nID0gcmVmKGZhbHNlKTtcbiAgICAgICAgY29uc3QgcHJvZHVjdCA9IHJlZih7fSk7XG4gICAgICAgIGNvbnN0IHN1Ym1pdHRlZCA9IHJlZihmYWxzZSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVmKDApO1xuICAgICAgICBjb25zdCBkYXRhQ3JlbmVhdSA9IHt9O1xuICAgICAgICBjb25zdCBkYXRlRXhjZWwgPSB7fTtcbiAgICAgICAgY29uc3QgZGF0YUNhcnRlID0ge307XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCkrMTtcbiAgICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIHJldHVybiBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUHJvZHVjdHMgPSByZWYoKTtcbiAgICAgICAgY29uc3QgbWV0YUtleSA9IHJlZih0cnVlKTtcblxuLy9DRU5UUkFMRSBERSBDT01NVU5JQ0FUSU9OXG5cbiAgICAgICAgZnVuY3Rpb24gZmV0Y2hQb2ludHMgKGNsdXN0ZXJfaWQpeyAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAvLyB5b3VyIG9wdGlvbnMuLi4gbWV0aG9kOiBQT1NULCBoZWFkZXJzLCBjb3JzLCBldGMuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGUudmFsdWU9JydcbiAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL2NsdXN0ZXIvJytjbHVzdGVyX2lkLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0YS5zdGF0dXMnK2RhdGEuc3RhdHVzKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWRpcmVjdGlvbiBmb3Jjw6llIHZlcnMgbGEgcGFnZSBkZSBsb2dpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NoYXJnZW1lbnQgcG9pbnRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlID0gZGF0YS5yZXNwb25zZS5tYXAocCA9PiAoeyAuLi5wLCBpc0VkaXRpbmc6IGZhbHNlLCBvcmlnaW5hbDoge30sIHNlbGVjdGVkOiBmYWxzZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdEl0ZW0gPSBwb2ludHMudmFsdWUuZmluZCh4PT54IT09dW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VhcmNoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gc2VhcmNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFBvaW50KHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgnVW5lIGVycmV1ciBzXFwnZXN0IHByb2R1aXRlIG91IHZvdXMgw6p0ZXMgZMOpY29ubmVjdMOpJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSAvLyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggZXJyb3JcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBmZXRjaFBvaW50c09wZXJhdGlvbihvcGVyYXRpb25faWQpeyAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAvLyB5b3VyIG9wdGlvbnMuLi4gbWV0aG9kOiBQT1NULCBoZWFkZXJzLCBjb3JzLCBldGMuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjaGFyZ2VtZW50IGRlcyBwb2ludHMnKVxuICAgICAgICAgICAgICAgIGRhdGUudmFsdWU9JydcbiAgICAgICAgICAgICAgICBGdW5jdGlvbnMubWFrZVJlcXVlc3QoJy9hcGkvcG9pbnRzL2V4Y2x1c2lvbi8nK29wZXJhdGlvbl9pZCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhdGEuc3RhdHVzJytkYXRhLnN0YXR1cykgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkaXJlY3Rpb24gZm9yY8OpZSB2ZXJzIGxhIHBhZ2UgZGUgbG9naW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJzsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjaGFyZ2VtZW50IHBvaW50cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEucmVzcG9uc2UubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlID0gZGF0YS5yZXNwb25zZS5tYXAocCA9PiAoeyAuLi5wLCBpc0VkaXRpbmc6IGZhbHNlLCBvcmlnaW5hbDoge30sIHNlbGVjdGVkOiBmYWxzZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdEl0ZW0gPSBwb2ludHMudmFsdWUuZmluZCh4PT54IT09dW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlYXJjaCA+IDApe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4ID0gcG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IHNlYXJjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5maXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRQb2ludChwb2ludHMudmFsdWVbcG9pbnRJbmRleF0uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ1VuZSBlcnJldXIgc1xcJ2VzdCBwcm9kdWl0ZSBvdSB2b3VzIMOqdGVzIGTDqWNvbm5lY3TDqScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkgLy8gZG8gc29tZXRoaW5nIHVzZWZ1bCB3aXRoIGVycm9yXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZ2V0SW5mb3MgPSBhc3luYyhkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdhcHBlbCBnZXQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9wb2ludHMvZ2V0VjIvJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHBvaW50czogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YXMgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludEluZGV4MiA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBlbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2ludEluZGV4MiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleDJdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5lbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkdSBwcm9kdWl0OlwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0VycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZGUgbGEgZmljaGUgOiAnK2F3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgcsOpc2VhdSBsb3JzIGRlIGxhIHNhdXZlZ2FyZGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlTWVyY3VyZU1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpOyBcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBNZXJjdXJlIG1lc3NhZ2UgcmVjZWl2ZWQgOmAsIGRhdGEpO1xuICAgICAgICAgICAgZGF0YS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGVsZW1lbnQuYWN0aW9uO1xuICAgICAgICAgICAgICAgIHZhciByZWZyZXNoX2NyZW5lYXUgPSAwO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIC8vbWlzZSDDoCBqb3VyIGRlcyBjbHVzdGVycyBjb21wbGV0XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NsdXN0ZXJfY29tcGxldGVkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdjbHVzdGVyc2NvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGVsZW1lbnQsIC8vIFBhc3MgeW91ciBkYXRhIGluIHRoZSAnZGV0YWlsJyBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsZWFmbGV0bWFwJykuY29udGVudFdpbmRvdy5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Byb2R1Y3RfdXBkYXRlZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdldEluZm9zKGVsZW1lbnQucG9pbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaF9jcmVuZWF1ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY3JlbmVhdV91cGRhdGVkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjcmVuZWF1X3VwZGF0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaF9jcmVuZWF1ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsVXBkYXRlKGVsZW1lbnQuZG9ubmVlcy5ub21icmUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYocmVmcmVzaF9jcmVuZWF1ID09IDEpe1xuICAgICAgICAgICAgICAgIGJ1cy5lbWl0KCdjcmVuZWF1LXVwZGF0ZWQnLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuLy8gSU5URVJGQUNFXG5cbiAgICAgICAgY29uc3QgdmlsbGVzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxDaXRpZXNXaXRoRHVwbGljYXRlcyA9IHBvaW50cy52YWx1ZS5tYXAocG9pbnQgPT4gcG9pbnQudmlsbGUpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlQ2l0eVNldCA9IG5ldyBTZXQoYWxsQ2l0aWVzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlQ2l0eVNldCkuc29ydCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBxdWFydGllcnMgID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUgfHwgcG9pbnRzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsbFF1YXJ0aWVyc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC5xdWFydGllcik7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVRdWFydGllclNldCA9IG5ldyBTZXQoYWxsUXVhcnRpZXJzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlUXVhcnRpZXJTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcnVlcyAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsUnVlc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC5ub21SdWUpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlUnVlU2V0ID0gbmV3IFNldChhbGxSdWVzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlUnVlU2V0KS5zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGxpYmVsbGVzICA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzLnZhbHVlIHx8IHBvaW50cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGxMaWJlbGxlc1dpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludC5saWJlbGxlQ29tcHRldXIpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlTGliZWxsZXNTZXQgPSBuZXcgU2V0KGFsbExpYmVsbGVzV2l0aER1cGxpY2F0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odW5pcXVlTGliZWxsZXNTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZGF0ZXNSViAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBvaW50cy52YWx1ZSB8fCBwb2ludHMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWxsRGF0ZXNSVldpdGhEdXBsaWNhdGVzID0gcG9pbnRzLnZhbHVlLm1hcChwb2ludCA9PiBwb2ludF9SVihwb2ludCkpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlYWxsRGF0ZXNSVlNldCA9IG5ldyBTZXQoYWxsRGF0ZXNSVldpdGhEdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZWFsbERhdGVzUlZTZXQpLnNvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gcG9pbnRfUlYocG9pbnQpe1xuICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUpeyBcbiAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUpe3JldHVybiBwb2ludC5jcmVuZWF1LmRhdGU7fWVsc2V7cmV0dXJuICdTYW5zIFJWJzt9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2V7cmV0dXJuICdTYW5zIFJWJzt9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9wcmnDqXTDqSBjYWxjdWzDqWUgcXVpIHJlbnZlcnJhIGxhIGxpc3RlIGZpbHRyw6llIMOgIGxhIERhdGFUYWJsZVxuICAgICAgICBjb25zdCBmaWx0ZXJlZFBvaW50cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmaWx0ZXIgZXRhcGUnKTtcbiAgICAgICAgICAgIC8vIFNpIG9uIG4nYSBwYXMgZW5jb3JlIGRlIGRvbm7DqWVzLCBvbiByZW52b2llIHVuIHRhYmxlYXUgdmlkZVxuICAgICAgICAgICAgaWYgKCFwb2ludHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9uIGNvbW1lbmNlIGF2ZWMgdW5lIGNvcGllIGRlIHRvdXRlcyBsZXMgZG9ubsOpZXNcbiAgICAgICAgICAgIGxldCBwb2ludHNUb0ZpbHRlciA9IFsuLi5wb2ludHMudmFsdWVdO1xuXG4gICAgICAgICAgICAvLyBGaWx0cmUgcGFyIG5vbVxuICAgICAgICAgICAgaWYgKHNlYXJjaE5vbS52YWx1ZSAmJiBzZWFyY2hOb20udmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyQ2FzZVNlYXJjaCA9IHNlYXJjaE5vbS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICAvLyBBam91dGV6IGljaSB0b3UgbGVzIGNoYW1wcyBkYW5zIGxlc3F1ZWxzIHZvdXMgdm91bGV6IGNoZXJjaGVyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50Lm5vbS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyQ2FzZVNlYXJjaClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaWx0cmUgcGFyIE51bWVyb1BoeXNpcXVlXG4gICAgICAgICAgICBpZiAoc2VhcmNoTnVtZXJvUGh5c2lxdWUudmFsdWUgJiYgc2VhcmNoTnVtZXJvUGh5c2lxdWUudmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyQ2FzZVNlYXJjaCA9IHNlYXJjaE51bWVyb1BoeXNpcXVlLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIC8vIEFqb3V0ZXogaWNpIHRvdXMgbGVzIGNoYW1wcyBkYW5zIGxlc3F1ZWxzIHZvdXMgdm91bGV6IGNoZXJjaGVyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50Lm51bWVyb1BoeXNpcXVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJDYXNlU2VhcmNoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbHRyZSBwYXIgTnVtZXJvQ2xpZW50XG4gICAgICAgICAgICBpZiAoc2VhcmNoTnVtZXJvQ2xpZW50LnZhbHVlICYmIHNlYXJjaE51bWVyb0NsaWVudC52YWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG93ZXJDYXNlU2VhcmNoID0gc2VhcmNoTnVtZXJvQ2xpZW50LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIC8vIEFqb3V0ZXogaWNpIHRvdXMgbGVzIGNoYW1wcyBkYW5zIGxlc3F1ZWxzIHZvdXMgdm91bGV6IGNoZXJjaGVyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50Lm51bWVyb0NsaWVudC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyQ2FzZVNlYXJjaClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaWx0cmUgcGFyIE5vbVJ1ZVxuICAgICAgICAgICAgaWYgKHNlYXJjaE5vbVJ1ZS52YWx1ZSAmJiBzZWFyY2hOb21SdWUudmFsdWUudHJpbSgpICE9PSAnVG91dGVzJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyQ2FzZVNlYXJjaCA9IHNlYXJjaE5vbVJ1ZS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICAvLyBBam91dGV6IGljaSB0b3VzIGxlcyBjaGFtcHMgZGFucyBsZXNxdWVscyB2b3VzIHZvdWxleiBjaGVyY2hlclxuICAgICAgICAgICAgICAgICAgICBwb2ludC5ub21SdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlckNhc2VTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIFZpbGxlXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCd2aWxsZScrc2VhcmNoVmlsbGUudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoVmlsbGUudmFsdWUgJiYgc2VhcmNoVmlsbGUudmFsdWUgIT09ICdUb3V0ZXMnKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzVG9GaWx0ZXIgPSBwb2ludHNUb0ZpbHRlci5maWx0ZXIocG9pbnQgPT4gXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnZpbGxlID09PSBzZWFyY2hWaWxsZS52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBUZWxcbiAgICAgICAgICAgIGlmIChzZWFyY2hUZWwudmFsdWUgJiYgc2VhcmNoVGVsLnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC50ZWwxLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVsLnZhbHVlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBRdWFydGllclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncXVhcnRpZXInK3NlYXJjaFF1YXJ0aWVyLnZhbHVlKVxuICAgICAgICAgICAgaWYgKHNlYXJjaFF1YXJ0aWVyLnZhbHVlICYmIHNlYXJjaFF1YXJ0aWVyLnZhbHVlICE9PSAnVG91cycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQucXVhcnRpZXIgPT09IHNlYXJjaFF1YXJ0aWVyLnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9GaWx0cmUgcGFyIExpYmVsbGVcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3F1YXJ0aWVyJytzZWFyY2hRdWFydGllci52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hMaWJlbGxlLnZhbHVlICYmIHNlYXJjaExpYmVsbGUudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5saWJlbGxlQ29tcHRldXIgPT09IHNlYXJjaExpYmVsbGUudmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgRGF0ZVJWXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWFydGllcicrc2VhcmNoUXVhcnRpZXIudmFsdWUpXG4gICAgICAgICAgICBpZiAoc2VhcmNoRGF0ZVJWLnZhbHVlICYmIHNlYXJjaERhdGVSVi52YWx1ZSAhPT0gJ1RvdXRlcycpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNUb0ZpbHRlciA9IHBvaW50c1RvRmlsdGVyLmZpbHRlcihwb2ludCA9PiBcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uX3BvaW50X1JWKHBvaW50LCBzZWFyY2hEYXRlUlYudmFsdWUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbmRpdGlvbl9wb2ludF9SVihwb2ludCwgZGF0ZVJWKXtcbiAgICAgICAgICAgICAgaWYocG9pbnQuY3JlbmVhdSl7IFxuICAgICAgICAgICAgICAgICBpZihwb2ludC5jcmVuZWF1LmRhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSA9PSBkYXRlUlYpe3JldHVybiB0cnVlO31cbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgaWYoZGF0ZVJWID09ICdTYW5zIFJWJyl7cmV0dXJuIHRydWU7fVxuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBpZihkYXRlUlYgPT0gJ1NhbnMgUlYnKXtyZXR1cm4gdHJ1ZTt9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0ZpbHRyZSBwYXIgRXRhdFxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZXRhdCcrc2VhcmNoRXRhdC52YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZWFyY2hFdGF0LnZhbHVlICYmIHNlYXJjaEV0YXQudmFsdWUgIT09ICdUb3VzJykge1xuICAgICAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5ldGF0LmlkID09PSBzZWFyY2hFdGF0LnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vRmlsdHJlIHBhciBEYXRlUlZcbiAgICAgICAgICAgIHBvaW50c1RvRmlsdGVyID0gcG9pbnRzVG9GaWx0ZXIuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25fc2VsZWN0ZWQocG9pbnQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbmRpdGlvbl9zZWxlY3RlZChwb2ludCl7XG4gICAgICAgICAgICAgICAgIGlmKHBvaW50LmZyb3plbil7XG4gICAgICAgICAgICAgICAgICAgICAgaWYocG9pbnQuZnJvemVuID09IHRydWUpe3JldHVybiBmYWxzZTt9XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvdW50LnZhbHVlID0gcG9pbnRzVG9GaWx0ZXIubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIHBvaW50c1RvRmlsdGVyO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjbGVhckZpbHRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIHNlYXJjaE5vbS52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoRXRhdC52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaFF1YXJ0aWVyLnZhbHVlID0gJ1RvdXMnO1xuICAgICAgICAgICAgc2VhcmNoTGliZWxsZS52YWx1ZSA9ICdUb3VzJztcbiAgICAgICAgICAgIHNlYXJjaFRlbC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoVmlsbGUudmFsdWUgPSAnVG91dGVzJztcbiAgICAgICAgICAgIHNlYXJjaE5vbVJ1ZS52YWx1ZSA9ICdUb3V0ZXMnO1xuICAgICAgICAgICAgc2VhcmNoTnVtZXJvQ2xpZW50LnZhbHVlICA9ICcnO1xuICAgICAgICAgICAgc2VhcmNoTnVtZXJvUGh5c2lxdWUudmFsdWUgID0gJyc7XG4gICAgICAgICAgICBzZWFyY2hEYXRlUlYudmFsdWUgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb24gcmVjb2l0IHVuIG1lc3NhZ2UgZGUgbGVhZmxldFxuICAgICAgICBjb25zdCB1cGRhdGVDbHVzdGVyID0gKGNsdXN0ZXJTZWFyY2gpID0+IHtcbiAgICAgICAgICAgIGNsZWFyRmlsdGVyKCk7XG4gICAgICAgICAgICBldmFsKCdzZWFyY2hDbHVzdGVyJytjbHVzdGVyU2VhcmNoLnR5cGUrJy52YWx1ZSA9ICcrY2x1c3RlclNlYXJjaC52YWx1ZSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnY2xpYyByZWNpZXZlZCcgKyBjbHVzdGVyU2VhcmNoLnR5cGUgKydpZCcrICsgY2x1c3RlclNlYXJjaC52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL29uIHLDqWluaXRhbGlzZSBsJ2FmZmljaGFnZSwgb24gbMOodmUgbGUgbG9ja1xuICAgICAgICBjb25zdCBnbG9iYWxFeHRlcm5hbENhbGwgPSAoY2x1c3Rlcl9pZCwgc2VsKSA9PiB7XG4gICAgICAgICAgICAvL3NlbmRMb2NrKG51bGwsIDIpO1xuICAgICAgICAgICAgc2VhcmNoID0gc2VsO1xuICAgICAgICAgICAgZmV0Y2hQb2ludHMoY2x1c3Rlcl9pZCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZWRpdFBvaW50ID0gKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50cy52YWx1ZS5maW5kKHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKHBvaW50KSB7XG4gICAgICAgICAgICAgICAgcG9pbnQub3JpZ2luYWwgPSB7IC4uLnBvaW50IH07XG4gICAgICAgICAgICAgICAgcG9pbnQuaXNFZGl0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdwb2ludEMnK3BvaW50LmlkKTtcbiAgICAgICAgICAgICAgICBpZiAocG9pbnQuY3JlbmVhdSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwb2ludC5jcmVuZWF1ID0ge307XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LmNyZW5lYXUuaWQgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9zZW5kTG9jayhwb2ludCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2FuY2VsRWRpdCA9IChpZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRJbmRleCA9IHBvaW50cy52YWx1ZS5maW5kSW5kZXgocCA9PiBwLmlkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAocG9pbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSB7IC4uLnBvaW50cy52YWx1ZVtwb2ludEluZGV4XS5vcmlnaW5hbCwgaXNFZGl0aW5nOiBmYWxzZSwgb3JpZ2luYWw6IHt9IH07XG4gICAgICAgICAgICAgICAgLy9zZW5kTG9jayhwb2ludHMudmFsdWVbcG9pbnRJbmRleF0sIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHNlbmRJbmZvcyA9IGFzeW5jKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9pbnRzL3VwZGF0ZVYyLycraWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBwcm9kdWN0LnZhbHVlLmNvbW1lbnRhaXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2libGU6IHByb2R1Y3QudmFsdWUuY29tcHRldXJBY2Nlc3NpYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpdmlsaXRlOiBwcm9kdWN0LnZhbHVlLmNpdmlsaXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbTogcHJvZHVjdC52YWx1ZS5ub20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJvQ2xpZW50OiBwcm9kdWN0LnZhbHVlLm51bWVyb0NsaWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWwxOiBwcm9kdWN0LnZhbHVlLnRlbDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsMjogcHJvZHVjdC52YWx1ZS50ZWwyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiBwcm9kdWN0LnZhbHVlLmVtYWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YXQ6IHByb2R1Y3QudmFsdWUuZXRhdC5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdNb2RpZmljYXRpb24gZW52b3nDqWUgw6AgU3ltZm9ueS4gQXR0ZW50ZSBkZSBsYSBtaXNlIMOgIGpvdXIgTWVyY3VyZS4uLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0ZpY2hlIG1pc2Ugw6Agam91cic7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5pc0VkaXRpbmcgPSBmYWxzZTsgLy8gU29ydGlyIGR1IG1vZGUgw6lkaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdID0gcHJvZHVjdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVEaWFsb2coKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZHUgcHJvZHVpdDpcIiwgYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2V1ci52YWx1ZSA9ICdFcnJldXIgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGRlIGxhIGZpY2hlIDogJythd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdC5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSW5mbycsIGRldGFpbDogbWVzc2FnZXVyLnZhbHVlLCBsaWZlOiAzMDAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIHLDqXNlYXUgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZW5kRXRhdCA9IGFzeW5jKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvcG9pbnRzL3VwZGF0ZVYyLycraWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGF0OiA5XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ01vZGlmaWNhdGlvbiBlbnZvecOpZSDDoCBTeW1mb255LiBBdHRlbnRlIGRlIGxhIG1pc2Ugw6Agam91ciBNZXJjdXJlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnRmljaGUgbWlzZSDDoCBqb3VyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Byb2R1Y3QuaXNFZGl0aW5nID0gZmFsc2U7IC8vIFNvcnRpciBkdSBtb2RlIMOpZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IHBvaW50SW5kZXggPSBwb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9wb2ludHMudmFsdWVbcG9pbnRJbmRleF0gPSBwcm9kdWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkdSBwcm9kdWl0OlwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gJ0VycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZGUgbGEgZmljaGUgOiAnK2F3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdJbmZvJywgZGV0YWlsOiBtZXNzYWdldXIudmFsdWUsIGxpZmU6IDMwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgnVW5lIGVycmV1ciBzXFwnZXN0IHByb2R1aXRlIG91IHZvdXMgw6p0ZXMgZMOpY29ubmVjdMOpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2VuZEV4Y2VsKCl7XG4gICAgICAgICAgICBoaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICBsZXQgY2hhaW5lID0gJyc7XG4gICAgICAgICAgICBmcm96ZW5Qb2ludHMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoYWluZSA9IGNoYWluZSArIGVsZW1lbnQuaWQgKyAnLCc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZmlsdGVyZWRQb2ludHMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoYWluZSA9IGNoYWluZSArIGVsZW1lbnQuaWQgKyAnLCc7XG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjaGFpbmUuc2xpY2UoMCwgLTEpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmZXRjaCgnL2V4Y2VsL2V4cG9ydC8nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluZTogY2hhaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3Npb25faWQ6IHByb3BzLnBhcmFtLm1pc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYmxvYigpKS50aGVuKGRhdGEgPT4gd2luZG93Lm9wZW4oVVJMLmNyZWF0ZU9iamVjdFVSTChkYXRhKSkpXG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ1VuZSBlcnJldXIgc1xcJ2VzdCBwcm9kdWl0ZSBvdSB2b3VzIMOqdGVzIGTDqWNvbm5lY3TDqScpO1xuICAgICAgICAgICAgIH0gICBcbiAgICAgICAgICAgIC8vd2luZG93Lm9wZW4oJy9hZG1pbi9leGNlbC9leHBvcnQvPycrY2hhaW5lLCAnX2JsYW5rJykuZm9jdXMoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgZnVuY3Rpb24gc2VsZWN0ZWRQb2ludHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHBvaW50cy52YWx1ZS5maWx0ZXIocG9pbnQgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhwb2ludC5zZWxlY3RlZCk7XG4gICAgICAgICAgICByZXR1cm4gKHBvaW50LnNlbGVjdGVkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBzZWFyY2hEYXRlQ3JlbmVhdShpZCkge1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LnBvaW50ID0gaWQ7XG4gICAgICAgICAgICAgICAgZGF0YUNyZW5lYXUuZGlzdGFuY2UgPSAncmVzZXQnO1xuICAgICAgICAgICAgICAgIGRhdGFDcmVuZWF1LmRhdGUgPSBmb3JtYXREYXRlKGRhdGUudmFsdWUpO1xuICAgICAgICAgICAgICBidXMuZW1pdCgnY3JlbmVhdS10b1VwZGF0ZScsIGRhdGFDcmVuZWF1KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZVRvRm9ybWF0KXtcbiAgICAgICAgICBpZiAoIWRhdGVUb0Zvcm1hdCkgcmV0dXJuICcnO1xuICAgICAgICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlVG9Gb3JtYXQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGVUb0Zvcm1hdC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTsgLy8gTGVzIG1vaXMgc29udCBpbmRleMOpcyDDoCBwYXJ0aXIgZGUgMFxuICAgICAgICAgIGNvbnN0IHllYXIgPSBkYXRlVG9Gb3JtYXQuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRTTVMgPSBhc3luYyhwb2ludCwgdGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYodGVsLmxlbmd0aCA9PSA3KXt0ZWwgPSAnMCcgKyB0ZWw7fVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWVbMF0udGV4dGUgPSBtZXNzYWdlLnZhbHVlWzBdLnRleHRlLnJlcGxhY2UoXCJOT01cIiwgcG9pbnQuY2l2aWxpdGUrJyAnK3BvaW50Lm5vbSk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZVswXS50ZXh0ZSA9IG1lc3NhZ2UudmFsdWVbMF0udGV4dGUucmVwbGFjZShcIkFEUkVTU0VcIiwgcG9pbnQubnVtZXJvUnVlKycgJysgcG9pbnQudGl0cmVSdWUrJyAnK3BvaW50Lm5vbVJ1ZSsnICcrcG9pbnQuY29kZVBvc3RhbCsnICcrcG9pbnQudmlsbGUpO1xuICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUpe1xuICAgICAgICAgICAgICAgIGlmKHBvaW50LmNyZW5lYXUuZGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWVbMF0udGV4dGUgPSBtZXNzYWdlLnZhbHVlWzBdLnRleHRlLnJlcGxhY2UoXCJEQVRFXCIsIHBvaW50LmNyZW5lYXUuZGF0ZSsnICcrIHBvaW50LmNyZW5lYXUuY3JlbmVhdUhvcmFpcmUubm9tICsnIEFnZW50IDogJytwb2ludC5jcmVuZWF1LmFnZW50Lm5vbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZW5jb2RlZFRleHQgPSBlbmNvZGVVUklDb21wb25lbnQobWVzc2FnZS52YWx1ZVswXS50ZXh0ZSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQXN0dWNlIHBvdXIgY29tcGF0aWJpbGl0w6kgaU9TIHZzIEFuZHJvaWRcbiAgICAgICAgICAgICAgICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdmFyIGlzaU9TID0gL2lwaG9uZXxpcGFkfGlwb2QvLnRlc3QodWEpO1xuICAgICAgICAgICAgICAgIHZhciBzZXBhcmF0b3IgPSBpc2lPUyA/ICcmJyA6ICc/JztcblxuICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKCdzbXM6JyArIHRlbCArIHNlcGFyYXRvciArICdib2R5PScgKyBlbmNvZGVkVGV4dCwgJ19ibGFuaycpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvc21zLycrcG9pbnQuaWQrJy8nK21lc3NhZ2UudmFsdWVbMF0uaWQrJy9zZW5kJywge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgIC8vIG1lc3NhZ2V1cj0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VuZEVtYWlsID0gYXN5bmMoaWQpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9tYWlsLycraWQrJy8nK21lc3NhZ2UudmFsdWVbMF0uaWQrJy9tYWlsc2VuZCcsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7bWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgZW52b2kgbWFpbFwiO31cbiAgICAgICAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gZGF0YS5kYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSBcIkVycmV1ciByw6lzZWF1XCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyZXVyIHLDqXNlYXVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB3YXRjaChtZXNzYWdlU2VsLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gbWVzc2FnZXMudmFsdWUuZmlsdGVyKHBvaW50ID0+IFxuICAgICAgICAgICAgICAgICAgICBwb2ludC5pZCA9PT0gbWVzc2FnZVNlbC52YWx1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdHlwZVNlbC52YWx1ZSA9IG1lc3NhZ2UudmFsdWVbMF0udHlwZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0eXBlU2VsLnZhbHVlJyt0eXBlU2VsLnZhbHVlKVxuICAgICAgICB9KTtcblxuLy9sZXMgcG9pbnRzIHPDqWxlY3Rpb25uw6lzXG5cbi8vRVZFTlQgSU5URVJGQUNFICBcbiAgICAgICAgY29uc3QgTG9jayA9IChldmVudCkgPT4geyAgICAgIFxuICAgICAgICAgICAgbGV0IHBvaW50SW5kZXggPSAtMTsgICAgICBcbiAgICAgICAgICAgIGxvY2tlZFBvaW50cy52YWx1ZSA9IFtdO1xuICAgICAgICAgICAgcG9pbnRJbmRleCA9IGZpbHRlcmVkUG9pbnRzLnZhbHVlLmZpbmRJbmRleChwID0+IHAuaWQgPT09IGV2ZW50LmRhdGEuaWQpO1xuICAgICAgICAgICAgaWYocG9pbnRJbmRleCAhPSAtMSl7XG4gICAgICAgICAgICAgICAgLy9sb2NrZWRQb2ludHMudmFsdWUgPSBbbG9ja2VkUG9pbnRzLnZhbHVlLmZpbHRlcihwID0+IHAuaWQgIT09IGV2ZW50LmRhdGEuaWQpXTsgIFxuICAgICAgICAgICAgICAgIGZpbHRlcmVkUG9pbnRzLnZhbHVlW3BvaW50SW5kZXhdLmZyb3plbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgZnJvemVuUG9pbnRzLnZhbHVlLnB1c2goZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvaW50SW5kZXggPSBmcm96ZW5Qb2ludHMudmFsdWUuZmluZEluZGV4KHAgPT4gcC5pZCA9PT0gZXZlbnQuZGF0YS5pZCk7XG4gICAgICAgICAgICAvL2V4cGFuZGVkUm93c1RhYi52YWx1ZSA9IFtdO1xuICAgICAgICAgICAgLy9leHBhbmRlZFJvd3NUYWIudmFsdWUucHVzaChmcm96ZW5Qb2ludHMudmFsdWVbcG9pbnRJbmRleF0pO1xuICAgICAgICAgICAgXG5cbiAgICAgICAgICAgIGZpbHRlcmVkUG9pbnRzLnZhbHVlLnNvcnQoKHZhbDEsIHZhbDIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsMS5pZCA8IHZhbDIuaWQgPyAtMSA6IDE7XG4gICAgICAgICAgICB9KTsgICAgICAgICAgICBcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UHJvZHVjdCA9IChwcm9kKSA9PiB7XG4gICAgICAgICAgICBwcm9kdWN0LnZhbHVlID0gey4uLnByb2R9O1xuICAgICAgICAgICAgcHJvZHVjdERpYWxvZy52YWx1ZSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV4cG9ydEV4Y2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgZXhjZWxEaWFsb2cudmFsdWUgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoaWRlRGlhbG9nID0gKCkgPT4ge1xuICAgICAgICAgICAgZXhjZWxEaWFsb2cudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHByb2R1Y3REaWFsb2cudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHN1Ym1pdHRlZC52YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZV9sb2c9IGFzeW5jKGlkKSA9PiB7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9sb2cvZGVsZXRlLycraWQsIHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7bWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgZW52b2kgZGVsZXRlXCI7fVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdldXIudmFsdWUgPSAnZGVsZXRlIG9rJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXVyLnZhbHVlID0gXCJFcnJldXIgcsOpc2VhdVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciByw6lzZWF1XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hlY2tUZWwgPSAodGVsKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghdGVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gL14oNnwwNnw3fDA3KS87IFxuICAgICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdChTdHJpbmcodGVsKSk7XG4gICAgICAgIH1cblxuICBcbiAgICAgICAgbGV0IGV2ZW50U291cmNlID0gbnVsbDtcbiAgICAgICAgY29uc3QgaHViVXJsID0gXCJodHRwczovL21lcmN1cmUuZWFlLWNvbm5lY3QuY29tLy53ZWxsLWtub3duL21lcmN1cmVcIjtcbiAgICAgICAgXG4gICAgICAgIC8vY29uc3QgeyBzdGF0dXMsIGRhdGFNLCBlcnJvciB9ID0gdXNlRXZlbnRTb3VyY2UodXJsLnRvU3RyaW5nKCksIFsnY2FydGUnXSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBjb25uZWN0VG9NZXJjdXJlID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gMS4gRmVybWVyIGwnYW5jaWVubmUgY29ubmV4aW9uIHNpIGVsbGUgZXhpc3RlIHBvdXIgw6l2aXRlciBsZXMgZG91YmxvbnNcbiAgICAgICAgICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ29ubmV4aW9uIGF1IEh1YiBmZXJtw6llICFcIik7XG4gICAgICAgICAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoaHViVXJsKTtcbiAgICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwidG9waWNcIiwgXCIvY2FydGVcIik7XG4gICAgICAgICAgICBjb25zdCB0b3BpYyA9IFwiL2NhcnRlXCI7XG5cbiAgICAgICAgICAgIGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICAgICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGhhbmRsZU1lcmN1cmVNZXNzYWdlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKCdjYXJ0ZScsIGhhbmRsZU1lcmN1cmVNZXNzYWdlKTtcbiAgICAgICAgXG4gICAgICAgICAgICBldmVudFNvdXJjZS5vbmVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciBFdmVudFNvdXJjZSAoZMOpY29ubmV4aW9uKSA6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyAyLiBWw6lyaWZpZXIgbCfDqXRhdCBkZSBsYSBjb25uZXhpb25cbiAgICAgICAgICAgICAgICAvLyByZWFkeVN0YXRlIDIgc2lnbmlmaWUgcXVlIGxhIGNvbm5leGlvbiBlc3QgZMOpZmluaXRpdmVtZW50IGZlcm3DqWVcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PT0gRXZlbnRTb3VyY2UuQ0xPU0VEKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGVudGF0aXZlIGRlIHJlY29ubmV4aW9uIGRhbnMgMyBzZWNvbmRlcy4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIDMuIFRlbnRlciB1bmUgcmVjb25uZXhpb24gYXByw6hzIHVuIGTDqWxhaVxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RUb01lcmN1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMzAwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ29ubmV4aW9uIGF1IEh1YiBNZXJjdXJlIHLDqXVzc2llICFcIik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIG9uTW91bnRlZCgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdFRvTWVyY3VyZSgpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGNsdXNpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcEVsZW1lbnQgJiYgYXBwRWxlbWVudC5kYXRhc2V0LnVzZXJQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlclByb3BzSnNvbiA9IGFwcEVsZW1lbnQuZGF0YXNldC51c2VyUHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS52YWx1ZSA9IEpTT04ucGFyc2UodXNlclByb3BzSnNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwYXJhbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25JRC52YWx1ZSA9IHBhcmFtLnZhbHVlLm9wZXJhdGlvbklEO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb3BJZCcrcGFyYW0udmFsdWUub3BlcmF0aW9uSUQpXG4gICAgICAgICAgICAgICAgICAgIGZldGNoUG9pbnRzT3BlcmF0aW9uKG9wZXJhdGlvbklELnZhbHVlKVxuXG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgb25Vbm1vdW50ZWQoKCkgPT4ge1xuXG4gICAgICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTWVyY3VyZSBFdmVudFNvdXJjZSBjbG9zZWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8vIG9uQmVmb3JlVW5tb3VudCBlc3QgYXBwZWzDqSBqdXN0ZSBhdmFudCBxdWUgbGUgY29tcG9zYW50IG5lIHNvaXQgcmV0aXLDqSBkdSBET00uXG4gICAgICAgIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4vLzxTZWFyY2ggdi1pZj1cInBhcmFtXCIgOnBhcmFtPVwicGFyYW1cIi8+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==*/