/*!*************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-4.use[1]!./assets/styles/app.css ***!
  \*************************************************************************************************/
body {
    background-color: skyblue;
}

/*!*******************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** 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/components/Cart.vue?vue&type=style&index=0&id=814024dc&scoped=true&lang=css ***!
  \*******************************************************************************************************************************************************************************************************************************************************************************/

/* ... (most styles remain the same) ... */
.btn-checkout[data-v-814024dc] {
  display: block;
  width: 100%;
  text-align: center;
  margin-top: 1rem;
  padding: 0.8rem;
  background-color: #28a745;
  color: white;
  text-decoration: none;
  border-radius: 5px;
  font-weight: bold;
  box-sizing: border-box;
}
.btn-checkout[data-v-814024dc]:hover {
  background-color: #218838;
}

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

body { margin: 0; font-family: sans-serif; background-color: #f9f9f9;
}
header { 
  background-color: #fff; 
  padding: 20px; 
  text-align: center; 
  border-bottom: 1px solid #eee;
}
.home-link {
  text-decoration: none;
  color: #2c3e50;
  cursor: pointer;
}
.home-link:hover {
  color: #8B4513;
}
h1 { margin: 0;
}
.main-content {
  display: flex;
  flex-wrap: wrap;
  padding: 20px;
  gap: 20px;
  max-width: 1400px;
  margin: 0 auto;
}
.page-content {
  flex: 3; /* Prend 3/4 de la largeur */
  min-width: 300px;
}
.cart-section {
  flex: 1; /* Prend 1/4 de la largeur */
  min-width: 250px;
}

/* Responsive : sur mobile, le panier passe en dessous */
@media (max-width: 768px) {
.main-content {
    flex-direction: column;
}
.cart-section {
    order: -1; /* Optionnel : met le panier au-dessus sur mobile */
}
}

/*!**************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** 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/components/ProductList.vue?vue&type=style&index=0&id=186085aa&scoped=true&lang=css ***!
  \**************************************************************************************************************************************************************************************************************************************************************************************/

.container[data-v-186085aa] { max-width: 1200px; margin: 0 auto; padding: 20px;
}
.title[data-v-186085aa] { text-align: center; color: #8B4513; margin-bottom: 30px; font-family: serif;
}
.product-grid[data-v-186085aa] { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 20px;
}
.product-card[data-v-186085aa] { border: 1px solid #ddd; border-radius: 8px; padding: 15px; text-align: center; transition: transform 0.2s; background: white; display: flex; flex-direction: column;
}
.product-card[data-v-186085aa]:hover { transform: translateY(-5px); box-shadow: 0 5px 15px rgba(0,0,0,0.1);
}

/* Styles pour le lien */
.product-link[data-v-186085aa] { text-decoration: none; color: inherit; display: block; margin-bottom: 10px;
}
.product-link:hover h3[data-v-186085aa] { color: #8B4513;
}
.product-image[data-v-186085aa] { width: 100%; height: 200px; object-fit: cover; border-radius: 4px; margin-bottom: 10px;
}
.image-placeholder[data-v-186085aa] { background: #f0f0f0; height: 150px; display: flex; align-items: center; justify-content: center; font-size: 3rem; color: #ccc; margin-bottom: 15px; border-radius: 4px;
}
.description[data-v-186085aa] { font-size: 0.9rem; color: #666; min-height: 40px; margin-bottom: auto; /* Pousse le prix et le bouton vers le bas */
}
.price[data-v-186085aa] { font-size: 1.2rem; font-weight: bold; color: #2c3e50; margin: 15px 0;
}
.btn-cart[data-v-186085aa] { background-color: #8B4513; color: white; border: none; padding: 10px 20px; border-radius: 5px; cursor: pointer; width: 100%;
}
.btn-cart[data-v-186085aa]:hover { background-color: #A0522D;
}

/*!****************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** 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/components/ProductDetail.vue?vue&type=style&index=0&id=2a43aa1e&scoped=true&lang=css ***!
  \****************************************************************************************************************************************************************************************************************************************************************************************/

.product-detail-container[data-v-2a43aa1e] {
  max-width: 1000px;
  margin: 0 auto;
  padding: 20px;
  background: white;
  border-radius: 8px;
  box-shadow: 0 2px 10px rgba(0,0,0,0.05);
}
.product-detail[data-v-2a43aa1e] {
  display: flex;
  gap: 40px;
}
.image-section[data-v-2a43aa1e] {
  flex: 1;
  max-width: 500px;
}
.product-image[data-v-2a43aa1e] {
  width: 100%;
  height: auto;
  border-radius: 8px;
  object-fit: cover;
}
.image-placeholder[data-v-2a43aa1e] {
  width: 100%;
  height: 400px;
  background: #f0f0f0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 5rem;
  color: #ccc;
  border-radius: 8px;
}
.info-section[data-v-2a43aa1e] {
  flex: 1;
  display: flex;
  flex-direction: column;
}
h1[data-v-2a43aa1e] {
  color: #2c3e50;
  margin-top: 0;
}
.price[data-v-2a43aa1e] {
  font-size: 2rem;
  color: #8B4513;
  font-weight: bold;
  margin: 10px 0;
}
.description[data-v-2a43aa1e] {
  font-size: 1.1rem;
  line-height: 1.6;
  color: #555;
  margin-bottom: 30px;
}
.actions[data-v-2a43aa1e] {
  margin-top: auto;
  display: flex;
  gap: 15px;
}
.btn-add[data-v-2a43aa1e] {
  background-color: #8B4513;
  color: white;
  border: none;
  padding: 15px 30px;
  font-size: 1.1rem;
  border-radius: 5px;
  cursor: pointer;
  transition: background 0.2s;
}
.btn-add[data-v-2a43aa1e]:hover {
  background-color: #A0522D;
}
.btn-back[data-v-2a43aa1e] {
  display: inline-block;
  padding: 15px 20px;
  text-decoration: none;
  color: #666;
  border: 1px solid #ddd;
  border-radius: 5px;
  transition: background 0.2s;
}
.btn-back[data-v-2a43aa1e]:hover {
  background-color: #f9f9f9;
}
.loading[data-v-2a43aa1e], .error[data-v-2a43aa1e] {
  text-align: center;
  padding: 50px;
  font-size: 1.2rem;
  color: #666;
}
.error[data-v-2a43aa1e] {
  color: #e74c3c;
}

/* Responsive */
@media (max-width: 768px) {
.product-detail[data-v-2a43aa1e] {
    flex-direction: column;
}
}

/*!***********************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** 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/components/Checkout.vue?vue&type=style&index=0&id=2cebbfb8&scoped=true&lang=css ***!
  \***********************************************************************************************************************************************************************************************************************************************************************************/

.checkout-container[data-v-2cebbfb8] {
  max-width: 800px;
  margin: 2rem auto;
  padding: 2rem;
  background-color: #fff;
  border-radius: 8px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
}
h2[data-v-2cebbfb8] {
  text-align: center;
  color: #2c3e50;
  margin-bottom: 2rem;
}
.form-section[data-v-2cebbfb8], .summary-section[data-v-2cebbfb8] {
  margin-bottom: 2rem;
}
.form-group[data-v-2cebbfb8] {
  margin-bottom: 1.5rem;
}
label[data-v-2cebbfb8] {
  display: block;
  margin-bottom: 0.5rem;
  font-weight: 600;
  color: #34495e;
}
input[type="text"][data-v-2cebbfb8],
input[type="email"][data-v-2cebbfb8],
textarea[data-v-2cebbfb8] {
  width: 100%;
  padding: 0.8rem;
  border: 1px solid #bdc3c7;
  border-radius: 4px;
  font-size: 1rem;
  box-sizing: border-box; /* Important for padding and width */
}
textarea[data-v-2cebbfb8] {
  resize: vertical;
}
.btn-submit[data-v-2cebbfb8] {
  display: block;
  width: 100%;
  padding: 1rem;
  background-color: #8B4513;
  color: white;
  border: none;
  border-radius: 5px;
  font-size: 1.2rem;
  font-weight: bold;
  cursor: pointer;
  transition: background-color 0.2s;
}
.btn-submit[data-v-2cebbfb8]:hover:not(:disabled) {
  background-color: #A0522D;
}
.btn-submit[data-v-2cebbfb8]:disabled {
  background-color: #ccc;
  cursor: not-allowed;
}
.error-message[data-v-2cebbfb8] {
  background-color: #f8d7da;
  color: #721c24;
  padding: 1rem;
  border-radius: 4px;
  margin-bottom: 1rem;
  text-align: center;
}
.success-message[data-v-2cebbfb8] {
  text-align: center;
  padding: 2rem;
  background-color: #d4edda;
  color: #155724;
  border-radius: 8px;
}
.btn-primary[data-v-2cebbfb8] {
  display: inline-block;
  margin-top: 1rem;
  padding: 0.8rem 1.5rem;
  background-color: #28a745;
  color: white;
  text-decoration: none;
  border-radius: 5px;
}


/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUN6QixrQkFBa0I7RUFDbEIsZUFBZTtFQUNmLHNCQUFzQixFQUFFLG9DQUFvQztBQUM5RDtBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCO0FBRUE7RUFDRSxjQUFjO0VBQ2QsV0FBVztFQUNYLGFBQWE7RUFDYix5QkFBeUI7RUFDekIsWUFBWTtFQUNaLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsaUJBQWlCO0VBQ2pCLGlCQUFpQjtFQUNqQixlQUFlO0VBQ2YsaUNBQWlDO0FBQ25DO0FBRUE7RUFDRSx5QkFBeUI7QUFDM0I7QUFFQTtFQUNFLHNCQUFzQjtFQUN0QixtQkFBbUI7QUFDckI7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixjQUFjO0VBQ2QsYUFBYTtFQUNiLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsa0JBQWtCO0FBQ3BCO0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsYUFBYTtFQUNiLHlCQUF5QjtFQUN6QixjQUFjO0VBQ2Qsa0JBQWtCO0FBQ3BCO0FBRUE7RUFDRSxxQkFBcUI7RUFDckIsZ0JBQWdCO0VBQ2hCLHNCQUFzQjtFQUN0Qix5QkFBeUI7RUFDekIsWUFBWTtFQUNaLHFCQUFxQjtFQUNyQixrQkFBa0I7QUFDcEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvc3R5bGVzL2FwcC5jc3MiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3Z1ZS9jb21wb25lbnRzL0NhcnQudnVlIiwid2VicGFjazovLy8uL2Fzc2V0cy92dWUvQXBwLnZ1ZSIsIndlYnBhY2s6Ly8vLi9hc3NldHMvdnVlL2NvbXBvbmVudHMvUHJvZHVjdExpc3QudnVlIiwid2VicGFjazovLy8uL2Fzc2V0cy92dWUvY29tcG9uZW50cy9Qcm9kdWN0RGV0YWlsLnZ1ZSIsIndlYnBhY2s6Ly8vLi9hc3NldHMvdnVlL2NvbXBvbmVudHMvQ2hlY2tvdXQudnVlIl0sInNvdXJjZXNDb250ZW50IjpbImJvZHkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHNreWJsdWU7XG59XG4iLCI8IS0tIGFzc2V0cy92dWUvY29tcG9uZW50cy9DYXJ0LnZ1ZSAtLT5cbjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImNhcnQtY29udGFpbmVyXCI+XG4gICAgPGgzPk1vbiBQYW5pZXIgKHt7IGNhcnRDb3VudCB9fSk8L2gzPlxuICAgIDxkaXYgdi1pZj1cImNhcnQuaXRlbXMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjYXJ0LWVtcHR5XCI+XG4gICAgICBWb3RyZSBwYW5pZXIgZXN0IHZpZGUuXG4gICAgPC9kaXY+XG4gICAgPGRpdiB2LWVsc2U+XG4gICAgICA8dWw+XG4gICAgICAgIDxsaSB2LWZvcj1cIml0ZW0gaW4gY2FydC5pdGVtc1wiIDprZXk9XCJpdGVtLnByb2R1Y3QuaWRcIj5cbiAgICAgICAgICA8c3Bhbj57eyBpdGVtLnByb2R1Y3QubmFtZSB9fSAoeHt7IGl0ZW0ucXVhbnRpdHkgfX0pPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7IGZvcm1hdFByaWNlKGl0ZW0ucHJvZHVjdC5wcmljZSAqIGl0ZW0ucXVhbnRpdHkpIH19PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwicmVtb3ZlRnJvbUNhcnQoaXRlbS5wcm9kdWN0LmlkKVwiIGNsYXNzPVwiYnRuLXJlbW92ZVwiPlg8L2J1dHRvbj5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgICA8aHI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FydC10b3RhbFwiPlxuICAgICAgICA8c3Ryb25nPlRvdGFsIDo8L3N0cm9uZz5cbiAgICAgICAgPHN0cm9uZz57eyBmb3JtYXRQcmljZShjYXJ0VG90YWwpIH19PC9zdHJvbmc+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPCEtLSAtLS0gQUREIFRISVMgQlVUVE9OIC0tLSAtLT5cbiAgICAgIDxyb3V0ZXItbGluayB0bz1cIi9jaGVja291dFwiIGNsYXNzPVwiYnRuLWNoZWNrb3V0XCI+XG4gICAgICAgIFZhbGlkZXIgbW9uIHBhbmllclxuICAgICAgPC9yb3V0ZXItbGluaz5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgc2V0dXA+XG4vLyAuLi4gKHRoZSBzY3JpcHQgcGFydCByZW1haW5zIHRoZSBzYW1lKVxuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAndnVlJztcblxuY29uc3QgeyBjYXJ0LCByZW1vdmVGcm9tQ2FydCwgY2FydENvdW50LCBjYXJ0VG90YWwgfSA9IGluamVjdCgnY2FydCcpO1xuXG5jb25zdCBmb3JtYXRQcmljZSA9IChwcmljZSkgPT4ge1xuICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCdmci1GUicsIHsgc3R5bGU6ICdjdXJyZW5jeScsIGN1cnJlbmN5OiAnRVVSJyB9KS5mb3JtYXQocHJpY2UpO1xufTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkPlxuLyogLi4uIChtb3N0IHN0eWxlcyByZW1haW4gdGhlIHNhbWUpIC4uLiAqL1xuXG4uYnRuLWNoZWNrb3V0IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG1hcmdpbi10b3A6IDFyZW07XG4gIHBhZGRpbmc6IDAuOHJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzI4YTc0NTtcbiAgY29sb3I6IHdoaXRlO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5idG4tY2hlY2tvdXQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE4ODM4O1xufVxuPC9zdHlsZT5cbiIsIjwhLS0gYXNzZXRzL3Z1ZS9BcHAudnVlIC0tPlxuPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiYXBwLXdyYXBwZXJcIj5cbiAgICA8aGVhZGVyPlxuICAgICAgPCEtLSBMZSB0aXRyZSBkZXZpZW50IHVuIGxpZW4gdmVycyBsYSBwYWdlIGQnYWNjdWVpbCAtLT5cbiAgICAgIDxoMT5cbiAgICAgICAgPHJvdXRlci1saW5rIHRvPVwiL1wiIGNsYXNzPVwiaG9tZS1saW5rXCI+TGVzIFNhdmV1cnMgVGVycm9pciBPY2NpdGFuPC9yb3V0ZXItbGluaz5cbiAgICAgIDwvaDE+XG4gICAgPC9oZWFkZXI+XG4gICAgXG4gICAgPGRpdiBjbGFzcz1cIm1haW4tY29udGVudFwiPlxuICAgICAgPCEtLSBab25lIHByaW5jaXBhbGUgZ8OpcsOpZSBwYXIgbGUgcm91dGV1ciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYWdlLWNvbnRlbnRcIj5cbiAgICAgICAgPCEtLSBDJ2VzdCBpY2kgcXVlIHMnYWZmaWNoZXJhIHNvaXQgUHJvZHVjdExpc3QsIHNvaXQgUHJvZHVjdERldGFpbCAtLT5cbiAgICAgICAgPHJvdXRlci12aWV3Pjwvcm91dGVyLXZpZXc+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBMYSBiYXJyZSBsYXTDqXJhbGUgYXZlYyBsZSBwYW5pZXIgcmVzdGUgZml4ZSBzdXIgdG91dGVzIGxlcyBwYWdlcyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0LXNlY3Rpb25cIj5cbiAgICAgICAgPENhcnQgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyBwcm92aWRlIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IHVzZUNhcnQgfSBmcm9tICcuL3NlcnZpY2VzL2NhcnQuanMnO1xuaW1wb3J0IENhcnQgZnJvbSAnLi9jb21wb25lbnRzL0NhcnQudnVlJztcbi8vIE5vdGUgOiBPbiBuJ2ltcG9ydGUgcGx1cyBQcm9kdWN0TGlzdCBpY2ksIGNhciBjJ2VzdCBsZSByb3V0ZXVyIHF1aSBzJ2VuIGNoYXJnZSB2aWEgcm91dGVyLmpzXG5cbi8vIEluaXRpYWxpc2F0aW9uIGR1IHNlcnZpY2UgZGUgcGFuaWVyXG5jb25zdCBjYXJ0U2VydmljZSA9IHVzZUNhcnQoKTtcblxuLy8gT24gcmVuZCBsZSBwYW5pZXIgYWNjZXNzaWJsZSDDoCB0b3VzIGxlcyBjb21wb3NhbnRzICh5IGNvbXByaXMgY2V1eCBjaGFyZ8OpcyBwYXIgbGUgcm91dGV1cilcbnByb3ZpZGUoJ2NhcnQnLCBjYXJ0U2VydmljZSk7XG48L3NjcmlwdD5cblxuPHN0eWxlPlxuYm9keSB7IG1hcmdpbjogMDsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7IH1cblxuaGVhZGVyIHsgXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7IFxuICBwYWRkaW5nOiAyMHB4OyBcbiAgdGV4dC1hbGlnbjogY2VudGVyOyBcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7IFxufVxuXG4uaG9tZS1saW5rIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogIzJjM2U1MDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uaG9tZS1saW5rOmhvdmVyIHtcbiAgY29sb3I6ICM4QjQ1MTM7XG59XG5cbmgxIHsgbWFyZ2luOiAwOyB9XG5cbi5tYWluLWNvbnRlbnQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIHBhZGRpbmc6IDIwcHg7XG4gIGdhcDogMjBweDtcbiAgbWF4LXdpZHRoOiAxNDAwcHg7XG4gIG1hcmdpbjogMCBhdXRvO1xufVxuXG4ucGFnZS1jb250ZW50IHtcbiAgZmxleDogMzsgLyogUHJlbmQgMy80IGRlIGxhIGxhcmdldXIgKi9cbiAgbWluLXdpZHRoOiAzMDBweDtcbn1cblxuLmNhcnQtc2VjdGlvbiB7XG4gIGZsZXg6IDE7IC8qIFByZW5kIDEvNCBkZSBsYSBsYXJnZXVyICovXG4gIG1pbi13aWR0aDogMjUwcHg7XG59XG5cbi8qIFJlc3BvbnNpdmUgOiBzdXIgbW9iaWxlLCBsZSBwYW5pZXIgcGFzc2UgZW4gZGVzc291cyAqL1xuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XG4gIC5tYWluLWNvbnRlbnQge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIH1cbiAgLmNhcnQtc2VjdGlvbiB7XG4gICAgb3JkZXI6IC0xOyAvKiBPcHRpb25uZWwgOiBtZXQgbGUgcGFuaWVyIGF1LWRlc3N1cyBzdXIgbW9iaWxlICovXG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8IS0tIGFzc2V0cy92dWUvY29tcG9uZW50cy9Qcm9kdWN0TGlzdC52dWUgLS0+XG48dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICA8aDIgY2xhc3M9XCJ0aXRsZVwiPk5vcyBTYXZldXJzIGR1IFRlcnJvaXI8L2gyPlxuICAgIFxuICAgIDxkaXYgdi1pZj1cImxvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmdcIj5DaGFyZ2VtZW50IGRlcyBkw6lsaWNlcy4uLjwvZGl2PlxuICAgIFxuICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwicHJvZHVjdC1ncmlkXCI+XG4gICAgICA8ZGl2IHYtZm9yPVwicHJvZHVjdCBpbiBwcm9kdWN0c1wiIDprZXk9XCJwcm9kdWN0LmlkXCIgY2xhc3M9XCJwcm9kdWN0LWNhcmRcIj5cbiAgICAgICAgPCEtLSBMaWVuIHZlcnMgbGEgcGFnZSBkw6l0YWlsIC0tPlxuICAgICAgICA8cm91dGVyLWxpbmsgOnRvPVwiJy9wcm9kdWN0LycgKyBwcm9kdWN0LmlkXCIgY2xhc3M9XCJwcm9kdWN0LWxpbmtcIj5cbiAgICAgICAgICA8aW1nIHYtaWY9XCJwcm9kdWN0LmltYWdlXCIgOnNyYz1cInByb2R1Y3QuaW1hZ2VcIiA6YWx0PVwicHJvZHVjdC5uYW1lXCIgY2xhc3M9XCJwcm9kdWN0LWltYWdlXCI+XG4gICAgICAgICAgPGRpdiB2LWVsc2UgY2xhc3M9XCJpbWFnZS1wbGFjZWhvbGRlclwiPnt7IHByb2R1Y3QubmFtZS5jaGFyQXQoMCkgfX08L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICA8aDM+e3sgcHJvZHVjdC5uYW1lIH19PC9oMz5cbiAgICAgICAgPC9yb3V0ZXItbGluaz5cblxuICAgICAgICA8cCBjbGFzcz1cImRlc2NyaXB0aW9uXCI+e3sgcHJvZHVjdC5kZXNjcmlwdGlvbiB9fTwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlXCI+e3sgZm9ybWF0UHJpY2UocHJvZHVjdC5wcmljZSkgfX08L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIDxidXR0b24gQGNsaWNrPVwiYWRkVG9DYXJ0KHByb2R1Y3QpXCIgY2xhc3M9XCJidG4tY2FydFwiPkFqb3V0ZXIgYXUgcGFuaWVyPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IHNldHVwPlxuaW1wb3J0IHsgcmVmLCBvbk1vdW50ZWQsIGluamVjdCB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuXG5jb25zdCB7IGFkZFRvQ2FydCB9ID0gaW5qZWN0KCdjYXJ0Jyk7XG5cbmNvbnN0IHByb2R1Y3RzID0gcmVmKFtdKTtcbmNvbnN0IGxvYWRpbmcgPSByZWYodHJ1ZSk7XG5cbmNvbnN0IGZvcm1hdFByaWNlID0gKHByaWNlKSA9PiB7XG4gIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoJ2ZyLUZSJywgeyBzdHlsZTogJ2N1cnJlbmN5JywgY3VycmVuY3k6ICdFVVInIH0pLmZvcm1hdChwcmljZSk7XG59O1xuXG5vbk1vdW50ZWQoYXN5bmMgKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MuZ2V0KCcvYXBpL3Byb2R1Y3RzJyk7XG4gICAgcHJvZHVjdHMudmFsdWUgPSByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0VycmV1ciBsb3JzIGR1IGNoYXJnZW1lbnQgZGVzIHByb2R1aXRzOicsIGVycm9yKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2U7XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBzY29wZWQ+XG4uY29udGFpbmVyIHsgbWF4LXdpZHRoOiAxMjAwcHg7IG1hcmdpbjogMCBhdXRvOyBwYWRkaW5nOiAyMHB4OyB9XG4udGl0bGUgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjOEI0NTEzOyBtYXJnaW4tYm90dG9tOiAzMHB4OyBmb250LWZhbWlseTogc2VyaWY7IH1cbi5wcm9kdWN0LWdyaWQgeyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyNTBweCwgMWZyKSk7IGdhcDogMjBweDsgfVxuLnByb2R1Y3QtY2FyZCB7IGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IGJvcmRlci1yYWRpdXM6IDhweDsgcGFkZGluZzogMTVweDsgdGV4dC1hbGlnbjogY2VudGVyOyB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yczsgYmFja2dyb3VuZDogd2hpdGU7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IH1cbi5wcm9kdWN0LWNhcmQ6aG92ZXIgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7IGJveC1zaGFkb3c6IDAgNXB4IDE1cHggcmdiYSgwLDAsMCwwLjEpOyB9XG5cbi8qIFN0eWxlcyBwb3VyIGxlIGxpZW4gKi9cbi5wcm9kdWN0LWxpbmsgeyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOiBpbmhlcml0OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogMTBweDsgfVxuLnByb2R1Y3QtbGluazpob3ZlciBoMyB7IGNvbG9yOiAjOEI0NTEzOyB9XG5cbi5wcm9kdWN0LWltYWdlIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMjAwcHg7IG9iamVjdC1maXQ6IGNvdmVyOyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1ib3R0b206IDEwcHg7IH1cbi5pbWFnZS1wbGFjZWhvbGRlciB7IGJhY2tncm91bmQ6ICNmMGYwZjA7IGhlaWdodDogMTUwcHg7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBmb250LXNpemU6IDNyZW07IGNvbG9yOiAjY2NjOyBtYXJnaW4tYm90dG9tOiAxNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IH1cblxuLmRlc2NyaXB0aW9uIHsgZm9udC1zaXplOiAwLjlyZW07IGNvbG9yOiAjNjY2OyBtaW4taGVpZ2h0OiA0MHB4OyBtYXJnaW4tYm90dG9tOiBhdXRvOyAvKiBQb3Vzc2UgbGUgcHJpeCBldCBsZSBib3V0b24gdmVycyBsZSBiYXMgKi8gfVxuLnByaWNlIHsgZm9udC1zaXplOiAxLjJyZW07IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzJjM2U1MDsgbWFyZ2luOiAxNXB4IDA7IH1cbi5idG4tY2FydCB7IGJhY2tncm91bmQtY29sb3I6ICM4QjQ1MTM7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyOiBub25lOyBwYWRkaW5nOiAxMHB4IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyOyB3aWR0aDogMTAwJTsgfVxuLmJ0bi1jYXJ0OmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI0EwNTIyRDsgfVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cInByb2R1Y3QtZGV0YWlsLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgdi1pZj1cImxvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmdcIj5DaGFyZ2VtZW50IGR1IHByb2R1aXQuLi48L2Rpdj5cblxuICAgIDxkaXYgdi1lbHNlLWlmPVwiZXJyb3JcIiBjbGFzcz1cImVycm9yXCI+XG4gICAgICB7eyBlcnJvciB9fVxuICAgICAgPGJyPlxuICAgICAgPHJvdXRlci1saW5rIHRvPVwiL1wiIGNsYXNzPVwiYmFjay1saW5rXCI+UmV0b3VyIGF1IGNhdGFsb2d1ZTwvcm91dGVyLWxpbms+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHYtZWxzZSBjbGFzcz1cInByb2R1Y3QtZGV0YWlsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2Utc2VjdGlvblwiPlxuICAgICAgICA8aW1nIHYtaWY9XCJwcm9kdWN0LmltYWdlXCIgOnNyYz1cInByb2R1Y3QuaW1hZ2VcIiA6YWx0PVwicHJvZHVjdC5uYW1lXCIgY2xhc3M9XCJwcm9kdWN0LWltYWdlXCI+XG4gICAgICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwiaW1hZ2UtcGxhY2Vob2xkZXJcIj57eyBwcm9kdWN0Lm5hbWU/LmNoYXJBdCgwKSB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLXNlY3Rpb25cIj5cbiAgICAgICAgPGgxPnt7IHByb2R1Y3QubmFtZSB9fTwvaDE+XG4gICAgICAgIDxwIGNsYXNzPVwicHJpY2VcIj57eyBmb3JtYXRQcmljZShwcm9kdWN0LnByaWNlKSB9fTwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJkZXNjcmlwdGlvblwiPnt7IHByb2R1Y3QuZGVzY3JpcHRpb24gfX08L3A+XG4gICAgICAgIFxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiYWRkVG9DYXJ0KHByb2R1Y3QpXCIgY2xhc3M9XCJidG4tYWRkXCI+QWpvdXRlciBhdSBwYW5pZXI8L2J1dHRvbj5cbiAgICAgICAgICA8cm91dGVyLWxpbmsgdG89XCIvXCIgY2xhc3M9XCJidG4tYmFja1wiPkNvbnRpbnVlciBtZXMgYWNoYXRzPC9yb3V0ZXItbGluaz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IHNldHVwPlxuaW1wb3J0IHsgcmVmLCBvbk1vdW50ZWQsIGluamVjdCB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyB1c2VSb3V0ZSB9IGZyb20gJ3Z1ZS1yb3V0ZXInO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcblxuLy8gT24gcsOpY3Vww6hyZSBsYSBmb25jdGlvbiBkJ2Fqb3V0IGF1IHBhbmllciBkZXB1aXMgbGUgc2VydmljZSBnbG9iYWxcbmNvbnN0IHsgYWRkVG9DYXJ0IH0gPSBpbmplY3QoJ2NhcnQnKTtcblxuY29uc3Qgcm91dGUgPSB1c2VSb3V0ZSgpO1xuY29uc3QgcHJvZHVjdCA9IHJlZih7fSk7XG5jb25zdCBsb2FkaW5nID0gcmVmKHRydWUpO1xuY29uc3QgZXJyb3IgPSByZWYobnVsbCk7XG5cbmNvbnN0IGZvcm1hdFByaWNlID0gKHByaWNlKSA9PiB7XG4gIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoJ2ZyLUZSJywgeyBzdHlsZTogJ2N1cnJlbmN5JywgY3VycmVuY3k6ICdFVVInIH0pLmZvcm1hdChwcmljZSk7XG59O1xuXG5vbk1vdW50ZWQoYXN5bmMgKCkgPT4ge1xuICAvLyBPbiByw6ljdXDDqHJlIGwnSUQgZGVwdWlzIGwnVVJMIChleDogL3Byb2R1Y3QvMSAtPiBpZCA9IDEpXG4gIGNvbnN0IHByb2R1Y3RJZCA9IHJvdXRlLnBhcmFtcy5pZDtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MuZ2V0KGAvYXBpL3Byb2R1Y3RzLyR7cHJvZHVjdElkfWApO1xuICAgIHByb2R1Y3QudmFsdWUgPSByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgZXJyb3IudmFsdWUgPSBcIkltcG9zc2libGUgZGUgY2hhcmdlciBsZSBwcm9kdWl0LiBJbCBuJ2V4aXN0ZSBwZXV0LcOqdHJlIHBsdXMuXCI7XG4gIH0gZmluYWxseSB7XG4gICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkPlxuLnByb2R1Y3QtZGV0YWlsLWNvbnRhaW5lciB7XG4gIG1heC13aWR0aDogMTAwMHB4O1xuICBtYXJnaW46IDAgYXV0bztcbiAgcGFkZGluZzogMjBweDtcbiAgYmFja2dyb3VuZDogd2hpdGU7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgYm94LXNoYWRvdzogMCAycHggMTBweCByZ2JhKDAsMCwwLDAuMDUpO1xufVxuXG4ucHJvZHVjdC1kZXRhaWwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDQwcHg7XG59XG5cbi5pbWFnZS1zZWN0aW9uIHtcbiAgZmxleDogMTtcbiAgbWF4LXdpZHRoOiA1MDBweDtcbn1cblxuLnByb2R1Y3QtaW1hZ2Uge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBhdXRvO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIG9iamVjdC1maXQ6IGNvdmVyO1xufVxuXG4uaW1hZ2UtcGxhY2Vob2xkZXIge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiA0MDBweDtcbiAgYmFja2dyb3VuZDogI2YwZjBmMDtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogNXJlbTtcbiAgY29sb3I6ICNjY2M7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbn1cblxuLmluZm8tc2VjdGlvbiB7XG4gIGZsZXg6IDE7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG5cbmgxIHtcbiAgY29sb3I6ICMyYzNlNTA7XG4gIG1hcmdpbi10b3A6IDA7XG59XG5cbi5wcmljZSB7XG4gIGZvbnQtc2l6ZTogMnJlbTtcbiAgY29sb3I6ICM4QjQ1MTM7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBtYXJnaW46IDEwcHggMDtcbn1cblxuLmRlc2NyaXB0aW9uIHtcbiAgZm9udC1zaXplOiAxLjFyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjY7XG4gIGNvbG9yOiAjNTU1O1xuICBtYXJnaW4tYm90dG9tOiAzMHB4O1xufVxuXG4uYWN0aW9ucyB7XG4gIG1hcmdpbi10b3A6IGF1dG87XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogMTVweDtcbn1cblxuLmJ0bi1hZGQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOEI0NTEzO1xuICBjb2xvcjogd2hpdGU7XG4gIGJvcmRlcjogbm9uZTtcbiAgcGFkZGluZzogMTVweCAzMHB4O1xuICBmb250LXNpemU6IDEuMXJlbTtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycztcbn1cblxuLmJ0bi1hZGQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjQTA1MjJEO1xufVxuXG4uYnRuLWJhY2sge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDE1cHggMjBweDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogIzY2NjtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7XG59XG5cbi5idG4tYmFjazpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG59XG5cbi5sb2FkaW5nLCAuZXJyb3Ige1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDUwcHg7XG4gIGZvbnQtc2l6ZTogMS4ycmVtO1xuICBjb2xvcjogIzY2Njtcbn1cblxuLmVycm9yIHtcbiAgY29sb3I6ICNlNzRjM2M7XG59XG5cbi8qIFJlc3BvbnNpdmUgKi9cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAucHJvZHVjdC1kZXRhaWwge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJjaGVja291dC1jb250YWluZXJcIj5cbiAgICA8aDI+RmluYWxpc2VyIG1hIGNvbW1hbmRlPC9oMj5cblxuICAgIDwhLS0gRGlzcGxheSBhIHN1Y2Nlc3MgbWVzc2FnZSBhZnRlciB0aGUgb3JkZXIgaXMgcGxhY2VkIC0tPlxuICAgIDxkaXYgdi1pZj1cIm9yZGVyUGxhY2VkXCIgY2xhc3M9XCJzdWNjZXNzLW1lc3NhZ2VcIj5cbiAgICAgIDxoMz5NZXJjaSBwb3VyIHZvdHJlIGNvbW1hbmRlICE8L2gzPlxuICAgICAgPHA+Vm90cmUgY29tbWFuZGUgbsKwe3sgb3JkZXJJZCB9fSBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLjwvcD5cbiAgICAgIDxwPlZvdXMgYWxsZXogcmVjZXZvaXIgdW4gZW1haWwgZGUgY29uZmlybWF0aW9uLjwvcD5cbiAgICAgIDxyb3V0ZXItbGluayB0bz1cIi9cIiBjbGFzcz1cImJ0bi1wcmltYXJ5XCI+UmV0b3VyIMOgIGwnYWNjdWVpbDwvcm91dGVyLWxpbms+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRoZSBjaGVja291dCBmb3JtLCBzaG93biBvbmx5IGlmIHRoZSBvcmRlciBoYXMgbm90IGJlZW4gcGxhY2VkIHlldCAtLT5cbiAgICA8Zm9ybSB2LWVsc2UgQHN1Ym1pdC5wcmV2ZW50PVwic3VibWl0T3JkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cbiAgICAgICAgPGgzPkluZm9ybWF0aW9ucyBkZSBsaXZyYWlzb248L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCI+Tm9tIGNvbXBsZXQ8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwibmFtZVwiIHYtbW9kZWw9XCJjdXN0b21lci5uYW1lXCIgcmVxdWlyZWQgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCI+RW1haWw8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBpZD1cImVtYWlsXCIgdi1tb2RlbD1cImN1c3RvbWVyLmVtYWlsXCIgcmVxdWlyZWQgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NcIj5BZHJlc3NlIGNvbXBsw6h0ZTwvbGFiZWw+XG4gICAgICAgICAgPHRleHRhcmVhIGlkPVwiYWRkcmVzc1wiIHYtbW9kZWw9XCJjdXN0b21lci5hZGRyZXNzXCIgcm93cz1cIjNcIiByZXF1aXJlZD48L3RleHRhcmVhPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1zZWN0aW9uXCI+XG4gICAgICAgIDxoMz5Sw6ljYXBpdHVsYXRpZjwvaDM+XG4gICAgICAgIDxwPlRvdGFsIGRlcyBhcnRpY2xlcyA6IHt7IGNhcnRDb3VudCB9fTwvcD5cbiAgICAgICAgPHA+TW9udGFudCB0b3RhbCA6IDxzdHJvbmc+e3sgZm9ybWF0UHJpY2UoY2FydFRvdGFsKSB9fTwvc3Ryb25nPjwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIERpc3BsYXkgc3VibWlzc2lvbiBlcnJvcnMsIGlmIGFueSAtLT5cbiAgICAgIDxkaXYgdi1pZj1cInN1Ym1pc3Npb25FcnJvclwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICB7eyBzdWJtaXNzaW9uRXJyb3IgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRoZSBzdWJtaXQgYnV0dG9uLCBkaXNhYmxlZCB3aGlsZSBwcm9jZXNzaW5nIC0tPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4tc3VibWl0XCIgOmRpc2FibGVkPVwiaXNTdWJtaXR0aW5nIHx8IGNhcnQuaXRlbXMubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIDxzcGFuIHYtaWY9XCJpc1N1Ym1pdHRpbmdcIj5FbnZvaSBlbiBjb3Vycy4uLjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gdi1lbHNlPlZhbGlkZXIgZXQgUGF5ZXI8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Zvcm0+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiwgcmVhY3RpdmUsIGluamVjdCB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuXG4vLyBJbmplY3QgdGhlIGNhcnQgc2VydmljZSBwcm92aWRlZCBieSBBcHAudnVlXG5jb25zdCB7IGNhcnQsIGNhcnRDb3VudCwgY2FydFRvdGFsLCBjbGVhckNhcnQgfSA9IGluamVjdCgnY2FydCcpO1xuXG4vLyAtLS0gQ29tcG9uZW50IFN0YXRlIC0tLVxuXG4vLyBSZWFjdGl2ZSBvYmplY3QgdG8gaG9sZCB0aGUgY3VzdG9tZXIncyBmb3JtIGRhdGFcbmNvbnN0IGN1c3RvbWVyID0gcmVhY3RpdmUoe1xuICBuYW1lOiAnJyxcbiAgZW1haWw6ICcnLFxuICBhZGRyZXNzOiAnJyxcbn0pO1xuXG4vLyBTdGF0ZSB2YXJpYWJsZXMgdG8gbWFuYWdlIHRoZSBzdWJtaXNzaW9uIHByb2Nlc3NcbmNvbnN0IGlzU3VibWl0dGluZyA9IHJlZihmYWxzZSk7XG5jb25zdCBzdWJtaXNzaW9uRXJyb3IgPSByZWYobnVsbCk7XG5jb25zdCBvcmRlclBsYWNlZCA9IHJlZihmYWxzZSk7XG5jb25zdCBvcmRlcklkID0gcmVmKG51bGwpO1xuXG4vLyAtLS0gTWV0aG9kcyAtLS1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSBmb3JtIHN1Ym1pc3Npb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN1Ym1pdE9yZGVyKCkge1xuICAvLyBSZXNldCBwcmV2aW91cyBlcnJvcnMgYW5kIHNldCBzdWJtaXR0aW5nIHN0YXRlXG4gIHN1Ym1pc3Npb25FcnJvci52YWx1ZSA9IG51bGw7XG4gIGlzU3VibWl0dGluZy52YWx1ZSA9IHRydWU7XG5cbiAgLy8gUHJlcGFyZSB0aGUgcGF5bG9hZCB0byBzZW5kIHRvIHRoZSBBUElcbiAgY29uc3Qgb3JkZXJQYXlsb2FkID0ge1xuICAgIGN1c3RvbWVyOiB7XG4gICAgICBuYW1lOiBjdXN0b21lci5uYW1lLFxuICAgICAgZW1haWw6IGN1c3RvbWVyLmVtYWlsLFxuICAgICAgYWRkcmVzczogY3VzdG9tZXIuYWRkcmVzcyxcbiAgICB9LFxuICAgIGNhcnQ6IGNhcnQuaXRlbXMsIC8vIFNlbmQgdGhlIGN1cnJlbnQgY2FydCBpdGVtc1xuICB9O1xuXG4gIHRyeSB7XG4gICAgLy8gU2VuZCB0aGUgUE9TVCByZXF1ZXN0IHRvIHRoZSBTeW1mb255IEFQSVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdCgnL2FwaS9vcmRlcnMnLCBvcmRlclBheWxvYWQpO1xuXG4gICAgLy8gSWYgdGhlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCAoSFRUUCAyMDEgQ3JlYXRlZClcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDEpIHtcbiAgICAgIG9yZGVyUGxhY2VkLnZhbHVlID0gdHJ1ZTtcbiAgICAgIG9yZGVySWQudmFsdWUgPSByZXNwb25zZS5kYXRhLm9yZGVySWQ7XG4gICAgICBjbGVhckNhcnQoKTsgLy8gRW1wdHkgdGhlIGNhcnQgbm93IHRoYXQgdGhlIG9yZGVyIGlzIHBsYWNlZFxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBIYW5kbGUgQVBJIGVycm9yc1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgb3JkZXI6JywgZXJyb3IpO1xuICAgIGlmIChlcnJvci5yZXNwb25zZSAmJiBlcnJvci5yZXNwb25zZS5kYXRhICYmIGVycm9yLnJlc3BvbnNlLmRhdGEuZXJyb3IpIHtcbiAgICAgIHN1Ym1pc3Npb25FcnJvci52YWx1ZSA9IGBFcnJldXIgZHUgc2VydmV1ciA6ICR7ZXJyb3IucmVzcG9uc2UuZGF0YS5lcnJvcn1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdWJtaXNzaW9uRXJyb3IudmFsdWUgPSAnVW5lIGVycmV1ciBpbmF0dGVuZHVlIGVzdCBzdXJ2ZW51ZS4gVmV1aWxsZXogcsOpZXNzYXllci4nO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBSZXNldCB0aGUgc3VibWl0dGluZyBzdGF0ZSByZWdhcmRsZXNzIG9mIG91dGNvbWVcbiAgICBpc1N1Ym1pdHRpbmcudmFsdWUgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBmb3JtYXQgcHJpY2VzLlxuICovXG5jb25zdCBmb3JtYXRQcmljZSA9IChwcmljZSkgPT4ge1xuICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCdmci1GUicsIHsgc3R5bGU6ICdjdXJyZW5jeScsIGN1cnJlbmN5OiAnRVVSJyB9KS5mb3JtYXQocHJpY2UpO1xufTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkPlxuLmNoZWNrb3V0LWNvbnRhaW5lciB7XG4gIG1heC13aWR0aDogODAwcHg7XG4gIG1hcmdpbjogMnJlbSBhdXRvO1xuICBwYWRkaW5nOiAycmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjA4KTtcbn1cblxuaDIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiAjMmMzZTUwO1xuICBtYXJnaW4tYm90dG9tOiAycmVtO1xufVxuXG4uZm9ybS1zZWN0aW9uLCAuc3VtbWFyeS1zZWN0aW9uIHtcbiAgbWFyZ2luLWJvdHRvbTogMnJlbTtcbn1cblxuLmZvcm0tZ3JvdXAge1xuICBtYXJnaW4tYm90dG9tOiAxLjVyZW07XG59XG5cbmxhYmVsIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6ICMzNDQ5NWU7XG59XG5cbmlucHV0W3R5cGU9XCJ0ZXh0XCJdLFxuaW5wdXRbdHlwZT1cImVtYWlsXCJdLFxudGV4dGFyZWEge1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMC44cmVtO1xuICBib3JkZXI6IDFweCBzb2xpZCAjYmRjM2M3O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLyogSW1wb3J0YW50IGZvciBwYWRkaW5nIGFuZCB3aWR0aCAqL1xufVxuXG50ZXh0YXJlYSB7XG4gIHJlc2l6ZTogdmVydGljYWw7XG59XG5cbi5idG4tc3VibWl0IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiAxcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOEI0NTEzO1xuICBjb2xvcjogd2hpdGU7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICBmb250LXNpemU6IDEuMnJlbTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjJzO1xufVxuXG4uYnRuLXN1Ym1pdDpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNBMDUyMkQ7XG59XG5cbi5idG4tc3VibWl0OmRpc2FibGVkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYztcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLmVycm9yLW1lc3NhZ2Uge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhkN2RhO1xuICBjb2xvcjogIzcyMWMyNDtcbiAgcGFkZGluZzogMXJlbTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5zdWNjZXNzLW1lc3NhZ2Uge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDJyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNkNGVkZGE7XG4gIGNvbG9yOiAjMTU1NzI0O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG59XG5cbi5idG4tcHJpbWFyeSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLXRvcDogMXJlbTtcbiAgcGFkZGluZzogMC44cmVtIDEuNXJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzI4YTc0NTtcbiAgY29sb3I6IHdoaXRlO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjwvc3R5bGU+XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=*/