ng-easycommerce-v18 0.6.34 → 0.6.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +14 -0
  2. package/assets/ec-i18n/es.json +1 -0
  3. package/esm2022/lib/ec-components/account-ec/orders-list-ec/orders-list-ec.component.mjs +3 -3
  4. package/esm2022/lib/ec-components/cart-ec/cart-ec.component.mjs +2 -1
  5. package/esm2022/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.mjs +13 -1
  6. package/esm2022/lib/ec-components/header-ec/header-ec.component.mjs +67 -44
  7. package/esm2022/lib/ec-components/sidebar-ec/sidebar-ec.component.mjs +2 -1
  8. package/esm2022/lib/ec-components/user-portal-ec/user-addresses-ec/user-addresses-ec.component.mjs +13 -5
  9. package/esm2022/lib/ec-components/user-portal-ec/user-documents-ec/user-documents-ec.component.mjs +3 -3
  10. package/esm2022/lib/ec-components/user-portal-ec/user-portal-ec.component.mjs +3 -3
  11. package/esm2022/lib/ec-components/user-portal-ec/user-profile-ec/user-profile-ec.component.mjs +5 -3
  12. package/esm2022/lib/ec-components/user-portal-ec/user-security-ec/user-security-ec.component.mjs +3 -3
  13. package/esm2022/lib/ec-services/analytics/facebook-pixel.service.mjs +90 -19
  14. package/esm2022/lib/ec-services/cart.service.mjs +111 -12
  15. package/esm2022/lib/ec-services/parameters.service.mjs +5 -1
  16. package/esm2022/lib/ec-services/profile.service.mjs +15 -1
  17. package/esm2022/lib/interfaces/product.mjs +1 -1
  18. package/fesm2022/ng-easycommerce-v18.mjs +317 -86
  19. package/fesm2022/ng-easycommerce-v18.mjs.map +1 -1
  20. package/lib/ec-components/cart-ec/cart-ec.component.d.ts +1 -0
  21. package/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.d.ts +4 -0
  22. package/lib/ec-components/checkout-ec/dataform-ec/dataform-ec.component.d.ts +1 -1
  23. package/lib/ec-components/header-ec/header-ec.component.d.ts +9 -8
  24. package/lib/ec-components/sidebar-ec/sidebar-ec.component.d.ts +1 -0
  25. package/lib/ec-components/user-portal-ec/user-addresses-ec/user-addresses-ec.component.d.ts +1 -0
  26. package/lib/ec-services/analytics/facebook-pixel.service.d.ts +8 -3
  27. package/lib/ec-services/cart.service.d.ts +9 -2
  28. package/lib/ec-services/parameters.service.d.ts +1 -0
  29. package/lib/ec-services/profile.service.d.ts +4 -0
  30. package/lib/interfaces/product.d.ts +17 -0
  31. package/package.json +1 -1
package/README.md CHANGED
@@ -1,3 +1,17 @@
1
+ # Version 0.6.36
2
+ - `app-user-portal-ec`: se incorporan clases semánticas reutilizables para botones y spinners, evitando depender de las clases de color de Bootstrap.
3
+ - `app-user-security-ec`, `app-user-profile-ec`, `app-user-addresses-ec` y `app-user-documents-ec`: se reemplazan colores hardcodeados por variables CSS `--ec-*` con fallbacks neutros o funcionales.
4
+ - Se agrega soporte y documentación del tema visual del portal mediante variables como `--ec-primary`, `--ec-text`, `--ec-border`, `--ec-danger` y estados relacionados.
5
+ - Las acciones principales, secundarias, estados deshabilitados y feedback conservan compatibilidad con frontends que no declaran variables específicas.
6
+ - Se corrigen errores de la parte de mi cuenta cuando un cliente tenia vendedores.
7
+ # Version 0.6.35
8
+ - Carrito / autenticación: se preserva el owner de la operación iniciada como invitado hasta completar la respuesta, evitando que una respuesta asíncrona cambie el carrito a la sesión autenticada antes del login.
9
+ - Carrito / autenticación: al iniciar sesión con un carrito anónimo con ítems se envía su token para asociarlo al usuario; si está vacío, se recupera el último carrito del usuario sin enviar token.
10
+ - Analytics: se protege la inicialización automática desde `/parameters` para evitar ejecuciones repetidas.
11
+ - Facebook Pixel: las llamadas `fbq('init')`, `fbq('track')` y `fbq('trackCustom')` se ejecutan fuera de Angular Zone cuando `NgZone` está disponible.
12
+ - Facebook Pixel: se agregan guards para Pixel IDs inválidos, cargas concurrentes, disponibilidad de `fbq`, cambios de Pixel ID y envío duplicado de `PageView`.
13
+ - SSR: la inicialización de Facebook Pixel queda limitada al navegador y conserva un fallback seguro cuando `NgZone` no está disponible.
14
+
1
15
  # Version 0.6.34
2
16
  - Carrito: se corrige la rehidratación del carrito anónimo al recargar la página, leyendo los items desde el mismo storage donde se persisten y esperando su carga antes de inicializar la sesión.
3
17
  - Tests: se agrega cobertura para preservar un carrito anónimo con items después de una recarga.
@@ -610,6 +610,7 @@
610
610
  "user-portal.addresses.success-added": "Dirección añadida correctamente.",
611
611
  "user-portal.addresses.error-required": "Calle y ciudad son obligatorios.",
612
612
  "user-portal.addresses.error-save": "No se pudo guardar la dirección.",
613
+ "user-portal.addresses.success-default": "Dirección predeterminada actualizada correctamente.",
613
614
  "user-portal.documents.empty": "No tienes documentos subidos.",
614
615
  "user-portal.documents.upload-title": "Subir documento",
615
616
  "user-portal.documents.file": "Archivo",
@@ -356,10 +356,10 @@ export class OrdersListEcComponent {
356
356
  this._router.navigateByUrl((`account/orders/${order.number}`));
357
357
  }
358
358
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OrdersListEcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
359
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: OrdersListEcComponent, isStandalone: true, selector: "app-orders-ec", ngImport: i0, template: "<div class=\"container-fluid\" id=\"ordersEcComponent\">\n @if(!loading){\n <section id=\"orders\" class=\"w-100\">\n @if(!priceVisibility.hidePrices()){\n @if(allOrders && allOrders.length){\n <div class=\"d-lg-none mb-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm w-100 filters-toggle-btn\" (click)=\"toggleMobileFilters()\">\n Filtros {{ showMobileFilters ? '\u25B2' : '\u25BC' }}\n </button>\n </div>\n <div class=\"row filters-row gy-3 mb-3\" [class.mobile-hidden]=\"!showMobileFilters\">\n @if(hasOrderStateColumn){\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'order-state' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.orderState\" (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.orderState; track $index){\n <option [value]=\"value\">{{ value | translate | titlecase }}</option>\n }\n </select>\n </div>\n }\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'payment-state' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.paymentState\" (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.paymentState; track $index){\n <option [value]=\"value\">{{ value | translate | titlecase }}</option>\n }\n </select>\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'shipment-state' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.shipmentState\" (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.shipmentState; track $index){\n <option [value]=\"value\">{{ value | translate | titlecase }}</option>\n }\n </select>\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'shipment-method' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.shipmentMethod\" (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.shipmentMethod; track $index){\n <option [value]=\"value\">{{ value }}</option>\n }\n </select>\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'date' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.dateMode\" (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(option of dateModeOptions; track $index){\n <option [value]=\"option.value\">{{ option.labelKey | translate }}</option>\n }\n </select>\n @if(selectedFilters.dateMode === 'between'){\n <div class=\"d-flex gap-1 mt-1 filter-range-row\">\n <input type=\"date\" class=\"form-control form-control-sm\" [(ngModel)]=\"selectedFilters.dateFrom\" (change)=\"onFilterChange()\">\n <input type=\"date\" class=\"form-control form-control-sm\" [(ngModel)]=\"selectedFilters.dateTo\" (change)=\"onFilterChange()\">\n </div>\n } @else if(selectedFilters.dateMode){\n <input type=\"date\" class=\"form-control form-control-sm mt-1\" [(ngModel)]=\"selectedFilters.dateValue\" (change)=\"onFilterChange()\">\n }\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'total' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.totalMode\" (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(option of totalModeOptions; track $index){\n <option [value]=\"option.value\">{{ option.labelKey | translate }}</option>\n }\n </select>\n @if(selectedFilters.totalMode === 'between'){\n <div class=\"d-flex gap-1 mt-1 filter-range-row\">\n <input type=\"number\" class=\"form-control form-control-sm\" placeholder=\"Min\" [(ngModel)]=\"selectedFilters.totalMin\" (input)=\"onFilterChange()\">\n <input type=\"number\" class=\"form-control form-control-sm\" placeholder=\"Max\" [(ngModel)]=\"selectedFilters.totalMax\" (input)=\"onFilterChange()\">\n </div>\n } @else if(selectedFilters.totalMode){\n <input type=\"number\" class=\"form-control form-control-sm mt-1\" placeholder=\"Valor\" [(ngModel)]=\"selectedFilters.totalValue\" (input)=\"onFilterChange()\">\n }\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 d-flex align-items-end filter-col\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm w-100\" (click)=\"clearFilters()\">\n {{ 'clear-filters' | translate }}\n </button>\n </div>\n </div>\n @if(orders && orders.length){\n <div class=\"row mb-1 border-bottom d-none d-lg-flex\">\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('number')\"\n [class.is-asc]=\"getSortDirection('number') === 'asc'\"\n [class.is-desc]=\"getSortDirection('number') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('number')\"\n (click)=\"sortOrders('number')\">\n {{ 'order' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('date')\"\n [class.is-asc]=\"getSortDirection('date') === 'asc'\"\n [class.is-desc]=\"getSortDirection('date') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('date')\"\n (click)=\"sortOrders('date')\">\n {{ 'date' | translate }}:\n </button>\n </div>\n @if(hasOrderStateColumn){\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('orderState')\"\n [class.is-asc]=\"getSortDirection('orderState') === 'asc'\"\n [class.is-desc]=\"getSortDirection('orderState') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('orderState')\"\n (click)=\"sortOrders('orderState')\">\n {{ 'order-state' | translate }}:\n </button>\n </div>\n }\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('paymentState')\"\n [class.is-asc]=\"getSortDirection('paymentState') === 'asc'\"\n [class.is-desc]=\"getSortDirection('paymentState') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('paymentState')\"\n (click)=\"sortOrders('paymentState')\">\n {{ 'payment-state' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('methodState')\"\n [class.is-asc]=\"getSortDirection('methodState') === 'asc'\"\n [class.is-desc]=\"getSortDirection('methodState') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('methodState')\"\n (click)=\"sortOrders('methodState')\">\n {{ 'shipment-state' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('method')\"\n [class.is-asc]=\"getSortDirection('method') === 'asc'\"\n [class.is-desc]=\"getSortDirection('method') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('method')\"\n (click)=\"sortOrders('method')\">\n {{ 'shipment-method' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('total')\"\n [class.is-asc]=\"getSortDirection('total') === 'asc'\"\n [class.is-desc]=\"getSortDirection('total') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('total')\"\n (click)=\"sortOrders('total')\">\n {{ 'total' | translate }}:\n </button>\n </div>\n </div>\n @for(order of orders; track $index){\n <div class=\"row item border-bottom py-2 d-none d-lg-flex\">\n <div [class]=\"getColumnClass()\">\n <p class=\"fw-bold order-number\">\n {{ order.number }}\n </p>\n </div>\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }}<br>\n {{ toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </p>\n </div>\n @if(hasOrderStateColumn){\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ order.orderState ? (order.orderState | translate | titlecase) : '-' }}\n </p>\n </div>\n }\n <div [class]=\"getColumnClass()\">\n @if(order.payments && order.payments.length > 0){\n <p class=\"price\">\n {{ order.payments[0].state | translate | titlecase }}\n </p>\n }\n </div>\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ order.shipments[0].state | translate | titlecase }}\n </p>\n @if(order.tracking){\n <a [href]=\"order.tracking\"\n class=\"btn btn-outline-dark btnLogout px-3 py-1 font-size-10 w-auto btn-sm\">Ver seguimiento</a>\n }\n </div>\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ order.shipments[0].method.name }}\n </p>\n </div>\n <div [class]=\"getColumnClass() + ' d-flex align-items-center order-total-actions'\">\n @if(priceVisibility.canShowPrices()){\n <p class=\"fw-bold text-nowrap order-total\">\n {{ (order.totals.total) | ecCurrencySymbol }}\n </p>\n }\n <button class=\"btn px-0 btdetalle order-detail-btn\" (click)=\"goToOrder(order)\" [attr.aria-label]=\"'Ver detalle del pedido ' + order.number\">\n <i class=\"bi bi-eye\" aria-hidden=\"true\"></i></button>\n </div>\n </div>\n\n <div class=\"order-mobile-card d-lg-none\">\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'order' | translate }}</span>\n <span class=\"order-mobile-value fw-bold\">{{ order.number }}</span>\n </div>\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'date' | translate }}</span>\n <span class=\"order-mobile-value\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }} {{ toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </span>\n </div>\n @if(hasOrderStateColumn){\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'order-state' | translate }}</span>\n <span class=\"order-mobile-value\">\n {{ order.orderState ? (order.orderState | translate | titlecase) : '-' }}\n </span>\n </div>\n }\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'payment-state' | translate }}</span>\n <span class=\"order-mobile-value\">\n {{ order.payments && order.payments.length > 0 ? (order.payments[0].state | translate | titlecase) : '-' }}\n </span>\n </div>\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'shipment-state' | translate }}</span>\n <span class=\"order-mobile-value\">{{ order.shipments[0].state | translate | titlecase }}</span>\n </div>\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'shipment-method' | translate }}</span>\n <span class=\"order-mobile-value\">{{ order.shipments[0].method.name }}</span>\n </div>\n <div class=\"order-mobile-actions\">\n @if(priceVisibility.canShowPrices()){\n <p class=\"fw-bold text-nowrap order-total mb-0\">\n {{ (order.totals.total) | ecCurrencySymbol }}\n </p>\n }\n <button class=\"btn px-0 btdetalle order-detail-btn\" (click)=\"goToOrder(order)\" [attr.aria-label]=\"'Ver detalle del pedido ' + order.number\">\n <i class=\"bi bi-eye\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n }@else {\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n }\n }@else {\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n }\n }\n </section>\n }@else {\n <div class=\"w-100 h-50 py-5\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n }\n</div>\n\n<ng-template #errorView>\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h4>{{ 'orders-error' | translate }}</h4>\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.sort-trigger{appearance:none;background:transparent;border:0;color:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:.45rem;padding:0;font-weight:500}.filters-row{--ec-filter-bg: var(--ec-orders-filter-bg, #f8f9fb);--ec-filter-border: var(--ec-orders-filter-border, #d9dee7);background:var(--ec-filter-bg);border:1px solid var(--ec-filter-border);border-radius:.5rem;padding:.9rem}.filters-row .form-select{min-height:2rem}.filters-row .form-control,.filters-row .form-select{background:#fff}.filter-col{min-width:0}.filter-range-row{flex-wrap:nowrap}.filter-range-row .form-control{min-width:0}.filter-label{display:block;font-size:.8rem;font-weight:600;margin-bottom:.25rem}.sort-trigger:after{content:\"\\25b5\\25bf\";font-size:.95rem;font-weight:700;line-height:1;opacity:.75;color:currentColor;letter-spacing:-.08em}.sort-trigger.applied{font-weight:700}.sort-trigger.applied:after{opacity:1}.sort-trigger.is-asc:after{content:\"\\25b2\"}.sort-trigger.is-desc:after{content:\"\\25bc\"}.order-total-actions{justify-content:space-between}.order-total{margin-bottom:0}.order-detail-btn{margin-left:auto;width:2rem;min-width:2rem;display:inline-flex;justify-content:center;align-items:center;color:var(--ec-orders-detail-icon-color, var(--ec-primary, currentColor))}@media (max-width: 991.98px){.filters-toggle-btn{font-weight:600}.filters-row{margin-bottom:.75rem!important;padding:.75rem}.filters-row.mobile-hidden{display:none}.filter-range-row{flex-wrap:wrap}.order-mobile-card{border:1px solid #e7e7e7;border-radius:.5rem;padding:.75rem;margin-bottom:.75rem;background:#fff}.order-mobile-row{display:flex;justify-content:space-between;align-items:flex-start;gap:.75rem;padding:.3rem 0;border-bottom:1px dashed #efefef}.order-mobile-row:last-of-type{border-bottom:0}.order-mobile-label{font-size:.8rem;font-weight:600;color:#6c757d;white-space:nowrap}.order-mobile-value{font-size:.9rem;text-align:right;word-break:break-word}.order-mobile-actions{margin-top:.5rem;display:flex;justify-content:space-between;align-items:center}.sort-trigger:after{font-size:1rem}}\n"], dependencies: [{ kind: "component", type: LoadingFullEcComponent, selector: "app-loading-full-ec" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: EcCurrencySymbolPipe, name: "ecCurrencySymbol" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
359
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: OrdersListEcComponent, isStandalone: true, selector: "app-orders-ec", ngImport: i0, template: "<div class=\"container-fluid\" id=\"ordersEcComponent\">\n @if(!loading){\n <section id=\"orders\" class=\"w-100\">\n @if(!priceVisibility.hidePrices()){\n @if(allOrders && allOrders.length){\n <div class=\"d-lg-none mb-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm w-100 filters-toggle-btn\"\n (click)=\"toggleMobileFilters()\">\n Filtros {{ showMobileFilters ? '\u25B2' : '\u25BC' }}\n </button>\n </div>\n <div class=\"row filters-row gy-3 mb-3\" [class.mobile-hidden]=\"!showMobileFilters\">\n @if(hasOrderStateColumn){\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'order-state' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.orderState\"\n (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.orderState; track $index){\n <option [value]=\"value\">{{ value | translate | titlecase }}</option>\n }\n </select>\n </div>\n }\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'payment-state' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.paymentState\"\n (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.paymentState; track $index){\n <option [value]=\"value\">{{ value | translate | titlecase }}</option>\n }\n </select>\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'shipment-state' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.shipmentState\"\n (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.shipmentState; track $index){\n <option [value]=\"value\">{{ value | translate | titlecase }}</option>\n }\n </select>\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'shipment-method' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.shipmentMethod\"\n (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.shipmentMethod; track $index){\n <option [value]=\"value\">{{ value }}</option>\n }\n </select>\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'date' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.dateMode\"\n (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(option of dateModeOptions; track $index){\n <option [value]=\"option.value\">{{ option.labelKey | translate }}</option>\n }\n </select>\n @if(selectedFilters.dateMode === 'between'){\n <div class=\"d-flex flex-column gap-1 mt-1 filter-range-row\">\n <input type=\"date\" class=\"form-control form-control-sm\" [(ngModel)]=\"selectedFilters.dateFrom\"\n (change)=\"onFilterChange()\">\n <input type=\"date\" class=\"form-control form-control-sm\" [(ngModel)]=\"selectedFilters.dateTo\"\n (change)=\"onFilterChange()\">\n </div>\n\n } @else if(selectedFilters.dateMode){\n <input type=\"date\" class=\"form-control form-control-sm mt-1\" [(ngModel)]=\"selectedFilters.dateValue\"\n (change)=\"onFilterChange()\">\n }\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'total' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.totalMode\"\n (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(option of totalModeOptions; track $index){\n <option [value]=\"option.value\">{{ option.labelKey | translate }}</option>\n }\n </select>\n @if(selectedFilters.totalMode === 'between'){\n <div class=\"d-flex gap-1 mt-1 filter-range-row\">\n <input type=\"number\" class=\"form-control form-control-sm\" placeholder=\"Min\"\n [(ngModel)]=\"selectedFilters.totalMin\" (input)=\"onFilterChange()\">\n <input type=\"number\" class=\"form-control form-control-sm\" placeholder=\"Max\"\n [(ngModel)]=\"selectedFilters.totalMax\" (input)=\"onFilterChange()\">\n </div>\n } @else if(selectedFilters.totalMode){\n <input type=\"number\" class=\"form-control form-control-sm mt-1\" placeholder=\"Valor\"\n [(ngModel)]=\"selectedFilters.totalValue\" (input)=\"onFilterChange()\">\n }\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 d-flex align-items-end filter-col\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm w-100\" (click)=\"clearFilters()\">\n {{ 'clear-filters' | translate }}\n </button>\n </div>\n </div>\n @if(orders && orders.length){\n <div class=\"row mb-1 border-bottom d-none d-lg-flex\">\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('number')\"\n [class.is-asc]=\"getSortDirection('number') === 'asc'\"\n [class.is-desc]=\"getSortDirection('number') === 'desc'\" [attr.aria-sort]=\"getAriaSort('number')\"\n (click)=\"sortOrders('number')\">\n {{ 'order' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('date')\"\n [class.is-asc]=\"getSortDirection('date') === 'asc'\"\n [class.is-desc]=\"getSortDirection('date') === 'desc'\" [attr.aria-sort]=\"getAriaSort('date')\"\n (click)=\"sortOrders('date')\">\n {{ 'date' | translate }}:\n </button>\n </div>\n @if(hasOrderStateColumn){\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('orderState')\"\n [class.is-asc]=\"getSortDirection('orderState') === 'asc'\"\n [class.is-desc]=\"getSortDirection('orderState') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('orderState')\" (click)=\"sortOrders('orderState')\">\n {{ 'order-state' | translate }}:\n </button>\n </div>\n }\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('paymentState')\"\n [class.is-asc]=\"getSortDirection('paymentState') === 'asc'\"\n [class.is-desc]=\"getSortDirection('paymentState') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('paymentState')\" (click)=\"sortOrders('paymentState')\">\n {{ 'payment-state' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('methodState')\"\n [class.is-asc]=\"getSortDirection('methodState') === 'asc'\"\n [class.is-desc]=\"getSortDirection('methodState') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('methodState')\" (click)=\"sortOrders('methodState')\">\n {{ 'shipment-state' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('method')\"\n [class.is-asc]=\"getSortDirection('method') === 'asc'\"\n [class.is-desc]=\"getSortDirection('method') === 'desc'\" [attr.aria-sort]=\"getAriaSort('method')\"\n (click)=\"sortOrders('method')\">\n {{ 'shipment-method' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('total')\"\n [class.is-asc]=\"getSortDirection('total') === 'asc'\"\n [class.is-desc]=\"getSortDirection('total') === 'desc'\" [attr.aria-sort]=\"getAriaSort('total')\"\n (click)=\"sortOrders('total')\">\n {{ 'total' | translate }}:\n </button>\n </div>\n </div>\n @for(order of orders; track $index){\n <div class=\"row item border-bottom py-2 d-none d-lg-flex\">\n <div [class]=\"getColumnClass()\">\n <p class=\"fw-bold order-number\">\n {{ order.number }}\n </p>\n </div>\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }}<br>\n {{ toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </p>\n </div>\n @if(hasOrderStateColumn){\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ order.orderState ? (order.orderState | translate | titlecase) : '-' }}\n </p>\n </div>\n }\n <div [class]=\"getColumnClass()\">\n @if(order.payments && order.payments.length > 0){\n <p class=\"price\">\n {{ order.payments[0].state | translate | titlecase }}\n </p>\n }\n </div>\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ order.shipments[0].state | translate | titlecase }}\n </p>\n @if(order.tracking){\n <a [href]=\"order.tracking\"\n class=\"btn btn-outline-dark btnLogout px-3 py-1 font-size-10 w-auto btn-sm\">Ver seguimiento</a>\n }\n </div>\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ order.shipments[0].method.name }}\n </p>\n </div>\n <div [class]=\"getColumnClass() + ' d-flex align-items-center order-total-actions'\">\n @if(priceVisibility.canShowPrices()){\n <p class=\"fw-bold text-nowrap order-total\">\n {{ (order.totals.total) | ecCurrencySymbol }}\n </p>\n }\n <button class=\"btn px-0 btdetalle order-detail-btn\" (click)=\"goToOrder(order)\"\n [attr.aria-label]=\"'Ver detalle del pedido ' + order.number\">\n <i class=\"bi bi-eye\" aria-hidden=\"true\"></i></button>\n </div>\n </div>\n\n <div class=\"order-mobile-card d-lg-none\">\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'order' | translate }}</span>\n <span class=\"order-mobile-value fw-bold\">{{ order.number }}</span>\n </div>\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'date' | translate }}</span>\n <span class=\"order-mobile-value\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }} {{\n toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </span>\n </div>\n @if(hasOrderStateColumn){\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'order-state' | translate }}</span>\n <span class=\"order-mobile-value\">\n {{ order.orderState ? (order.orderState | translate | titlecase) : '-' }}\n </span>\n </div>\n }\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'payment-state' | translate }}</span>\n <span class=\"order-mobile-value\">\n {{ order.payments && order.payments.length > 0 ? (order.payments[0].state | translate | titlecase) :\n '-' }}\n </span>\n </div>\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'shipment-state' | translate }}</span>\n <span class=\"order-mobile-value\">{{ order.shipments[0].state | translate | titlecase }}</span>\n </div>\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'shipment-method' | translate }}</span>\n <span class=\"order-mobile-value\">{{ order.shipments[0].method.name }}</span>\n </div>\n <div class=\"order-mobile-actions\">\n @if(priceVisibility.canShowPrices()){\n <p class=\"fw-bold text-nowrap order-total mb-0\">\n {{ (order.totals.total) | ecCurrencySymbol }}\n </p>\n }\n <button class=\"btn px-0 btdetalle order-detail-btn\" (click)=\"goToOrder(order)\"\n [attr.aria-label]=\"'Ver detalle del pedido ' + order.number\">\n <i class=\"bi bi-eye\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n }@else {\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n }\n }@else {\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n }\n }\n </section>\n }@else {\n <div class=\"w-100 h-50 py-5\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n }\n</div>\n\n<ng-template #errorView>\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h4>{{ 'orders-error' | translate }}</h4>\n </div>\n </div>\n</ng-template>", styles: ["@charset \"UTF-8\";.sort-trigger{appearance:none;background:transparent;border:0;color:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:.45rem;padding:0;font-weight:500}.filters-row{--ec-filter-bg: var(--ec-orders-filter-bg, #f8f9fb);--ec-filter-border: var(--ec-orders-filter-border, #d9dee7);background:var(--ec-filter-bg);border:1px solid var(--ec-filter-border);border-radius:.5rem;padding:.9rem}.filters-row .form-select{min-height:2rem}.filters-row .form-control,.filters-row .form-select{background:#fff}.filter-col{min-width:0}.filter-range-row{flex-wrap:nowrap}.filter-range-row .form-control{min-width:0}.filter-label{display:block;font-size:.8rem;font-weight:600;margin-bottom:.25rem}.sort-trigger:after{content:\"\\25b5\\25bf\";font-size:.95rem;font-weight:700;line-height:1;opacity:.75;color:currentColor;letter-spacing:-.08em}.sort-trigger.applied{font-weight:700}.sort-trigger.applied:after{opacity:1}.sort-trigger.is-asc:after{content:\"\\25b2\"}.sort-trigger.is-desc:after{content:\"\\25bc\"}.order-total-actions{justify-content:space-between}.order-total{margin-bottom:0}.order-detail-btn{margin-left:auto;width:2rem;min-width:2rem;display:inline-flex;justify-content:center;align-items:center;color:var(--ec-orders-detail-icon-color, var(--ec-primary, currentColor))}@media (max-width: 991.98px){.filters-toggle-btn{font-weight:600}.filters-row{margin-bottom:.75rem!important;padding:.75rem}.filters-row.mobile-hidden{display:none}.filter-range-row{flex-wrap:wrap}.order-mobile-card{border:1px solid #e7e7e7;border-radius:.5rem;padding:.75rem;margin-bottom:.75rem;background:#fff}.order-mobile-row{display:flex;justify-content:space-between;align-items:flex-start;gap:.75rem;padding:.3rem 0;border-bottom:1px dashed #efefef}.order-mobile-row:last-of-type{border-bottom:0}.order-mobile-label{font-size:.8rem;font-weight:600;color:#6c757d;white-space:nowrap}.order-mobile-value{font-size:.9rem;text-align:right;word-break:break-word}.order-mobile-actions{margin-top:.5rem;display:flex;justify-content:space-between;align-items:center}.sort-trigger:after{font-size:1rem}}\n"], dependencies: [{ kind: "component", type: LoadingFullEcComponent, selector: "app-loading-full-ec" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: EcCurrencySymbolPipe, name: "ecCurrencySymbol" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
360
360
  }
361
361
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OrdersListEcComponent, decorators: [{
362
362
  type: Component,
363
- args: [{ selector: 'app-orders-ec', standalone: true, imports: [LoadingFullEcComponent, TranslateModule, TitleCasePipe, EcCurrencySymbolPipe, FormsModule], template: "<div class=\"container-fluid\" id=\"ordersEcComponent\">\n @if(!loading){\n <section id=\"orders\" class=\"w-100\">\n @if(!priceVisibility.hidePrices()){\n @if(allOrders && allOrders.length){\n <div class=\"d-lg-none mb-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm w-100 filters-toggle-btn\" (click)=\"toggleMobileFilters()\">\n Filtros {{ showMobileFilters ? '\u25B2' : '\u25BC' }}\n </button>\n </div>\n <div class=\"row filters-row gy-3 mb-3\" [class.mobile-hidden]=\"!showMobileFilters\">\n @if(hasOrderStateColumn){\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'order-state' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.orderState\" (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.orderState; track $index){\n <option [value]=\"value\">{{ value | translate | titlecase }}</option>\n }\n </select>\n </div>\n }\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'payment-state' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.paymentState\" (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.paymentState; track $index){\n <option [value]=\"value\">{{ value | translate | titlecase }}</option>\n }\n </select>\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'shipment-state' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.shipmentState\" (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.shipmentState; track $index){\n <option [value]=\"value\">{{ value | translate | titlecase }}</option>\n }\n </select>\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'shipment-method' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.shipmentMethod\" (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.shipmentMethod; track $index){\n <option [value]=\"value\">{{ value }}</option>\n }\n </select>\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'date' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.dateMode\" (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(option of dateModeOptions; track $index){\n <option [value]=\"option.value\">{{ option.labelKey | translate }}</option>\n }\n </select>\n @if(selectedFilters.dateMode === 'between'){\n <div class=\"d-flex gap-1 mt-1 filter-range-row\">\n <input type=\"date\" class=\"form-control form-control-sm\" [(ngModel)]=\"selectedFilters.dateFrom\" (change)=\"onFilterChange()\">\n <input type=\"date\" class=\"form-control form-control-sm\" [(ngModel)]=\"selectedFilters.dateTo\" (change)=\"onFilterChange()\">\n </div>\n } @else if(selectedFilters.dateMode){\n <input type=\"date\" class=\"form-control form-control-sm mt-1\" [(ngModel)]=\"selectedFilters.dateValue\" (change)=\"onFilterChange()\">\n }\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'total' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.totalMode\" (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(option of totalModeOptions; track $index){\n <option [value]=\"option.value\">{{ option.labelKey | translate }}</option>\n }\n </select>\n @if(selectedFilters.totalMode === 'between'){\n <div class=\"d-flex gap-1 mt-1 filter-range-row\">\n <input type=\"number\" class=\"form-control form-control-sm\" placeholder=\"Min\" [(ngModel)]=\"selectedFilters.totalMin\" (input)=\"onFilterChange()\">\n <input type=\"number\" class=\"form-control form-control-sm\" placeholder=\"Max\" [(ngModel)]=\"selectedFilters.totalMax\" (input)=\"onFilterChange()\">\n </div>\n } @else if(selectedFilters.totalMode){\n <input type=\"number\" class=\"form-control form-control-sm mt-1\" placeholder=\"Valor\" [(ngModel)]=\"selectedFilters.totalValue\" (input)=\"onFilterChange()\">\n }\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 d-flex align-items-end filter-col\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm w-100\" (click)=\"clearFilters()\">\n {{ 'clear-filters' | translate }}\n </button>\n </div>\n </div>\n @if(orders && orders.length){\n <div class=\"row mb-1 border-bottom d-none d-lg-flex\">\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('number')\"\n [class.is-asc]=\"getSortDirection('number') === 'asc'\"\n [class.is-desc]=\"getSortDirection('number') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('number')\"\n (click)=\"sortOrders('number')\">\n {{ 'order' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('date')\"\n [class.is-asc]=\"getSortDirection('date') === 'asc'\"\n [class.is-desc]=\"getSortDirection('date') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('date')\"\n (click)=\"sortOrders('date')\">\n {{ 'date' | translate }}:\n </button>\n </div>\n @if(hasOrderStateColumn){\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('orderState')\"\n [class.is-asc]=\"getSortDirection('orderState') === 'asc'\"\n [class.is-desc]=\"getSortDirection('orderState') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('orderState')\"\n (click)=\"sortOrders('orderState')\">\n {{ 'order-state' | translate }}:\n </button>\n </div>\n }\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('paymentState')\"\n [class.is-asc]=\"getSortDirection('paymentState') === 'asc'\"\n [class.is-desc]=\"getSortDirection('paymentState') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('paymentState')\"\n (click)=\"sortOrders('paymentState')\">\n {{ 'payment-state' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('methodState')\"\n [class.is-asc]=\"getSortDirection('methodState') === 'asc'\"\n [class.is-desc]=\"getSortDirection('methodState') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('methodState')\"\n (click)=\"sortOrders('methodState')\">\n {{ 'shipment-state' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('method')\"\n [class.is-asc]=\"getSortDirection('method') === 'asc'\"\n [class.is-desc]=\"getSortDirection('method') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('method')\"\n (click)=\"sortOrders('method')\">\n {{ 'shipment-method' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button\n type=\"button\"\n class=\"st sort-trigger my-2\"\n [class.applied]=\"isCurrentSort('total')\"\n [class.is-asc]=\"getSortDirection('total') === 'asc'\"\n [class.is-desc]=\"getSortDirection('total') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('total')\"\n (click)=\"sortOrders('total')\">\n {{ 'total' | translate }}:\n </button>\n </div>\n </div>\n @for(order of orders; track $index){\n <div class=\"row item border-bottom py-2 d-none d-lg-flex\">\n <div [class]=\"getColumnClass()\">\n <p class=\"fw-bold order-number\">\n {{ order.number }}\n </p>\n </div>\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }}<br>\n {{ toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </p>\n </div>\n @if(hasOrderStateColumn){\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ order.orderState ? (order.orderState | translate | titlecase) : '-' }}\n </p>\n </div>\n }\n <div [class]=\"getColumnClass()\">\n @if(order.payments && order.payments.length > 0){\n <p class=\"price\">\n {{ order.payments[0].state | translate | titlecase }}\n </p>\n }\n </div>\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ order.shipments[0].state | translate | titlecase }}\n </p>\n @if(order.tracking){\n <a [href]=\"order.tracking\"\n class=\"btn btn-outline-dark btnLogout px-3 py-1 font-size-10 w-auto btn-sm\">Ver seguimiento</a>\n }\n </div>\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ order.shipments[0].method.name }}\n </p>\n </div>\n <div [class]=\"getColumnClass() + ' d-flex align-items-center order-total-actions'\">\n @if(priceVisibility.canShowPrices()){\n <p class=\"fw-bold text-nowrap order-total\">\n {{ (order.totals.total) | ecCurrencySymbol }}\n </p>\n }\n <button class=\"btn px-0 btdetalle order-detail-btn\" (click)=\"goToOrder(order)\" [attr.aria-label]=\"'Ver detalle del pedido ' + order.number\">\n <i class=\"bi bi-eye\" aria-hidden=\"true\"></i></button>\n </div>\n </div>\n\n <div class=\"order-mobile-card d-lg-none\">\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'order' | translate }}</span>\n <span class=\"order-mobile-value fw-bold\">{{ order.number }}</span>\n </div>\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'date' | translate }}</span>\n <span class=\"order-mobile-value\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }} {{ toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </span>\n </div>\n @if(hasOrderStateColumn){\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'order-state' | translate }}</span>\n <span class=\"order-mobile-value\">\n {{ order.orderState ? (order.orderState | translate | titlecase) : '-' }}\n </span>\n </div>\n }\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'payment-state' | translate }}</span>\n <span class=\"order-mobile-value\">\n {{ order.payments && order.payments.length > 0 ? (order.payments[0].state | translate | titlecase) : '-' }}\n </span>\n </div>\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'shipment-state' | translate }}</span>\n <span class=\"order-mobile-value\">{{ order.shipments[0].state | translate | titlecase }}</span>\n </div>\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'shipment-method' | translate }}</span>\n <span class=\"order-mobile-value\">{{ order.shipments[0].method.name }}</span>\n </div>\n <div class=\"order-mobile-actions\">\n @if(priceVisibility.canShowPrices()){\n <p class=\"fw-bold text-nowrap order-total mb-0\">\n {{ (order.totals.total) | ecCurrencySymbol }}\n </p>\n }\n <button class=\"btn px-0 btdetalle order-detail-btn\" (click)=\"goToOrder(order)\" [attr.aria-label]=\"'Ver detalle del pedido ' + order.number\">\n <i class=\"bi bi-eye\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n }@else {\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n }\n }@else {\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n }\n }\n </section>\n }@else {\n <div class=\"w-100 h-50 py-5\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n }\n</div>\n\n<ng-template #errorView>\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h4>{{ 'orders-error' | translate }}</h4>\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.sort-trigger{appearance:none;background:transparent;border:0;color:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:.45rem;padding:0;font-weight:500}.filters-row{--ec-filter-bg: var(--ec-orders-filter-bg, #f8f9fb);--ec-filter-border: var(--ec-orders-filter-border, #d9dee7);background:var(--ec-filter-bg);border:1px solid var(--ec-filter-border);border-radius:.5rem;padding:.9rem}.filters-row .form-select{min-height:2rem}.filters-row .form-control,.filters-row .form-select{background:#fff}.filter-col{min-width:0}.filter-range-row{flex-wrap:nowrap}.filter-range-row .form-control{min-width:0}.filter-label{display:block;font-size:.8rem;font-weight:600;margin-bottom:.25rem}.sort-trigger:after{content:\"\\25b5\\25bf\";font-size:.95rem;font-weight:700;line-height:1;opacity:.75;color:currentColor;letter-spacing:-.08em}.sort-trigger.applied{font-weight:700}.sort-trigger.applied:after{opacity:1}.sort-trigger.is-asc:after{content:\"\\25b2\"}.sort-trigger.is-desc:after{content:\"\\25bc\"}.order-total-actions{justify-content:space-between}.order-total{margin-bottom:0}.order-detail-btn{margin-left:auto;width:2rem;min-width:2rem;display:inline-flex;justify-content:center;align-items:center;color:var(--ec-orders-detail-icon-color, var(--ec-primary, currentColor))}@media (max-width: 991.98px){.filters-toggle-btn{font-weight:600}.filters-row{margin-bottom:.75rem!important;padding:.75rem}.filters-row.mobile-hidden{display:none}.filter-range-row{flex-wrap:wrap}.order-mobile-card{border:1px solid #e7e7e7;border-radius:.5rem;padding:.75rem;margin-bottom:.75rem;background:#fff}.order-mobile-row{display:flex;justify-content:space-between;align-items:flex-start;gap:.75rem;padding:.3rem 0;border-bottom:1px dashed #efefef}.order-mobile-row:last-of-type{border-bottom:0}.order-mobile-label{font-size:.8rem;font-weight:600;color:#6c757d;white-space:nowrap}.order-mobile-value{font-size:.9rem;text-align:right;word-break:break-word}.order-mobile-actions{margin-top:.5rem;display:flex;justify-content:space-between;align-items:center}.sort-trigger:after{font-size:1rem}}\n"] }]
363
+ args: [{ selector: 'app-orders-ec', standalone: true, imports: [LoadingFullEcComponent, TranslateModule, TitleCasePipe, EcCurrencySymbolPipe, FormsModule], template: "<div class=\"container-fluid\" id=\"ordersEcComponent\">\n @if(!loading){\n <section id=\"orders\" class=\"w-100\">\n @if(!priceVisibility.hidePrices()){\n @if(allOrders && allOrders.length){\n <div class=\"d-lg-none mb-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm w-100 filters-toggle-btn\"\n (click)=\"toggleMobileFilters()\">\n Filtros {{ showMobileFilters ? '\u25B2' : '\u25BC' }}\n </button>\n </div>\n <div class=\"row filters-row gy-3 mb-3\" [class.mobile-hidden]=\"!showMobileFilters\">\n @if(hasOrderStateColumn){\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'order-state' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.orderState\"\n (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.orderState; track $index){\n <option [value]=\"value\">{{ value | translate | titlecase }}</option>\n }\n </select>\n </div>\n }\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'payment-state' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.paymentState\"\n (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.paymentState; track $index){\n <option [value]=\"value\">{{ value | translate | titlecase }}</option>\n }\n </select>\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'shipment-state' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.shipmentState\"\n (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.shipmentState; track $index){\n <option [value]=\"value\">{{ value | translate | titlecase }}</option>\n }\n </select>\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'shipment-method' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.shipmentMethod\"\n (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(value of filterOptions.shipmentMethod; track $index){\n <option [value]=\"value\">{{ value }}</option>\n }\n </select>\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'date' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.dateMode\"\n (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(option of dateModeOptions; track $index){\n <option [value]=\"option.value\">{{ option.labelKey | translate }}</option>\n }\n </select>\n @if(selectedFilters.dateMode === 'between'){\n <div class=\"d-flex flex-column gap-1 mt-1 filter-range-row\">\n <input type=\"date\" class=\"form-control form-control-sm\" [(ngModel)]=\"selectedFilters.dateFrom\"\n (change)=\"onFilterChange()\">\n <input type=\"date\" class=\"form-control form-control-sm\" [(ngModel)]=\"selectedFilters.dateTo\"\n (change)=\"onFilterChange()\">\n </div>\n\n } @else if(selectedFilters.dateMode){\n <input type=\"date\" class=\"form-control form-control-sm mt-1\" [(ngModel)]=\"selectedFilters.dateValue\"\n (change)=\"onFilterChange()\">\n }\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 filter-col\">\n <label class=\"filter-label\">{{ 'total' | translate }}</label>\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedFilters.totalMode\"\n (change)=\"onFilterChange()\">\n <option value=\"\">{{ 'all' | translate }}</option>\n @for(option of totalModeOptions; track $index){\n <option [value]=\"option.value\">{{ option.labelKey | translate }}</option>\n }\n </select>\n @if(selectedFilters.totalMode === 'between'){\n <div class=\"d-flex gap-1 mt-1 filter-range-row\">\n <input type=\"number\" class=\"form-control form-control-sm\" placeholder=\"Min\"\n [(ngModel)]=\"selectedFilters.totalMin\" (input)=\"onFilterChange()\">\n <input type=\"number\" class=\"form-control form-control-sm\" placeholder=\"Max\"\n [(ngModel)]=\"selectedFilters.totalMax\" (input)=\"onFilterChange()\">\n </div>\n } @else if(selectedFilters.totalMode){\n <input type=\"number\" class=\"form-control form-control-sm mt-1\" placeholder=\"Valor\"\n [(ngModel)]=\"selectedFilters.totalValue\" (input)=\"onFilterChange()\">\n }\n </div>\n <div class=\"col-xxl-2 col-xl-3 col-lg-4 col-md-6 col-12 d-flex align-items-end filter-col\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm w-100\" (click)=\"clearFilters()\">\n {{ 'clear-filters' | translate }}\n </button>\n </div>\n </div>\n @if(orders && orders.length){\n <div class=\"row mb-1 border-bottom d-none d-lg-flex\">\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('number')\"\n [class.is-asc]=\"getSortDirection('number') === 'asc'\"\n [class.is-desc]=\"getSortDirection('number') === 'desc'\" [attr.aria-sort]=\"getAriaSort('number')\"\n (click)=\"sortOrders('number')\">\n {{ 'order' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('date')\"\n [class.is-asc]=\"getSortDirection('date') === 'asc'\"\n [class.is-desc]=\"getSortDirection('date') === 'desc'\" [attr.aria-sort]=\"getAriaSort('date')\"\n (click)=\"sortOrders('date')\">\n {{ 'date' | translate }}:\n </button>\n </div>\n @if(hasOrderStateColumn){\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('orderState')\"\n [class.is-asc]=\"getSortDirection('orderState') === 'asc'\"\n [class.is-desc]=\"getSortDirection('orderState') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('orderState')\" (click)=\"sortOrders('orderState')\">\n {{ 'order-state' | translate }}:\n </button>\n </div>\n }\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('paymentState')\"\n [class.is-asc]=\"getSortDirection('paymentState') === 'asc'\"\n [class.is-desc]=\"getSortDirection('paymentState') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('paymentState')\" (click)=\"sortOrders('paymentState')\">\n {{ 'payment-state' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('methodState')\"\n [class.is-asc]=\"getSortDirection('methodState') === 'asc'\"\n [class.is-desc]=\"getSortDirection('methodState') === 'desc'\"\n [attr.aria-sort]=\"getAriaSort('methodState')\" (click)=\"sortOrders('methodState')\">\n {{ 'shipment-state' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('method')\"\n [class.is-asc]=\"getSortDirection('method') === 'asc'\"\n [class.is-desc]=\"getSortDirection('method') === 'desc'\" [attr.aria-sort]=\"getAriaSort('method')\"\n (click)=\"sortOrders('method')\">\n {{ 'shipment-method' | translate }}:\n </button>\n </div>\n <div [class]=\"getColumnClass()\">\n <button type=\"button\" class=\"st sort-trigger my-2\" [class.applied]=\"isCurrentSort('total')\"\n [class.is-asc]=\"getSortDirection('total') === 'asc'\"\n [class.is-desc]=\"getSortDirection('total') === 'desc'\" [attr.aria-sort]=\"getAriaSort('total')\"\n (click)=\"sortOrders('total')\">\n {{ 'total' | translate }}:\n </button>\n </div>\n </div>\n @for(order of orders; track $index){\n <div class=\"row item border-bottom py-2 d-none d-lg-flex\">\n <div [class]=\"getColumnClass()\">\n <p class=\"fw-bold order-number\">\n {{ order.number }}\n </p>\n </div>\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }}<br>\n {{ toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </p>\n </div>\n @if(hasOrderStateColumn){\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ order.orderState ? (order.orderState | translate | titlecase) : '-' }}\n </p>\n </div>\n }\n <div [class]=\"getColumnClass()\">\n @if(order.payments && order.payments.length > 0){\n <p class=\"price\">\n {{ order.payments[0].state | translate | titlecase }}\n </p>\n }\n </div>\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ order.shipments[0].state | translate | titlecase }}\n </p>\n @if(order.tracking){\n <a [href]=\"order.tracking\"\n class=\"btn btn-outline-dark btnLogout px-3 py-1 font-size-10 w-auto btn-sm\">Ver seguimiento</a>\n }\n </div>\n <div [class]=\"getColumnClass()\">\n <p class=\"price\">\n {{ order.shipments[0].method.name }}\n </p>\n </div>\n <div [class]=\"getColumnClass() + ' d-flex align-items-center order-total-actions'\">\n @if(priceVisibility.canShowPrices()){\n <p class=\"fw-bold text-nowrap order-total\">\n {{ (order.totals.total) | ecCurrencySymbol }}\n </p>\n }\n <button class=\"btn px-0 btdetalle order-detail-btn\" (click)=\"goToOrder(order)\"\n [attr.aria-label]=\"'Ver detalle del pedido ' + order.number\">\n <i class=\"bi bi-eye\" aria-hidden=\"true\"></i></button>\n </div>\n </div>\n\n <div class=\"order-mobile-card d-lg-none\">\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'order' | translate }}</span>\n <span class=\"order-mobile-value fw-bold\">{{ order.number }}</span>\n </div>\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'date' | translate }}</span>\n <span class=\"order-mobile-value\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }} {{\n toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </span>\n </div>\n @if(hasOrderStateColumn){\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'order-state' | translate }}</span>\n <span class=\"order-mobile-value\">\n {{ order.orderState ? (order.orderState | translate | titlecase) : '-' }}\n </span>\n </div>\n }\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'payment-state' | translate }}</span>\n <span class=\"order-mobile-value\">\n {{ order.payments && order.payments.length > 0 ? (order.payments[0].state | translate | titlecase) :\n '-' }}\n </span>\n </div>\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'shipment-state' | translate }}</span>\n <span class=\"order-mobile-value\">{{ order.shipments[0].state | translate | titlecase }}</span>\n </div>\n <div class=\"order-mobile-row\">\n <span class=\"order-mobile-label\">{{ 'shipment-method' | translate }}</span>\n <span class=\"order-mobile-value\">{{ order.shipments[0].method.name }}</span>\n </div>\n <div class=\"order-mobile-actions\">\n @if(priceVisibility.canShowPrices()){\n <p class=\"fw-bold text-nowrap order-total mb-0\">\n {{ (order.totals.total) | ecCurrencySymbol }}\n </p>\n }\n <button class=\"btn px-0 btdetalle order-detail-btn\" (click)=\"goToOrder(order)\"\n [attr.aria-label]=\"'Ver detalle del pedido ' + order.number\">\n <i class=\"bi bi-eye\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n }@else {\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n }\n }@else {\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n }\n }\n </section>\n }@else {\n <div class=\"w-100 h-50 py-5\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n }\n</div>\n\n<ng-template #errorView>\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h4>{{ 'orders-error' | translate }}</h4>\n </div>\n </div>\n</ng-template>", styles: ["@charset \"UTF-8\";.sort-trigger{appearance:none;background:transparent;border:0;color:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:.45rem;padding:0;font-weight:500}.filters-row{--ec-filter-bg: var(--ec-orders-filter-bg, #f8f9fb);--ec-filter-border: var(--ec-orders-filter-border, #d9dee7);background:var(--ec-filter-bg);border:1px solid var(--ec-filter-border);border-radius:.5rem;padding:.9rem}.filters-row .form-select{min-height:2rem}.filters-row .form-control,.filters-row .form-select{background:#fff}.filter-col{min-width:0}.filter-range-row{flex-wrap:nowrap}.filter-range-row .form-control{min-width:0}.filter-label{display:block;font-size:.8rem;font-weight:600;margin-bottom:.25rem}.sort-trigger:after{content:\"\\25b5\\25bf\";font-size:.95rem;font-weight:700;line-height:1;opacity:.75;color:currentColor;letter-spacing:-.08em}.sort-trigger.applied{font-weight:700}.sort-trigger.applied:after{opacity:1}.sort-trigger.is-asc:after{content:\"\\25b2\"}.sort-trigger.is-desc:after{content:\"\\25bc\"}.order-total-actions{justify-content:space-between}.order-total{margin-bottom:0}.order-detail-btn{margin-left:auto;width:2rem;min-width:2rem;display:inline-flex;justify-content:center;align-items:center;color:var(--ec-orders-detail-icon-color, var(--ec-primary, currentColor))}@media (max-width: 991.98px){.filters-toggle-btn{font-weight:600}.filters-row{margin-bottom:.75rem!important;padding:.75rem}.filters-row.mobile-hidden{display:none}.filter-range-row{flex-wrap:wrap}.order-mobile-card{border:1px solid #e7e7e7;border-radius:.5rem;padding:.75rem;margin-bottom:.75rem;background:#fff}.order-mobile-row{display:flex;justify-content:space-between;align-items:flex-start;gap:.75rem;padding:.3rem 0;border-bottom:1px dashed #efefef}.order-mobile-row:last-of-type{border-bottom:0}.order-mobile-label{font-size:.8rem;font-weight:600;color:#6c757d;white-space:nowrap}.order-mobile-value{font-size:.9rem;text-align:right;word-break:break-word}.order-mobile-actions{margin-top:.5rem;display:flex;justify-content:space-between;align-items:center}.sort-trigger:after{font-size:1rem}}\n"] }]
364
364
  }] });
365
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXJzLWxpc3QtZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvYWNjb3VudC1lYy9vcmRlcnMtbGlzdC1lYy9vcmRlcnMtbGlzdC1lYy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy9hY2NvdW50LWVjL29yZGVycy1saXN0LWVjL29yZGVycy1saXN0LWVjLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDdkYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7O0FBU3hELE1BQU0sT0FBTyxxQkFBcUI7SUFFekIsY0FBYyxHQUFrQixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdEQsT0FBTyxHQUFXLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QixZQUFZLEdBQWdCLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzQyxlQUFlLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFFMUQsT0FBTyxHQUFZLEtBQUssQ0FBQztJQUN6QixTQUFTLEdBQVUsRUFBRSxDQUFDO0lBQ3RCLE1BQU0sR0FBVSxFQUFFLENBQUM7SUFDbkIsbUJBQW1CLEdBQVksS0FBSyxDQUFDO0lBQ3JDLGFBQWEsR0FBUTtRQUMzQixVQUFVLEVBQUUsRUFBRTtRQUNkLFlBQVksRUFBRSxFQUFFO1FBQ2hCLGFBQWEsRUFBRSxFQUFFO1FBQ2pCLGNBQWMsRUFBRSxFQUFFO0tBQ2xCLENBQUM7SUFDSyxlQUFlLEdBQVE7UUFDN0IsVUFBVSxFQUFFLEVBQUU7UUFDZCxZQUFZLEVBQUUsRUFBRTtRQUNoQixhQUFhLEVBQUUsRUFBRTtRQUNqQixjQUFjLEVBQUUsRUFBRTtRQUNsQixRQUFRLEVBQUUsRUFBRTtRQUNaLFNBQVMsRUFBRSxFQUFFO1FBQ2IsUUFBUSxFQUFFLEVBQUU7UUFDWixNQUFNLEVBQUUsRUFBRTtRQUNWLFNBQVMsRUFBRSxFQUFFO1FBQ2IsVUFBVSxFQUFFLElBQUk7UUFDaEIsUUFBUSxFQUFFLElBQUk7UUFDZCxRQUFRLEVBQUUsSUFBSTtLQUNkLENBQUM7SUFDSyxlQUFlLEdBQUc7UUFDeEIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRTtRQUM5QyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFFO1FBQzlDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsb0JBQW9CLEVBQUU7UUFDL0MsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7S0FDOUMsQ0FBQztJQUNLLGdCQUFnQixHQUFHO1FBQ3pCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUU7UUFDNUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRTtRQUNoRCxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFO1FBQzdDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFO0tBQzlDLENBQUM7SUFDSyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDekIsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUNwQixTQUFTLENBQU07SUFDWixTQUFTLEdBQVksSUFBSSxDQUFDO0lBQzFCLHNCQUFzQixHQUFZLEtBQUssQ0FBQztJQUVsRDs7T0FFRztJQUNJLFdBQVcsR0FBUSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFBO0lBQ2pEOztPQUVHO0lBQ0ksWUFBWSxHQUFRO1FBQzFCLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRTtRQUMxQyxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUU7UUFDbEQsWUFBWSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO1FBQy9DLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFO1FBQ2hFLFdBQVcsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRTtRQUM5QyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsRUFBRTtRQUNyRCxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtLQUNoRSxDQUFDO0lBRUYsUUFBUTtRQUNQLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzVELElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzVFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtZQUNyQixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO2dCQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQztZQUM3QixDQUFDO1NBQ0QsQ0FBQyxDQUFBO1FBRUksSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQy9DLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxNQUFNLEtBQUssSUFBSSxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFXO1FBQ3pCLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxVQUFlLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzlILENBQUM7SUFFRDs7O01BR0U7SUFDRixVQUFVLENBQUMsS0FBVTtRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQTtRQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDMUUsTUFBTSxVQUFVLEdBQ2YsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDWCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUE7UUFFN0UsSUFBSSxTQUFTLENBQUE7UUFDZCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3BDLENBQUM7UUFDRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN2RCxJQUFJLENBQUMsTUFBTTtZQUNWLElBQUksQ0FBQyxTQUFTO2dCQUNiLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUMvSCxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQTtJQUNoQixDQUFDO0lBRUQsY0FBYztRQUNiLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsWUFBWTtRQUNYLElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDdEIsVUFBVSxFQUFFLEVBQUU7WUFDZCxZQUFZLEVBQUUsRUFBRTtZQUNoQixhQUFhLEVBQUUsRUFBRTtZQUNqQixjQUFjLEVBQUUsRUFBRTtZQUNsQixRQUFRLEVBQUUsRUFBRTtZQUNaLFNBQVMsRUFBRSxFQUFFO1lBQ2IsUUFBUSxFQUFFLEVBQUU7WUFDWixNQUFNLEVBQUUsRUFBRTtZQUNWLFNBQVMsRUFBRSxFQUFFO1lBQ2IsVUFBVSxFQUFFLElBQUk7WUFDaEIsUUFBUSxFQUFFLElBQUk7WUFDZCxRQUFRLEVBQUUsSUFBSTtTQUNkLENBQUM7UUFDRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELG1CQUFtQjtRQUNsQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDbEQsQ0FBQztJQUVPLFlBQVk7UUFDbkIsSUFBSSxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV6QyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZDLGNBQWMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0gsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QyxjQUFjLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdILENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckksQ0FBQztRQUNELGNBQWMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDL0UsY0FBYyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVoRixJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzdCLE9BQU87UUFDUixDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqQixPQUFPO1FBQ1IsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQVU7UUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDYixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRS9ELFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDZCxLQUFLLElBQUk7Z0JBQ1IsT0FBTyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDaEQsS0FBSyxJQUFJO2dCQUNSLE9BQU8sS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzlDLEtBQUssSUFBSTtnQkFDUixPQUFPLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM5QyxLQUFLLFNBQVM7Z0JBQ2IsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxJQUFJO29CQUFFLE9BQU8sS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDO2dCQUN0RSxJQUFJLEdBQUcsS0FBSyxJQUFJO29CQUFFLE9BQU8sS0FBSyxJQUFJLEdBQUcsQ0FBQztnQkFDdEMsSUFBSSxHQUFHLEtBQUssSUFBSTtvQkFBRSxPQUFPLEtBQUssSUFBSSxHQUFHLENBQUM7Z0JBQ3RDLE9BQU8sSUFBSSxDQUFDO1lBQ2I7Z0JBQ0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0YsQ0FBQztJQUVPLGlCQUFpQixDQUFDLEtBQVU7UUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFDM0MsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDYixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUMxQixPQUFPLEtBQUssQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuRCxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2QsS0FBSyxJQUFJO2dCQUNSLE9BQU8sU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3hFLEtBQUssSUFBSTtnQkFDUixPQUFPLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUN6RSxLQUFLLElBQUk7Z0JBQ1IsT0FBTyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUUsS0FBSyxTQUFTO2dCQUNiLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7b0JBQUUsT0FBTyxTQUFTLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdkksSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO29CQUFFLE9BQU8sU0FBUyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3hFLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtvQkFBRSxPQUFPLFNBQVMsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNyRSxPQUFPLElBQUksQ0FBQztZQUNiO2dCQUNDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNGLENBQUM7SUFFTyxjQUFjLENBQUMsS0FBVTtRQUNoQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDM0QsT0FBTyxJQUFJLENBQUM7UUFDYixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDaEQsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE1BQWE7UUFDdkMsTUFBTSxZQUFZLEdBQUc7WUFDcEIsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFVO1lBQzdCLFlBQVksRUFBRSxJQUFJLEdBQUcsRUFBVTtZQUMvQixhQUFhLEVBQUUsSUFBSSxHQUFHLEVBQVU7WUFDaEMsY0FBYyxFQUFFLElBQUksR0FBRyxFQUFVO1NBQ2pDLENBQUM7UUFFRixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLElBQUksS0FBSyxFQUFFLFVBQVU7Z0JBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JFLElBQUksS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUs7Z0JBQUUsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4RixJQUFJLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLO2dCQUFFLFlBQVksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0YsSUFBSSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUk7Z0JBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUcsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ04sVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRTtZQUN0RCxZQUFZLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQzFELGFBQWEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDNUQsY0FBYyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksRUFBRTtTQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLFVBQVUsQ0FBQyxPQUFZLEVBQUUsV0FBZ0IsRUFBRSxVQUFlO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN2RyxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNLLGNBQWMsQ0FBQyxJQUFZLEVBQUUsR0FBWTtRQUNoRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO0lBQzNCLENBQUM7SUFDRDs7OztPQUlHO0lBQ0ssZUFBZSxDQUFDLEtBQVU7UUFDakMsUUFBUSxLQUFLLEVBQUUsQ0FBQztZQUNmLEtBQUssY0FBYztnQkFDbEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pDLEtBQUssUUFBUTtnQkFDWixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLEtBQUssYUFBYTtnQkFDakIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QyxLQUFLLE9BQU87Z0JBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQztnQkFDQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDRixDQUFDO0lBRUQsNkJBQTZCO0lBQ3JCLGdCQUFnQixDQUFDLE9BQVksRUFBRSxXQUFnQixFQUFFLElBQVMsRUFBRSxVQUFlO1FBQ2xGLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0RixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQztZQUNuRCxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzdKLENBQUM7SUFFTyxhQUFhLENBQUMsT0FBWSxFQUFFLFdBQWdCLEVBQUUsSUFBUyxFQUFFLFVBQWU7UUFDL0UsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzlILENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDO2dCQUNuRCxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDck0sQ0FBQzthQUNJLENBQUM7WUFDTCxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3hGLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDO2dCQUNuRCxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQy9KLENBQUM7SUFDRixDQUFDO0lBRU8sVUFBVSxDQUFDLE9BQVksRUFBRSxXQUFnQixFQUFFLElBQVMsRUFBRSxVQUFlO1FBQzVFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlHLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RILE9BQU8sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdkQsQ0FBQztJQUVPLFFBQVEsQ0FBQyxPQUFZLEVBQUUsV0FBZ0IsRUFBRSxJQUFTLEVBQUUsVUFBZTtRQUMxRSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlELENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNqRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNySSxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQVEsRUFBRSxNQUFVLElBQUcsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxJQUFJLHVCQUF1QixJQUFJLE1BQU0sQ0FBQyxDQUFBLENBQUEsQ0FBQztJQUV2RyxhQUFhLENBQUMsSUFBWTtRQUN6QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBWTtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sTUFBTSxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlDLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBWTtRQUN2QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxTQUFTLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDekIsT0FBTyxXQUFXLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzFCLE9BQU8sWUFBWSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFRCxjQUFjO1FBQ2IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7SUFDdkUsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFTO1FBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLGtCQUFrQixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7d0dBbFhRLHFCQUFxQjs0RkFBckIscUJBQXFCLHlFQ25CbEMsa3ZqQkFtVEEsb25FRHBTVyxzQkFBc0IsK0RBQUUsZUFBZSx1RkFBRSxhQUFhLDZDQUFFLG9CQUFvQix3REFBRSxXQUFXOzs0RkFJdkYscUJBQXFCO2tCQVBqQyxTQUFTOytCQUNDLGVBQWUsY0FDYixJQUFJLFdBQ1AsQ0FBQyxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9yZGVyc1NlcnZpY2UsIENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZWMtc2VydmljZXMnO1xuaW1wb3J0IHsgUHJpY2VWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzL3ByaWNlLXZpc2liaWxpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExvYWRpbmdGdWxsRWNDb21wb25lbnQgfSBmcm9tICcuLi8uLi93aWRnZXRzLWVjJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgVGl0bGVDYXNlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBFY0N1cnJlbmN5U3ltYm9sUGlwZSB9IGZyb20gJy4uLy4uLy4uL2VjLXBpcGUnO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdhcHAtb3JkZXJzLWVjJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0aW1wb3J0czogW0xvYWRpbmdGdWxsRWNDb21wb25lbnQsIFRyYW5zbGF0ZU1vZHVsZSwgVGl0bGVDYXNlUGlwZSwgRWNDdXJyZW5jeVN5bWJvbFBpcGUsIEZvcm1zTW9kdWxlXSxcblx0dGVtcGxhdGVVcmw6ICcuL29yZGVycy1saXN0LWVjLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVVcmw6ICcuL29yZGVycy1saXN0LWVjLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBPcmRlcnNMaXN0RWNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG5cdHByaXZhdGUgX29yZGVyc1NlcnZpY2U6IE9yZGVyc1NlcnZpY2UgPSBpbmplY3QoT3JkZXJzU2VydmljZSk7XG5cdHByaXZhdGUgX3JvdXRlcjogUm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gICAgcHJpdmF0ZSBfY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlID0gaW5qZWN0KENhcnRTZXJ2aWNlKTtcblx0cHVibGljIHJlYWRvbmx5IHByaWNlVmlzaWJpbGl0eSA9IGluamVjdChQcmljZVZpc2liaWxpdHlTZXJ2aWNlKTtcblxuXHRwdWJsaWMgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXHRwdWJsaWMgYWxsT3JkZXJzOiBhbnlbXSA9IFtdO1xuXHRwdWJsaWMgb3JkZXJzOiBhbnlbXSA9IFtdO1xuXHRwdWJsaWMgaGFzT3JkZXJTdGF0ZUNvbHVtbjogYm9vbGVhbiA9IGZhbHNlO1xuXHRwdWJsaWMgZmlsdGVyT3B0aW9uczogYW55ID0ge1xuXHRcdG9yZGVyU3RhdGU6IFtdLFxuXHRcdHBheW1lbnRTdGF0ZTogW10sXG5cdFx0c2hpcG1lbnRTdGF0ZTogW10sXG5cdFx0c2hpcG1lbnRNZXRob2Q6IFtdXG5cdH07XG5cdHB1YmxpYyBzZWxlY3RlZEZpbHRlcnM6IGFueSA9IHtcblx0XHRvcmRlclN0YXRlOiAnJyxcblx0XHRwYXltZW50U3RhdGU6ICcnLFxuXHRcdHNoaXBtZW50U3RhdGU6ICcnLFxuXHRcdHNoaXBtZW50TWV0aG9kOiAnJyxcblx0XHRkYXRlTW9kZTogJycsXG5cdFx0ZGF0ZVZhbHVlOiAnJyxcblx0XHRkYXRlRnJvbTogJycsXG5cdFx0ZGF0ZVRvOiAnJyxcblx0XHR0b3RhbE1vZGU6ICcnLFxuXHRcdHRvdGFsVmFsdWU6IG51bGwsXG5cdFx0dG90YWxNaW46IG51bGwsXG5cdFx0dG90YWxNYXg6IG51bGxcblx0fTtcblx0cHVibGljIGRhdGVNb2RlT3B0aW9ucyA9IFtcblx0XHR7IHZhbHVlOiAnZXEnLCBsYWJlbEtleTogJ2ZpbHRlci1leGFjdC1kYXRlJyB9LFxuXHRcdHsgdmFsdWU6ICdndCcsIGxhYmVsS2V5OiAnZmlsdGVyLWFmdGVyLWRhdGUnIH0sXG5cdFx0eyB2YWx1ZTogJ2x0JywgbGFiZWxLZXk6ICdmaWx0ZXItYmVmb3JlLWRhdGUnIH0sXG5cdFx0eyB2YWx1ZTogJ2JldHdlZW4nLCBsYWJlbEtleTogJ2ZpbHRlci1yYW5nZScgfVxuXHRdO1xuXHRwdWJsaWMgdG90YWxNb2RlT3B0aW9ucyA9IFtcblx0XHR7IHZhbHVlOiAnZXEnLCBsYWJlbEtleTogJ2ZpbHRlci1lcXVhbC10bycgfSxcblx0XHR7IHZhbHVlOiAnZ3QnLCBsYWJlbEtleTogJ2ZpbHRlci1ncmVhdGVyLXRoYW4nIH0sXG5cdFx0eyB2YWx1ZTogJ2x0JywgbGFiZWxLZXk6ICdmaWx0ZXItbGVzcy10aGFuJyB9LFxuXHRcdHsgdmFsdWU6ICdiZXR3ZWVuJywgbGFiZWxLZXk6ICdmaWx0ZXItcmFuZ2UnIH1cblx0XTtcblx0cHVibGljIHNob3dNb2JpbGVGaWx0ZXJzID0gZmFsc2U7XG5cdHByaXZhdGUgZXJyb3I6IHN0cmluZyA9IFwiXCI7XG5cdHB1YmxpYyBzb3J0VmFsdWU6IGFueTtcbiAgICBwdWJsaWMgc2hvd1ByaWNlOiBib29sZWFuID0gdHJ1ZTtcbiAgICBwdWJsaWMgY3JlZGl0QW1vdW50Q29uZmlndXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb24gbmFtZSAtPiBub21icmUgZGUgY2xhdmUgZGUgdmFsdWVzVG9Tb3J0OyBhc2MgLT4gdHJ1ZTogYXNjZW5kZW50ZSwgZmFsc2U6IGRlc2NlbmRlbnRlXG5cdCAqL1xuXHRwdWJsaWMgY3VycmVudFNvcnQ6IGFueSA9IHsgbmFtZTogJycsIGFzYzogdHJ1ZSB9XG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb24gdHJ1ZSAtPiBvcmRlbmEgZGUgZm9ybWEgYXNjZW5kZW50ZSB8IGZhbHNlIC0+IG9yZGVuYSBkZSBmb3JtYSBkZWNyZWNpZW50ZVxuXHQgKi9cblx0cHVibGljIHZhbHVlc1RvU29ydDogYW55ID0ge1xuXHRcdG51bWJlcjogeyBhc2M6IHRydWUsIGF0dHJpYnV0ZTogJ251bWJlcicgfSxcblx0XHRvcmRlclN0YXRlOiB7IGFzYzogdHJ1ZSwgYXR0cmlidXRlOiAnb3JkZXJTdGF0ZScgfSxcblx0XHRwYXltZW50U3RhdGU6IHsgYXNjOiB0cnVlLCBhdHRyaWJ1dGU6ICdzdGF0ZScgfSxcblx0XHRtZXRob2Q6IHsgYXNjOiB0cnVlLCBhdHRyaWJ1dGU6ICdtZXRob2QnLCBzdWJBdHRyaWJ1dGU6ICduYW1lJyB9LFxuXHRcdG1ldGhvZFN0YXRlOiB7IGFzYzogdHJ1ZSwgYXR0cmlidXRlOiAnc3RhdGUnIH0sXG5cdFx0ZGF0ZTogeyBhc2M6IHRydWUsIGF0dHJpYnV0ZTogJ2NoZWNrb3V0Q29tcGxldGVkQXQnIH0sXG5cdFx0dG90YWw6IHsgYXNjOiB0cnVlLCBhdHRyaWJ1dGU6ICd0b3RhbHMnLCBzdWJBdHRyaWJ1dGU6ICd0b3RhbCcgfVxuXHR9O1xuXG5cdG5nT25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMubG9hZGluZyA9IHRydWU7XG5cdFx0dGhpcy5fb3JkZXJzU2VydmljZS51cGRhdGVPcmRlcnMoKTtcblx0XHR0aGlzLl9vcmRlcnNTZXJ2aWNlLm9yZGVycyQucGlwZShmaWx0ZXIob3IgPT4gb3IpKS5zdWJzY3JpYmUoe1xuXHRcdFx0bmV4dDogKG9yZGVycykgPT4ge1xuXHRcdFx0XHR0aGlzLmFsbE9yZGVycyA9IHRoaXMuc29ydGVkQnlOZXdlc3QoWy4uLihvcmRlcnMgfHwgW10pXSkgfHwgW107XG5cdFx0XHRcdHRoaXMuaGFzT3JkZXJTdGF0ZUNvbHVtbiA9IHRoaXMuYWxsT3JkZXJzLnNvbWUob3JkZXIgPT4gISFvcmRlci5vcmRlclN0YXRlKTtcblx0XHRcdFx0dGhpcy5maWx0ZXJPcHRpb25zID0gdGhpcy5idWlsZEZpbHRlck9wdGlvbnModGhpcy5hbGxPcmRlcnMpO1xuXHRcdFx0XHR0aGlzLm9yZGVycyA9IFsuLi50aGlzLmFsbE9yZGVyc107XG5cdFx0XHRcdHRoaXMubG9hZGluZyA9IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0ZXJyb3I6IChlcnJvcikgPT4ge1xuXHRcdFx0XHR0aGlzLmxvYWRpbmcgPSBmYWxzZVxuXHRcdFx0XHR0aGlzLmVycm9yID0gJ29yZGVycy1lcnJvcic7XG5cdFx0XHR9XG5cdFx0fSlcblxuICAgICAgICB0aGlzLl9jYXJ0U2VydmljZS5jcmVkaXRBbW91bnQkLnN1YnNjcmliZShhbW91bnQgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVkaXRBbW91bnRDb25maWd1cmVkID0gYW1vdW50ICE9PSBudWxsO1xuICAgICAgICB9KTtcblx0fVxuXG5cdHNvcnRlZEJ5TmV3ZXN0KG9yZGVyczogYW55KSB7XG5cdFx0cmV0dXJuIG9yZGVycyAmJiBvcmRlcnMubGVuZ3RoICYmIG9yZGVycy5zb3J0KChhbk9yZGVyOiBhbnksIG90aGVyT3JkZXI6IGFueSkgPT4gYW5PcmRlci5udW1iZXIgPiBvdGhlck9yZGVyLm51bWJlciA/IC0xIDogMSlcblx0fVxuXG5cdC8qKlxuXHQqIEBkZXNjcmlwdGlvbiBPcmRlbmEgbGEgbGlzdGEgZGUgb3JkZW5lc1xuXHQqIEBwYXJhbSB2YWx1ZSByZWNpYmUgdW5hIHZhbG9yIHF1ZSBkZWJlIGNvaW5jaWRpciBjb24gbGFzIGNsYXZlcyBkZSBsYSB2YXJpYWJsZSB2YWx1ZXNUb1NvcnRcblx0Ki9cblx0c29ydE9yZGVycyh2YWx1ZTogYW55KSB7XG5cdFx0dGhpcy5zb3J0VmFsdWUgPSB2YWx1ZVxuXHRcdHRoaXMuc2V0Q3VycmVudFNvcnQodGhpcy5zb3J0VmFsdWUsIHRoaXMudmFsdWVzVG9Tb3J0W3RoaXMuc29ydFZhbHVlXS5hc2MpXG5cdFx0Y29uc3QgY29tcGFyYXRvciA9XG5cdFx0XHQodGhpcy52YWx1ZXNUb1NvcnRbdGhpcy5zb3J0VmFsdWVdLmFzYylcblx0XHRcdFx0PyBbLTEsIDFdXG5cdFx0XHRcdDogWzEsIC0xXVxuXHRcdHRoaXMudmFsdWVzVG9Tb3J0W3RoaXMuc29ydFZhbHVlXS5hc2MgPSAhdGhpcy52YWx1ZXNUb1NvcnRbdGhpcy5zb3J0VmFsdWVdLmFzY1xuXHRcdFxuXHRcdFx0bGV0IHR5cGVWYWx1ZVxuXHRcdGlmICh0aGlzLm9yZGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0eXBlVmFsdWUgPSB0eXBlb2YgKHRoaXMub3JkZXJzWzBdKVxuXHRcdH1cblx0XHRsZXQgc29ydEZ1bmN0aW9uID0gdGhpcy5nZXRTb3J0RnVuY3Rpb24odGhpcy5zb3J0VmFsdWUpXG5cdFx0dGhpcy5vcmRlcnMgPVxuXHRcdFx0dGhpcy5zb3J0VmFsdWVcblx0XHRcdFx0PyB0aGlzLm9yZGVycy5zb3J0KChhT3JkZXJzLCBvdGhlck9yZGVycykgPT4gc29ydEZ1bmN0aW9uKGFPcmRlcnMsIG90aGVyT3JkZXJzLCB0aGlzLnZhbHVlc1RvU29ydFt0aGlzLnNvcnRWYWx1ZV0sIGNvbXBhcmF0b3IpKVxuXHRcdFx0XHQ6IHRoaXMub3JkZXJzXG5cdH1cblxuXHRvbkZpbHRlckNoYW5nZSgpOiB2b2lkIHtcblx0XHR0aGlzLmFwcGx5RmlsdGVycygpO1xuXHR9XG5cblx0Y2xlYXJGaWx0ZXJzKCk6IHZvaWQge1xuXHRcdHRoaXMuc2VsZWN0ZWRGaWx0ZXJzID0ge1xuXHRcdFx0b3JkZXJTdGF0ZTogJycsXG5cdFx0XHRwYXltZW50U3RhdGU6ICcnLFxuXHRcdFx0c2hpcG1lbnRTdGF0ZTogJycsXG5cdFx0XHRzaGlwbWVudE1ldGhvZDogJycsXG5cdFx0XHRkYXRlTW9kZTogJycsXG5cdFx0XHRkYXRlVmFsdWU6ICcnLFxuXHRcdFx0ZGF0ZUZyb206ICcnLFxuXHRcdFx0ZGF0ZVRvOiAnJyxcblx0XHRcdHRvdGFsTW9kZTogJycsXG5cdFx0XHR0b3RhbFZhbHVlOiBudWxsLFxuXHRcdFx0dG90YWxNaW46IG51bGwsXG5cdFx0XHR0b3RhbE1heDogbnVsbFxuXHRcdH07XG5cdFx0dGhpcy5hcHBseUZpbHRlcnMoKTtcblx0fVxuXG5cdHRvZ2dsZU1vYmlsZUZpbHRlcnMoKTogdm9pZCB7XG5cdFx0dGhpcy5zaG93TW9iaWxlRmlsdGVycyA9ICF0aGlzLnNob3dNb2JpbGVGaWx0ZXJzO1xuXHR9XG5cblx0cHJpdmF0ZSBhcHBseUZpbHRlcnMoKTogdm9pZCB7XG5cdFx0bGV0IGZpbHRlcmVkT3JkZXJzID0gWy4uLnRoaXMuYWxsT3JkZXJzXTtcblxuXHRcdGlmICh0aGlzLnNlbGVjdGVkRmlsdGVycy5vcmRlclN0YXRlKSB7XG5cdFx0XHRmaWx0ZXJlZE9yZGVycyA9IGZpbHRlcmVkT3JkZXJzLmZpbHRlcihvcmRlciA9PiAob3JkZXIub3JkZXJTdGF0ZSB8fCAnJykgPT09IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLm9yZGVyU3RhdGUpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5zZWxlY3RlZEZpbHRlcnMucGF5bWVudFN0YXRlKSB7XG5cdFx0XHRmaWx0ZXJlZE9yZGVycyA9IGZpbHRlcmVkT3JkZXJzLmZpbHRlcihvcmRlciA9PiAob3JkZXIucGF5bWVudHM/LlswXT8uc3RhdGUgfHwgJycpID09PSB0aGlzLnNlbGVjdGVkRmlsdGVycy5wYXltZW50U3RhdGUpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5zZWxlY3RlZEZpbHRlcnMuc2hpcG1lbnRTdGF0ZSkge1xuXHRcdFx0ZmlsdGVyZWRPcmRlcnMgPSBmaWx0ZXJlZE9yZGVycy5maWx0ZXIob3JkZXIgPT4gKG9yZGVyLnNoaXBtZW50cz8uWzBdPy5zdGF0ZSB8fCAnJykgPT09IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnNoaXBtZW50U3RhdGUpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5zZWxlY3RlZEZpbHRlcnMuc2hpcG1lbnRNZXRob2QpIHtcblx0XHRcdGZpbHRlcmVkT3JkZXJzID0gZmlsdGVyZWRPcmRlcnMuZmlsdGVyKG9yZGVyID0+IChvcmRlci5zaGlwbWVudHM/LlswXT8ubWV0aG9kPy5uYW1lIHx8ICcnKSA9PT0gdGhpcy5zZWxlY3RlZEZpbHRlcnMuc2hpcG1lbnRNZXRob2QpO1xuXHRcdH1cblx0XHRmaWx0ZXJlZE9yZGVycyA9IGZpbHRlcmVkT3JkZXJzLmZpbHRlcihvcmRlciA9PiB0aGlzLm1hdGNoZXNEYXRlRmlsdGVyKG9yZGVyKSk7XG5cdFx0ZmlsdGVyZWRPcmRlcnMgPSBmaWx0ZXJlZE9yZGVycy5maWx0ZXIob3JkZXIgPT4gdGhpcy5tYXRjaGVzVG90YWxGaWx0ZXIob3JkZXIpKTtcblxuXHRcdHRoaXMub3JkZXJzID0gZmlsdGVyZWRPcmRlcnM7XG5cdFx0dGhpcy5hcHBseUN1cnJlbnRTb3J0KCk7XG5cdH1cblxuXHRwcml2YXRlIGFwcGx5Q3VycmVudFNvcnQoKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLmN1cnJlbnRTb3J0Py5uYW1lKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHNvcnRDb25maWcgPSB0aGlzLnZhbHVlc1RvU29ydFt0aGlzLmN1cnJlbnRTb3J0Lm5hbWVdO1xuXHRcdGlmICghc29ydENvbmZpZykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBjb21wYXJhdG9yID0gdGhpcy5jdXJyZW50U29ydC5hc2MgPyBbLTEsIDFdIDogWzEsIC0xXTtcblx0XHRjb25zdCBzb3J0RnVuY3Rpb24gPSB0aGlzLmdldFNvcnRGdW5jdGlvbih0aGlzLmN1cnJlbnRTb3J0Lm5hbWUpO1xuXHRcdHRoaXMub3JkZXJzID0gdGhpcy5vcmRlcnMuc29ydCgoYU9yZGVycywgb3RoZXJPcmRlcnMpID0+IHNvcnRGdW5jdGlvbihhT3JkZXJzLCBvdGhlck9yZGVycywgc29ydENvbmZpZywgY29tcGFyYXRvcikpO1xuXHR9XG5cblx0cHJpdmF0ZSBtYXRjaGVzVG90YWxGaWx0ZXIob3JkZXI6IGFueSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1vZGUgPSB0aGlzLnNlbGVjdGVkRmlsdGVycy50b3RhbE1vZGU7XG5cdFx0aWYgKCFtb2RlKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRjb25zdCB0b3RhbCA9IE51bWJlcihvcmRlcj8udG90YWxzPy50b3RhbCA/PyAwKTtcblx0XHRjb25zdCB2YWx1ZSA9IHRoaXMudG9OdW1iZXJPck51bGwodGhpcy5zZWxlY3RlZEZpbHRlcnMudG90YWxWYWx1ZSk7XG5cdFx0Y29uc3QgbWluID0gdGhpcy50b051bWJlck9yTnVsbCh0aGlzLnNlbGVjdGVkRmlsdGVycy50b3RhbE1pbik7XG5cdFx0Y29uc3QgbWF4ID0gdGhpcy50b051bWJlck9yTnVsbCh0aGlzLnNlbGVjdGVkRmlsdGVycy50b3RhbE1heCk7XG5cblx0XHRzd2l0Y2ggKG1vZGUpIHtcblx0XHRcdGNhc2UgJ2VxJzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlICE9PSBudWxsID8gdG90YWwgPT09IHZhbHVlIDogdHJ1ZTtcblx0XHRcdGNhc2UgJ2d0Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlICE9PSBudWxsID8gdG90YWwgPiB2YWx1ZSA6IHRydWU7XG5cdFx0XHRjYXNlICdsdCc6XG5cdFx0XHRcdHJldHVybiB2YWx1ZSAhPT0gbnVsbCA/IHRvdGFsIDwgdmFsdWUgOiB0cnVlO1xuXHRcdFx0Y2FzZSAnYmV0d2Vlbic6XG5cdFx0XHRcdGlmIChtaW4gIT09IG51bGwgJiYgbWF4ICE9PSBudWxsKSByZXR1cm4gdG90YWwgPj0gbWluICYmIHRvdGFsIDw9IG1heDtcblx0XHRcdFx0aWYgKG1pbiAhPT0gbnVsbCkgcmV0dXJuIHRvdGFsID49IG1pbjtcblx0XHRcdFx0aWYgKG1heCAhPT0gbnVsbCkgcmV0dXJuIHRvdGFsIDw9IG1heDtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoZXNEYXRlRmlsdGVyKG9yZGVyOiBhbnkpOiBib29sZWFuIHtcblx0XHRjb25zdCBtb2RlID0gdGhpcy5zZWxlY3RlZEZpbHRlcnMuZGF0ZU1vZGU7XG5cdFx0aWYgKCFtb2RlKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRjb25zdCBvcmRlckRhdGUgPSBtb21lbnQob3JkZXI/LmNoZWNrb3V0Q29tcGxldGVkQXQpO1xuXHRcdGlmICghb3JkZXJEYXRlLmlzVmFsaWQoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHZhbHVlRGF0ZSA9IG1vbWVudCh0aGlzLnNlbGVjdGVkRmlsdGVycy5kYXRlVmFsdWUpO1xuXHRcdGNvbnN0IGZyb21EYXRlID0gbW9tZW50KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmRhdGVGcm9tKTtcblx0XHRjb25zdCB0b0RhdGUgPSBtb21lbnQodGhpcy5zZWxlY3RlZEZpbHRlcnMuZGF0ZVRvKTtcblxuXHRcdHN3aXRjaCAobW9kZSkge1xuXHRcdFx0Y2FzZSAnZXEnOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWVEYXRlLmlzVmFsaWQoKSA/IG9yZGVyRGF0ZS5pc1NhbWUodmFsdWVEYXRlLCAnZGF5JykgOiB0cnVlO1xuXHRcdFx0Y2FzZSAnZ3QnOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWVEYXRlLmlzVmFsaWQoKSA/IG9yZGVyRGF0ZS5pc0FmdGVyKHZhbHVlRGF0ZSwgJ2RheScpIDogdHJ1ZTtcblx0XHRcdGNhc2UgJ2x0Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlRGF0ZS5pc1ZhbGlkKCkgPyBvcmRlckRhdGUuaXNCZWZvcmUodmFsdWVEYXRlLCAnZGF5JykgOiB0cnVlO1xuXHRcdFx0Y2FzZSAnYmV0d2Vlbic6XG5cdFx0XHRcdGlmIChmcm9tRGF0ZS5pc1ZhbGlkKCkgJiYgdG9EYXRlLmlzVmFsaWQoKSkgcmV0dXJuIG9yZGVyRGF0ZS5pc1NhbWVPckFmdGVyKGZyb21EYXRlLCAnZGF5JykgJiYgb3JkZXJEYXRlLmlzU2FtZU9yQmVmb3JlKHRvRGF0ZSwgJ2RheScpO1xuXHRcdFx0XHRpZiAoZnJvbURhdGUuaXNWYWxpZCgpKSByZXR1cm4gb3JkZXJEYXRlLmlzU2FtZU9yQWZ0ZXIoZnJvbURhdGUsICdkYXknKTtcblx0XHRcdFx0aWYgKHRvRGF0ZS5pc1ZhbGlkKCkpIHJldHVybiBvcmRlckRhdGUuaXNTYW1lT3JCZWZvcmUodG9EYXRlLCAnZGF5Jyk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSB0b051bWJlck9yTnVsbCh2YWx1ZTogYW55KTogbnVtYmVyIHwgbnVsbCB7XG5cdFx0aWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcblx0XHRyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiBudWxsO1xuXHR9XG5cblx0cHJpdmF0ZSBidWlsZEZpbHRlck9wdGlvbnMob3JkZXJzOiBhbnlbXSk6IGFueSB7XG5cdFx0Y29uc3QgdW5pcXVlVmFsdWVzID0ge1xuXHRcdFx0b3JkZXJTdGF0ZTogbmV3IFNldDxzdHJpbmc+KCksXG5cdFx0XHRwYXltZW50U3RhdGU6IG5ldyBTZXQ8c3RyaW5nPigpLFxuXHRcdFx0c2hpcG1lbnRTdGF0ZTogbmV3IFNldDxzdHJpbmc+KCksXG5cdFx0XHRzaGlwbWVudE1ldGhvZDogbmV3IFNldDxzdHJpbmc+KClcblx0XHR9O1xuXG5cdFx0b3JkZXJzLmZvckVhY2gob3JkZXIgPT4ge1xuXHRcdFx0aWYgKG9yZGVyPy5vcmRlclN0YXRlKSB1bmlxdWVWYWx1ZXMub3JkZXJTdGF0ZS5hZGQob3JkZXIub3JkZXJTdGF0ZSk7XG5cdFx0XHRpZiAob3JkZXI/LnBheW1lbnRzPy5bMF0/LnN0YXRlKSB1bmlxdWVWYWx1ZXMucGF5bWVudFN0YXRlLmFkZChvcmRlci5wYXltZW50c1swXS5zdGF0ZSk7XG5cdFx0XHRpZiAob3JkZXI/LnNoaXBtZW50cz8uWzBdPy5zdGF0ZSkgdW5pcXVlVmFsdWVzLnNoaXBtZW50U3RhdGUuYWRkKG9yZGVyLnNoaXBtZW50c1swXS5zdGF0ZSk7XG5cdFx0XHRpZiAob3JkZXI/LnNoaXBtZW50cz8uWzBdPy5tZXRob2Q/Lm5hbWUpIHVuaXF1ZVZhbHVlcy5zaGlwbWVudE1ldGhvZC5hZGQob3JkZXIuc2hpcG1lbnRzWzBdLm1ldGhvZC5uYW1lKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRvcmRlclN0YXRlOiBBcnJheS5mcm9tKHVuaXF1ZVZhbHVlcy5vcmRlclN0YXRlKS5zb3J0KCksXG5cdFx0XHRwYXltZW50U3RhdGU6IEFycmF5LmZyb20odW5pcXVlVmFsdWVzLnBheW1lbnRTdGF0ZSkuc29ydCgpLFxuXHRcdFx0c2hpcG1lbnRTdGF0ZTogQXJyYXkuZnJvbSh1bmlxdWVWYWx1ZXMuc2hpcG1lbnRTdGF0ZSkuc29ydCgpLFxuXHRcdFx0c2hpcG1lbnRNZXRob2Q6IEFycmF5LmZyb20odW5pcXVlVmFsdWVzLnNoaXBtZW50TWV0aG9kKS5zb3J0KClcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvbiBmdW5jaW9uIHV0aWxpemFkYSBwYXJhIGRlc2VtcGF0ZS5cblx0ICogQHBhcmFtIGFPcmRlcnNcblx0ICogQHBhcmFtIG90aGVyT3JkZXJzXG5cdCAqIEBwYXJhbSBjb21wYXJhdG9yXG5cdCAqIEByZXR1cm5zXG5cdCAqL1xuXHRwcml2YXRlIHRpZUJyZWFrZXIoYU9yZGVyczogYW55LCBvdGhlck9yZGVyczogYW55LCBjb21wYXJhdG9yOiBhbnkpIHtcblx0XHRyZXR1cm4gYU9yZGVycy5udW1iZXIudG9Mb3dlckNhc2UoKSA8IG90aGVyT3JkZXJzLm51bWJlci50b0xvd2VyQ2FzZSgpID8gY29tcGFyYXRvclswXSA6IGNvbXBhcmF0b3JbMV1cblx0fVxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uIGNhbWJpYSBsb3MgdmFsb3JlcyBkZSBsYSB2YXJpYWJsZSBjdXJyZW50U29ydFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiBAcGFyYW0gYXNjXG5cdCAqL1xuXHRwcml2YXRlIHNldEN1cnJlbnRTb3J0KG5hbWU6IHN0cmluZywgYXNjOiBib29sZWFuKSB7XG5cdFx0dGhpcy5jdXJyZW50U29ydC5uYW1lID0gbmFtZTtcblx0XHR0aGlzLmN1cnJlbnRTb3J0LmFzYyA9IGFzY1xuXHR9XG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb24gcmV0b3JuYSBsYSBmdW5jaW9uIHF1ZSBzZSBkZWJlIHV0aWxpemFyIHBhcmEgZWwgc29ydCBkZWwgYXJyZWdsb1xuXHQgKiBAcGFyYW0gdmFsdWUgcGFyYW1ldHJvIHF1ZSBpbmRpY2EgZWwgdGlwbyBkZSBmdW5jaW9uIHF1ZSBkZWJlIHJldG9ybmFyXG5cdCAqIEByZXR1cm5zIGZ1bmNpb24gcGFyYSB1dGlsaXphciBlbiBsYSBidXNxdWVkYVxuXHQgKi9cblx0cHJpdmF0ZSBnZXRTb3J0RnVuY3Rpb24odmFsdWU6IGFueSk6IEZ1bmN0aW9uIHtcblx0XHRzd2l0Y2ggKHZhbHVlKSB7XG5cdFx0XHRjYXNlICdwYXltZW50U3RhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5zb3J0UGF5bWVudFN0YXRlLmJpbmQodGhpcyk7XG5cdFx0XHRjYXNlICdtZXRob2QnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5zb3J0U2hpcG1lbnRzLmJpbmQodGhpcyk7XG5cdFx0XHRjYXNlICdtZXRob2RTdGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLnNvcnRTaGlwbWVudHMuYmluZCh0aGlzKTtcblx0XHRcdGNhc2UgJ3RvdGFsJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuc29ydE51bWJlci5iaW5kKHRoaXMpO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuc29ydFRleHQuYmluZCh0aGlzKTtcblx0XHR9XG5cdH1cblxuXHQvKiBGdW5jaW9uZXMgcGFyYSBvcmRlcm5hciAqL1xuXHRwcml2YXRlIHNvcnRQYXltZW50U3RhdGUoYU9yZGVyczogYW55LCBvdGhlck9yZGVyczogYW55LCBkYXRhOiBhbnksIGNvbXBhcmF0b3I6IGFueSkge1xuXHRcdHJldHVybiAoYU9yZGVycy5wYXltZW50c1swXVtkYXRhLmF0dHJpYnV0ZV0gPT0gb3RoZXJPcmRlcnMucGF5bWVudHNbMF1bZGF0YS5hdHRyaWJ1dGVdKVxuXHRcdFx0PyB0aGlzLnRpZUJyZWFrZXIoYU9yZGVycywgb3RoZXJPcmRlcnMsIGNvbXBhcmF0b3IpXG5cdFx0XHQ6IFN0cmluZyhhT3JkZXJzLnBheW1lbnRzWzBdW2RhdGEuYXR0cmlidXRlXSkudG9Mb3dlckNhc2UoKSA8IFN0cmluZyhvdGhlck9yZGVycy5wYXltZW50c1swXVtkYXRhLmF0dHJpYnV0ZV0pLnRvTG93ZXJDYXNlKCkgPyBjb21wYXJhdG9yWzBdIDogY29tcGFyYXRvclsxXVxuXHR9XG5cblx0cHJpdmF0ZSBzb3J0U2hpcG1lbnRzKGFPcmRlcnM6IGFueSwgb3RoZXJPcmRlcnM6IGFueSwgZGF0YTogYW55LCBjb21wYXJhdG9yOiBhbnkpIHtcblx0XHRpZiAoZGF0YS5zdWJBdHRyaWJ1dGUpIHtcblx0XHRcdHJldHVybiAoYU9yZGVycy5zaGlwbWVudHNbMF1bZGF0YS5hdHRyaWJ1dGVdW2RhdGEuc3ViQXR0cmlidXRlXSA9PSBvdGhlck9yZGVycy5zaGlwbWVudHNbMF1bZGF0YS5hdHRyaWJ1dGVdW2RhdGEuc3ViQXR0cmlidXRlXSlcblx0XHRcdFx0PyB0aGlzLnRpZUJyZWFrZXIoYU9yZGVycywgb3RoZXJPcmRlcnMsIGNvbXBhcmF0b3IpXG5cdFx0XHRcdDogU3RyaW5nKGFPcmRlcnMuc2hpcG1lbnRzWzBdW2RhdGEuYXR0cmlidXRlXVtkYXRhLnN1YkF0dHJpYnV0ZV0pLnRvTG93ZXJDYXNlKCkgPCBTdHJpbmcob3RoZXJPcmRlcnMuc2hpcG1lbnRzWzBdW2RhdGEuYXR0cmlidXRlXVtkYXRhLnN1YkF0dHJpYnV0ZV0pLnRvTG93ZXJDYXNlKCkgPyBjb21wYXJhdG9yWzBdIDogY29tcGFyYXRvclsxXVxuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHJldHVybiAoYU9yZGVycy5zaGlwbWVudHNbMF1bZGF0YS5hdHRyaWJ1dGVdID09IG90aGVyT3JkZXJzLnNoaXBtZW50c1swXVtkYXRhLmF0dHJpYnV0ZV0pXG5cdFx0XHRcdD8gdGhpcy50aWVCcmVha2VyKGFPcmRlcnMsIG90aGVyT3JkZXJzLCBjb21wYXJhdG9yKVxuXHRcdFx0XHQ6IFN0cmluZyhhT3JkZXJzLnNoaXBtZW50c1swXVtkYXRhLmF0dHJpYnV0ZV0pLnRvTG93ZXJDYXNlKCkgPCBTdHJpbmcob3RoZXJPcmRlcnMuc2hpcG1lbnRzWzBdW2RhdGEuYXR0cmlidXRlXSkudG9Mb3dlckNhc2UoKSA/IGNvbXBhcmF0b3JbMF0gOiBjb21wYXJhdG9yWzFdXG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzb3J0TnVtYmVyKGFPcmRlcnM6IGFueSwgb3RoZXJPcmRlcnM6IGFueSwgZGF0YTogYW55LCBjb21wYXJhdG9yOiBhbnkpIHtcblx0XHRjb25zdCB2YWx1ZUEgPSBkYXRhLnN1YkF0dHJpYnV0ZSA/IGFPcmRlcnM/LltkYXRhLmF0dHJpYnV0ZV0/LltkYXRhLnN1YkF0dHJpYnV0ZV0gOiBhT3JkZXJzPy5bZGF0YS5hdHRyaWJ1dGVdO1xuXHRcdGNvbnN0IHZhbHVlQiA9IGRhdGEuc3ViQXR0cmlidXRlID8gb3RoZXJPcmRlcnM/LltkYXRhLmF0dHJpYnV0ZV0/LltkYXRhLnN1YkF0dHJpYnV0ZV0gOiBvdGhlck9yZGVycz8uW2RhdGEuYXR0cmlidXRlXTtcblx0XHRyZXR1cm4gdmFsdWVBIDwgdmFsdWVCID8gY29tcGFyYXRvclswXSA6IGNvbXBhcmF0b3JbMV1cblx0fVxuXG5cdHByaXZhdGUgc29ydFRleHQoYU9yZGVyczogYW55LCBvdGhlck9yZGVyczogYW55LCBkYXRhOiBhbnksIGNvbXBhcmF0b3I6IGFueSkge1xuXHRcdHJldHVybiAoYU9yZGVyc1tkYXRhLmF0dHJpYnV0ZV0gPT0gb3RoZXJPcmRlcnNbZGF0YS5hdHRyaWJ1dGVdKVxuXHRcdFx0PyBhT3JkZXJzLm51bWJlci50b0xvd2VyQ2FzZSgpIDwgb3RoZXJPcmRlcnMubnVtYmVyLnRvTG93ZXJDYXNlKCkgPyBjb21wYXJhdG9yWzBdIDogY29tcGFyYXRvclsxXVxuXHRcdFx0OiBTdHJpbmcoYU9yZGVyc1tkYXRhLmF0dHJpYnV0ZV0pLnRvTG93ZXJDYXNlKCkgPCBTdHJpbmcob3RoZXJPcmRlcnNbZGF0YS5hdHRyaWJ1dGVdKS50b0xvd2VyQ2FzZSgpID8gY29tcGFyYXRvclswXSA6IGNvbXBhcmF0b3JbMV1cblx0fVxuXG5cdHRvRGF0ZShkYXRlOmFueSwgZm9ybWF0OmFueSl7IHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KCFmb3JtYXQgJiYgJ0REL01NL1lZWVksIGg6bW06c3MgYScgfHwgZm9ybWF0KX1cblxuXHRpc0N1cnJlbnRTb3J0KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmN1cnJlbnRTb3J0Lm5hbWUgPT09IG5hbWU7XG5cdH1cblxuXHRnZXRTb3J0RGlyZWN0aW9uKG5hbWU6IHN0cmluZyk6ICdub25lJyB8ICdhc2MnIHwgJ2Rlc2MnIHtcblx0XHRpZiAoIXRoaXMuaXNDdXJyZW50U29ydChuYW1lKSkge1xuXHRcdFx0cmV0dXJuICdub25lJztcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY3VycmVudFNvcnQuYXNjID8gJ2FzYycgOiAnZGVzYyc7XG5cdH1cblxuXHRnZXRBcmlhU29ydChuYW1lOiBzdHJpbmcpOiAnbm9uZScgfCAnYXNjZW5kaW5nJyB8ICdkZXNjZW5kaW5nJyB7XG5cdFx0Y29uc3QgZGlyZWN0aW9uID0gdGhpcy5nZXRTb3J0RGlyZWN0aW9uKG5hbWUpO1xuXHRcdGlmIChkaXJlY3Rpb24gPT09ICdhc2MnKSB7XG5cdFx0XHRyZXR1cm4gJ2FzY2VuZGluZyc7XG5cdFx0fVxuXHRcdGlmIChkaXJlY3Rpb24gPT09ICdkZXNjJykge1xuXHRcdFx0cmV0dXJuICdkZXNjZW5kaW5nJztcblx0XHR9XG5cdFx0cmV0dXJuICdub25lJztcblx0fVxuXG5cdGdldENvbHVtbkNsYXNzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuaGFzT3JkZXJTdGF0ZUNvbHVtbiA/ICdjb2wtbGcgY29sLTEyJyA6ICdjb2wtbGctMiBjb2wtMTInO1xuXHR9XG5cblx0Z29Ub09yZGVyKG9yZGVyOmFueSl7XG4gICAgICAgIHRoaXMuX29yZGVyc1NlcnZpY2Uuc2V0U2VsZWN0ZWRPcmRlcihvcmRlcik7XG4gICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5VXJsKChgYWNjb3VudC9vcmRlcnMvJHtvcmRlci5udW1iZXJ9YCkpXG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiIGlkPVwib3JkZXJzRWNDb21wb25lbnRcIj5cbiAgICBAaWYoIWxvYWRpbmcpe1xuICAgIDxzZWN0aW9uIGlkPVwib3JkZXJzXCIgY2xhc3M9XCJ3LTEwMFwiPlxuICAgICAgICBAaWYoIXByaWNlVmlzaWJpbGl0eS5oaWRlUHJpY2VzKCkpe1xuICAgICAgICBAaWYoYWxsT3JkZXJzICYmIGFsbE9yZGVycy5sZW5ndGgpe1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtbGctbm9uZSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1zbSB3LTEwMCBmaWx0ZXJzLXRvZ2dsZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlTW9iaWxlRmlsdGVycygpXCI+XG4gICAgICAgICAgICAgICAgICAgIEZpbHRyb3Mge3sgc2hvd01vYmlsZUZpbHRlcnMgPyAn4payJyA6ICfilrwnIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZmlsdGVycy1yb3cgZ3ktMyBtYi0zXCIgW2NsYXNzLm1vYmlsZS1oaWRkZW5dPVwiIXNob3dNb2JpbGVGaWx0ZXJzXCI+XG4gICAgICAgICAgICAgICAgQGlmKGhhc09yZGVyU3RhdGVDb2x1bW4pe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHhsLTIgY29sLXhsLTMgY29sLWxnLTQgY29sLW1kLTYgY29sLTEyIGZpbHRlci1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmlsdGVyLWxhYmVsXCI+e3sgJ29yZGVyLXN0YXRlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGaWx0ZXJzLm9yZGVyU3RhdGVcIiAoY2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj57eyAnYWxsJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvcih2YWx1ZSBvZiBmaWx0ZXJPcHRpb25zLm9yZGVyU3RhdGU7IHRyYWNrICRpbmRleCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwidmFsdWVcIj57eyB2YWx1ZSB8IHRyYW5zbGF0ZSB8IHRpdGxlY2FzZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14eGwtMiBjb2wteGwtMyBjb2wtbGctNCBjb2wtbWQtNiBjb2wtMTIgZmlsdGVyLWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWx0ZXItbGFiZWxcIj57eyAncGF5bWVudC1zdGF0ZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVycy5wYXltZW50U3RhdGVcIiAoY2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj57eyAnYWxsJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvcih2YWx1ZSBvZiBmaWx0ZXJPcHRpb25zLnBheW1lbnRTdGF0ZTsgdHJhY2sgJGluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJ2YWx1ZVwiPnt7IHZhbHVlIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHhsLTIgY29sLXhsLTMgY29sLWxnLTQgY29sLW1kLTYgY29sLTEyIGZpbHRlci1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmlsdGVyLWxhYmVsXCI+e3sgJ3NoaXBtZW50LXN0YXRlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGaWx0ZXJzLnNoaXBtZW50U3RhdGVcIiAoY2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj57eyAnYWxsJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvcih2YWx1ZSBvZiBmaWx0ZXJPcHRpb25zLnNoaXBtZW50U3RhdGU7IHRyYWNrICRpbmRleCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwidmFsdWVcIj57eyB2YWx1ZSB8IHRyYW5zbGF0ZSB8IHRpdGxlY2FzZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXh4bC0yIGNvbC14bC0zIGNvbC1sZy00IGNvbC1tZC02IGNvbC0xMiBmaWx0ZXItY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpbHRlci1sYWJlbFwiPnt7ICdzaGlwbWVudC1tZXRob2QnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpbHRlcnMuc2hpcG1lbnRNZXRob2RcIiAoY2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj57eyAnYWxsJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvcih2YWx1ZSBvZiBmaWx0ZXJPcHRpb25zLnNoaXBtZW50TWV0aG9kOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInZhbHVlXCI+e3sgdmFsdWUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14eGwtMiBjb2wteGwtMyBjb2wtbGctNCBjb2wtbWQtNiBjb2wtMTIgZmlsdGVyLWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWx0ZXItbGFiZWxcIj57eyAnZGF0ZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVycy5kYXRlTW9kZVwiIChjaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPnt7ICdhbGwnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yKG9wdGlvbiBvZiBkYXRlTW9kZU9wdGlvbnM7IHRyYWNrICRpbmRleCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+e3sgb3B0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICBAaWYoc2VsZWN0ZWRGaWx0ZXJzLmRhdGVNb2RlID09PSAnYmV0d2Vlbicpe1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMSBtdC0xIGZpbHRlci1yYW5nZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVycy5kYXRlRnJvbVwiIChjaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGaWx0ZXJzLmRhdGVUb1wiIChjaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYoc2VsZWN0ZWRGaWx0ZXJzLmRhdGVNb2RlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSBtdC0xXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpbHRlcnMuZGF0ZVZhbHVlXCIgKGNoYW5nZSk9XCJvbkZpbHRlckNoYW5nZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXh4bC0yIGNvbC14bC0zIGNvbC1sZy00IGNvbC1tZC02IGNvbC0xMiBmaWx0ZXItY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpbHRlci1sYWJlbFwiPnt7ICd0b3RhbCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVycy50b3RhbE1vZGVcIiAoY2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj57eyAnYWxsJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvcihvcHRpb24gb2YgdG90YWxNb2RlT3B0aW9uczsgdHJhY2sgJGluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubGFiZWxLZXkgfCB0cmFuc2xhdGUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIEBpZihzZWxlY3RlZEZpbHRlcnMudG90YWxNb2RlID09PSAnYmV0d2Vlbicpe1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMSBtdC0xIGZpbHRlci1yYW5nZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIHBsYWNlaG9sZGVyPVwiTWluXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpbHRlcnMudG90YWxNaW5cIiAoaW5wdXQpPVwib25GaWx0ZXJDaGFuZ2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgcGxhY2Vob2xkZXI9XCJNYXhcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVycy50b3RhbE1heFwiIChpbnB1dCk9XCJvbkZpbHRlckNoYW5nZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZihzZWxlY3RlZEZpbHRlcnMudG90YWxNb2RlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIG10LTFcIiBwbGFjZWhvbGRlcj1cIlZhbG9yXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpbHRlcnMudG90YWxWYWx1ZVwiIChpbnB1dCk9XCJvbkZpbHRlckNoYW5nZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXh4bC0yIGNvbC14bC0zIGNvbC1sZy00IGNvbC1tZC02IGNvbC0xMiBkLWZsZXggYWxpZ24taXRlbXMtZW5kIGZpbHRlci1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1zbSB3LTEwMFwiIChjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2NsZWFyLWZpbHRlcnMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYob3JkZXJzICYmIG9yZGVycy5sZW5ndGgpe1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0xIGJvcmRlci1ib3R0b20gZC1ub25lIGQtbGctZmxleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0IHNvcnQtdHJpZ2dlciBteS0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcHBsaWVkXT1cImlzQ3VycmVudFNvcnQoJ251bWJlcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hc2NdPVwiZ2V0U29ydERpcmVjdGlvbignbnVtYmVyJykgPT09ICdhc2MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1kZXNjXT1cImdldFNvcnREaXJlY3Rpb24oJ251bWJlcicpID09PSAnZGVzYydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cImdldEFyaWFTb3J0KCdudW1iZXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic29ydE9yZGVycygnbnVtYmVyJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdvcmRlcicgfCB0cmFuc2xhdGUgfX06XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0IHNvcnQtdHJpZ2dlciBteS0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcHBsaWVkXT1cImlzQ3VycmVudFNvcnQoJ2RhdGUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYXNjXT1cImdldFNvcnREaXJlY3Rpb24oJ2RhdGUnKSA9PT0gJ2FzYydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWRlc2NdPVwiZ2V0U29ydERpcmVjdGlvbignZGF0ZScpID09PSAnZGVzYydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cImdldEFyaWFTb3J0KCdkYXRlJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRPcmRlcnMoJ2RhdGUnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2RhdGUnIHwgdHJhbnNsYXRlIH19OlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBAaWYoaGFzT3JkZXJTdGF0ZUNvbHVtbil7XG4gICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3MoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3Qgc29ydC10cmlnZ2VyIG15LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFwcGxpZWRdPVwiaXNDdXJyZW50U29ydCgnb3JkZXJTdGF0ZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hc2NdPVwiZ2V0U29ydERpcmVjdGlvbignb3JkZXJTdGF0ZScpID09PSAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtZGVzY109XCJnZXRTb3J0RGlyZWN0aW9uKCdvcmRlclN0YXRlJykgPT09ICdkZXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0QXJpYVNvcnQoJ29yZGVyU3RhdGUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic29ydE9yZGVycygnb3JkZXJTdGF0ZScpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnb3JkZXItc3RhdGUnIHwgdHJhbnNsYXRlIH19OlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3MoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3Qgc29ydC10cmlnZ2VyIG15LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFwcGxpZWRdPVwiaXNDdXJyZW50U29ydCgncGF5bWVudFN0YXRlJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFzY109XCJnZXRTb3J0RGlyZWN0aW9uKCdwYXltZW50U3RhdGUnKSA9PT0gJ2FzYydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWRlc2NdPVwiZ2V0U29ydERpcmVjdGlvbigncGF5bWVudFN0YXRlJykgPT09ICdkZXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0QXJpYVNvcnQoJ3BheW1lbnRTdGF0ZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzb3J0T3JkZXJzKCdwYXltZW50U3RhdGUnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BheW1lbnQtc3RhdGUnIHwgdHJhbnNsYXRlIH19OlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJnZXRDb2x1bW5DbGFzcygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdCBzb3J0LXRyaWdnZXIgbXktMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXBwbGllZF09XCJpc0N1cnJlbnRTb3J0KCdtZXRob2RTdGF0ZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hc2NdPVwiZ2V0U29ydERpcmVjdGlvbignbWV0aG9kU3RhdGUnKSA9PT0gJ2FzYydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWRlc2NdPVwiZ2V0U29ydERpcmVjdGlvbignbWV0aG9kU3RhdGUnKSA9PT0gJ2Rlc2MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc29ydF09XCJnZXRBcmlhU29ydCgnbWV0aG9kU3RhdGUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic29ydE9yZGVycygnbWV0aG9kU3RhdGUnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3NoaXBtZW50LXN0YXRlJyB8IHRyYW5zbGF0ZSB9fTpcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3MoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3Qgc29ydC10cmlnZ2VyIG15LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFwcGxpZWRdPVwiaXNDdXJyZW50U29ydCgnbWV0aG9kJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFzY109XCJnZXRTb3J0RGlyZWN0aW9uKCdtZXRob2QnKSA9PT0gJ2FzYydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWRlc2NdPVwiZ2V0U29ydERpcmVjdGlvbignbWV0aG9kJykgPT09ICdkZXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0QXJpYVNvcnQoJ21ldGhvZCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzb3J0T3JkZXJzKCdtZXRob2QnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3NoaXBtZW50LW1ldGhvZCcgfCB0cmFuc2xhdGUgfX06XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0IHNvcnQtdHJpZ2dlciBteS0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcHBsaWVkXT1cImlzQ3VycmVudFNvcnQoJ3RvdGFsJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFzY109XCJnZXRTb3J0RGlyZWN0aW9uKCd0b3RhbCcpID09PSAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtZGVzY109XCJnZXRTb3J0RGlyZWN0aW9uKCd0b3RhbCcpID09PSAnZGVzYydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cImdldEFyaWFTb3J0KCd0b3RhbCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzb3J0T3JkZXJzKCd0b3RhbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAndG90YWwnIHwgdHJhbnNsYXRlIH19OlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGZvcihvcmRlciBvZiBvcmRlcnM7IHRyYWNrICRpbmRleCl7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBpdGVtIGJvcmRlci1ib3R0b20gcHktMiBkLW5vbmUgZC1sZy1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZnctYm9sZCBvcmRlci1udW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcmRlci5udW1iZXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicHJpY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b0RhdGUob3JkZXIuY2hlY2tvdXRDb21wbGV0ZWRBdCwgJ0REL01NL1lZWVknKSB8IHRyYW5zbGF0ZSB9fTxicj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b0RhdGUob3JkZXIuY2hlY2tvdXRDb21wbGV0ZWRBdCwgJ2g6bW06c3MgYScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBAaWYoaGFzT3JkZXJTdGF0ZUNvbHVtbil7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicHJpY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcmRlci5vcmRlclN0YXRlID8gKG9yZGVyLm9yZGVyU3RhdGUgfCB0cmFuc2xhdGUgfCB0aXRsZWNhc2UpIDogJy0nIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihvcmRlci5wYXltZW50cyAmJiBvcmRlci5wYXltZW50cy5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInByaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZGVyLnBheW1lbnRzWzBdLnN0YXRlIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3MoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwcmljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZGVyLnNoaXBtZW50c1swXS5zdGF0ZSB8IHRyYW5zbGF0ZSB8IHRpdGxlY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKG9yZGVyLnRyYWNraW5nKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJvcmRlci50cmFja2luZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFyayBidG5Mb2dvdXQgcHgtMyBweS0xIGZvbnQtc2l6ZS0xMCB3LWF1dG8gYnRuLXNtXCI+VmVyIHNlZ3VpbWllbnRvPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3MoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwcmljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZGVyLnNoaXBtZW50c1swXS5tZXRob2QubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3MoKSArICcgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBvcmRlci10b3RhbC1hY3Rpb25zJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHByaWNlVmlzaWJpbGl0eS5jYW5TaG93UHJpY2VzKCkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZnctYm9sZCB0ZXh0LW5vd3JhcCBvcmRlci10b3RhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAob3JkZXIudG90YWxzLnRvdGFsKSB8IGVjQ3VycmVuY3lTeW1ib2wgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHB4LTAgYnRkZXRhbGxlIG9yZGVyLWRldGFpbC1idG5cIiAoY2xpY2spPVwiZ29Ub09yZGVyKG9yZGVyKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1ZlciBkZXRhbGxlIGRlbCBwZWRpZG8gJyArIG9yZGVyLm51bWJlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZXllXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcmRlci1tb2JpbGUtY2FyZCBkLWxnLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLW1vYmlsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JkZXItbW9iaWxlLWxhYmVsXCI+e3sgJ29yZGVyJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JkZXItbW9iaWxlLXZhbHVlIGZ3LWJvbGRcIj57eyBvcmRlci5udW1iZXIgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3JkZXItbW9iaWxlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmRlci1tb2JpbGUtbGFiZWxcIj57eyAnZGF0ZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZGVyLW1vYmlsZS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRvRGF0ZShvcmRlci5jaGVja291dENvbXBsZXRlZEF0LCAnREQvTU0vWVlZWScpIHwgdHJhbnNsYXRlIH19IHt7IHRvRGF0ZShvcmRlci5jaGVja291dENvbXBsZXRlZEF0LCAnaDptbTpzcyBhJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZihoYXNPcmRlclN0YXRlQ29sdW1uKXtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLW1vYmlsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JkZXItbW9iaWxlLWxhYmVsXCI+e3sgJ29yZGVyLXN0YXRlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JkZXItbW9iaWxlLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3JkZXIub3JkZXJTdGF0ZSA/IChvcmRlci5vcmRlclN0YXRlIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlKSA6ICctJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3JkZXItbW9iaWxlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmRlci1tb2JpbGUtbGFiZWxcIj57eyAncGF5bWVudC1zdGF0ZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZGVyLW1vYmlsZS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZGVyLnBheW1lbnRzICYmIG9yZGVyLnBheW1lbnRzLmxlbmd0aCA+IDAgPyAob3JkZXIucGF5bWVudHNbMF0uc3RhdGUgfCB0cmFuc2xhdGUgfCB0aXRsZWNhc2UpIDogJy0nIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3JkZXItbW9iaWxlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmRlci1tb2JpbGUtbGFiZWxcIj57eyAnc2hpcG1lbnQtc3RhdGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmRlci1tb2JpbGUtdmFsdWVcIj57eyBvcmRlci5zaGlwbWVudHNbMF0uc3RhdGUgfCB0cmFuc2xhdGUgfCB0aXRsZWNhc2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3JkZXItbW9iaWxlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmRlci1tb2JpbGUtbGFiZWxcIj57eyAnc2hpcG1lbnQtbWV0aG9kJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JkZXItbW9iaWxlLXZhbHVlXCI+e3sgb3JkZXIuc2hpcG1lbnRzWzBdLm1ldGhvZC5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLW1vYmlsZS1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYocHJpY2VWaXNpYmlsaXR5LmNhblNob3dQcmljZXMoKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmdy1ib2xkIHRleHQtbm93cmFwIG9yZGVyLXRvdGFsIG1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgKG9yZGVyLnRvdGFscy50b3RhbCkgfCBlY0N1cnJlbmN5U3ltYm9sIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBweC0wIGJ0ZGV0YWxsZSBvcmRlci1kZXRhaWwtYnRuXCIgKGNsaWNrKT1cImdvVG9PcmRlcihvcmRlcilcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidWZXIgZGV0YWxsZSBkZWwgcGVkaWRvICcgKyBvcmRlci5udW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWV5ZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1AZWxzZSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgaC01MFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGg1Pnt7ICduby1vcmRlcnMnIHwgdHJhbnNsYXRlIH19PC9oNT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICB9QGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGgtNTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNT57eyAnbm8tb3JkZXJzJyB8IHRyYW5zbGF0ZSB9fTwvaDU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB9XG4gICAgPC9zZWN0aW9uPlxuICAgIH1AZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBoLTUwIHB5LTVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWxvYWRpbmctZnVsbC1lYz48L2FwcC1sb2FkaW5nLWZ1bGwtZWM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZXJyb3JWaWV3PlxuICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBoLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxoND57eyAnb3JkZXJzLWVycm9yJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
365
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXJzLWxpc3QtZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvYWNjb3VudC1lYy9vcmRlcnMtbGlzdC1lYy9vcmRlcnMtbGlzdC1lYy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy9hY2NvdW50LWVjL29yZGVycy1saXN0LWVjL29yZGVycy1saXN0LWVjLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDdkYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7O0FBU3hELE1BQU0sT0FBTyxxQkFBcUI7SUFFekIsY0FBYyxHQUFrQixNQUFNLENBQUMsYUFBYSxD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QUksV0FDUCxDQUFDLHNCQUFzQixFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3JkZXJzU2VydmljZSwgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9lYy1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBQcmljZVZpc2liaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZWMtc2VydmljZXMvcHJpY2UtdmlzaWJpbGl0eS5zZXJ2aWNlJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTG9hZGluZ0Z1bGxFY0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3dpZGdldHMtZWMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBUaXRsZUNhc2VQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEVjQ3VycmVuY3lTeW1ib2xQaXBlIH0gZnJvbSAnLi4vLi4vLi4vZWMtcGlwZSc7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ2FwcC1vcmRlcnMtZWMnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRpbXBvcnRzOiBbTG9hZGluZ0Z1bGxFY0NvbXBvbmVudCwgVHJhbnNsYXRlTW9kdWxlLCBUaXRsZUNhc2VQaXBlLCBFY0N1cnJlbmN5U3ltYm9sUGlwZSwgRm9ybXNNb2R1bGVdLFxuXHR0ZW1wbGF0ZVVybDogJy4vb3JkZXJzLWxpc3QtZWMuY29tcG9uZW50Lmh0bWwnLFxuXHRzdHlsZVVybDogJy4vb3JkZXJzLWxpc3QtZWMuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIE9yZGVyc0xpc3RFY0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cblx0cHJpdmF0ZSBfb3JkZXJzU2VydmljZTogT3JkZXJzU2VydmljZSA9IGluamVjdChPcmRlcnNTZXJ2aWNlKTtcblx0cHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgICBwcml2YXRlIF9jYXJ0U2VydmljZTogQ2FydFNlcnZpY2UgPSBpbmplY3QoQ2FydFNlcnZpY2UpO1xuXHRwdWJsaWMgcmVhZG9ubHkgcHJpY2VWaXNpYmlsaXR5ID0gaW5qZWN0KFByaWNlVmlzaWJpbGl0eVNlcnZpY2UpO1xuXG5cdHB1YmxpYyBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cdHB1YmxpYyBhbGxPcmRlcnM6IGFueVtdID0gW107XG5cdHB1YmxpYyBvcmRlcnM6IGFueVtdID0gW107XG5cdHB1YmxpYyBoYXNPcmRlclN0YXRlQ29sdW1uOiBib29sZWFuID0gZmFsc2U7XG5cdHB1YmxpYyBmaWx0ZXJPcHRpb25zOiBhbnkgPSB7XG5cdFx0b3JkZXJTdGF0ZTogW10sXG5cdFx0cGF5bWVudFN0YXRlOiBbXSxcblx0XHRzaGlwbWVudFN0YXRlOiBbXSxcblx0XHRzaGlwbWVudE1ldGhvZDogW11cblx0fTtcblx0cHVibGljIHNlbGVjdGVkRmlsdGVyczogYW55ID0ge1xuXHRcdG9yZGVyU3RhdGU6ICcnLFxuXHRcdHBheW1lbnRTdGF0ZTogJycsXG5cdFx0c2hpcG1lbnRTdGF0ZTogJycsXG5cdFx0c2hpcG1lbnRNZXRob2Q6ICcnLFxuXHRcdGRhdGVNb2RlOiAnJyxcblx0XHRkYXRlVmFsdWU6ICcnLFxuXHRcdGRhdGVGcm9tOiAnJyxcblx0XHRkYXRlVG86ICcnLFxuXHRcdHRvdGFsTW9kZTogJycsXG5cdFx0dG90YWxWYWx1ZTogbnVsbCxcblx0XHR0b3RhbE1pbjogbnVsbCxcblx0XHR0b3RhbE1heDogbnVsbFxuXHR9O1xuXHRwdWJsaWMgZGF0ZU1vZGVPcHRpb25zID0gW1xuXHRcdHsgdmFsdWU6ICdlcScsIGxhYmVsS2V5OiAnZmlsdGVyLWV4YWN0LWRhdGUnIH0sXG5cdFx0eyB2YWx1ZTogJ2d0JywgbGFiZWxLZXk6ICdmaWx0ZXItYWZ0ZXItZGF0ZScgfSxcblx0XHR7IHZhbHVlOiAnbHQnLCBsYWJlbEtleTogJ2ZpbHRlci1iZWZvcmUtZGF0ZScgfSxcblx0XHR7IHZhbHVlOiAnYmV0d2VlbicsIGxhYmVsS2V5OiAnZmlsdGVyLXJhbmdlJyB9XG5cdF07XG5cdHB1YmxpYyB0b3RhbE1vZGVPcHRpb25zID0gW1xuXHRcdHsgdmFsdWU6ICdlcScsIGxhYmVsS2V5OiAnZmlsdGVyLWVxdWFsLXRvJyB9LFxuXHRcdHsgdmFsdWU6ICdndCcsIGxhYmVsS2V5OiAnZmlsdGVyLWdyZWF0ZXItdGhhbicgfSxcblx0XHR7IHZhbHVlOiAnbHQnLCBsYWJlbEtleTogJ2ZpbHRlci1sZXNzLXRoYW4nIH0sXG5cdFx0eyB2YWx1ZTogJ2JldHdlZW4nLCBsYWJlbEtleTogJ2ZpbHRlci1yYW5nZScgfVxuXHRdO1xuXHRwdWJsaWMgc2hvd01vYmlsZUZpbHRlcnMgPSBmYWxzZTtcblx0cHJpdmF0ZSBlcnJvcjogc3RyaW5nID0gXCJcIjtcblx0cHVibGljIHNvcnRWYWx1ZTogYW55O1xuICAgIHB1YmxpYyBzaG93UHJpY2U6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHB1YmxpYyBjcmVkaXRBbW91bnRDb25maWd1cmVkOiBib29sZWFuID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvbiBuYW1lIC0+IG5vbWJyZSBkZSBjbGF2ZSBkZSB2YWx1ZXNUb1NvcnQ7IGFzYyAtPiB0cnVlOiBhc2NlbmRlbnRlLCBmYWxzZTogZGVzY2VuZGVudGVcblx0ICovXG5cdHB1YmxpYyBjdXJyZW50U29ydDogYW55ID0geyBuYW1lOiAnJywgYXNjOiB0cnVlIH1cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvbiB0cnVlIC0+IG9yZGVuYSBkZSBmb3JtYSBhc2NlbmRlbnRlIHwgZmFsc2UgLT4gb3JkZW5hIGRlIGZvcm1hIGRlY3JlY2llbnRlXG5cdCAqL1xuXHRwdWJsaWMgdmFsdWVzVG9Tb3J0OiBhbnkgPSB7XG5cdFx0bnVtYmVyOiB7IGFzYzogdHJ1ZSwgYXR0cmlidXRlOiAnbnVtYmVyJyB9LFxuXHRcdG9yZGVyU3RhdGU6IHsgYXNjOiB0cnVlLCBhdHRyaWJ1dGU6ICdvcmRlclN0YXRlJyB9LFxuXHRcdHBheW1lbnRTdGF0ZTogeyBhc2M6IHRydWUsIGF0dHJpYnV0ZTogJ3N0YXRlJyB9LFxuXHRcdG1ldGhvZDogeyBhc2M6IHRydWUsIGF0dHJpYnV0ZTogJ21ldGhvZCcsIHN1YkF0dHJpYnV0ZTogJ25hbWUnIH0sXG5cdFx0bWV0aG9kU3RhdGU6IHsgYXNjOiB0cnVlLCBhdHRyaWJ1dGU6ICdzdGF0ZScgfSxcblx0XHRkYXRlOiB7IGFzYzogdHJ1ZSwgYXR0cmlidXRlOiAnY2hlY2tvdXRDb21wbGV0ZWRBdCcgfSxcblx0XHR0b3RhbDogeyBhc2M6IHRydWUsIGF0dHJpYnV0ZTogJ3RvdGFscycsIHN1YkF0dHJpYnV0ZTogJ3RvdGFsJyB9XG5cdH07XG5cblx0bmdPbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5sb2FkaW5nID0gdHJ1ZTtcblx0XHR0aGlzLl9vcmRlcnNTZXJ2aWNlLnVwZGF0ZU9yZGVycygpO1xuXHRcdHRoaXMuX29yZGVyc1NlcnZpY2Uub3JkZXJzJC5waXBlKGZpbHRlcihvciA9PiBvcikpLnN1YnNjcmliZSh7XG5cdFx0XHRuZXh0OiAob3JkZXJzKSA9PiB7XG5cdFx0XHRcdHRoaXMuYWxsT3JkZXJzID0gdGhpcy5zb3J0ZWRCeU5ld2VzdChbLi4uKG9yZGVycyB8fCBbXSldKSB8fCBbXTtcblx0XHRcdFx0dGhpcy5oYXNPcmRlclN0YXRlQ29sdW1uID0gdGhpcy5hbGxPcmRlcnMuc29tZShvcmRlciA9PiAhIW9yZGVyLm9yZGVyU3RhdGUpO1xuXHRcdFx0XHR0aGlzLmZpbHRlck9wdGlvbnMgPSB0aGlzLmJ1aWxkRmlsdGVyT3B0aW9ucyh0aGlzLmFsbE9yZGVycyk7XG5cdFx0XHRcdHRoaXMub3JkZXJzID0gWy4uLnRoaXMuYWxsT3JkZXJzXTtcblx0XHRcdFx0dGhpcy5sb2FkaW5nID0gZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHRlcnJvcjogKGVycm9yKSA9PiB7XG5cdFx0XHRcdHRoaXMubG9hZGluZyA9IGZhbHNlXG5cdFx0XHRcdHRoaXMuZXJyb3IgPSAnb3JkZXJzLWVycm9yJztcblx0XHRcdH1cblx0XHR9KVxuXG4gICAgICAgIHRoaXMuX2NhcnRTZXJ2aWNlLmNyZWRpdEFtb3VudCQuc3Vic2NyaWJlKGFtb3VudCA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWRpdEFtb3VudENvbmZpZ3VyZWQgPSBhbW91bnQgIT09IG51bGw7XG4gICAgICAgIH0pO1xuXHR9XG5cblx0c29ydGVkQnlOZXdlc3Qob3JkZXJzOiBhbnkpIHtcblx0XHRyZXR1cm4gb3JkZXJzICYmIG9yZGVycy5sZW5ndGggJiYgb3JkZXJzLnNvcnQoKGFuT3JkZXI6IGFueSwgb3RoZXJPcmRlcjogYW55KSA9PiBhbk9yZGVyLm51bWJlciA+IG90aGVyT3JkZXIubnVtYmVyID8gLTEgOiAxKVxuXHR9XG5cblx0LyoqXG5cdCogQGRlc2NyaXB0aW9uIE9yZGVuYSBsYSBsaXN0YSBkZSBvcmRlbmVzXG5cdCogQHBhcmFtIHZhbHVlIHJlY2liZSB1bmEgdmFsb3IgcXVlIGRlYmUgY29pbmNpZGlyIGNvbiBsYXMgY2xhdmVzIGRlIGxhIHZhcmlhYmxlIHZhbHVlc1RvU29ydFxuXHQqL1xuXHRzb3J0T3JkZXJzKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLnNvcnRWYWx1ZSA9IHZhbHVlXG5cdFx0dGhpcy5zZXRDdXJyZW50U29ydCh0aGlzLnNvcnRWYWx1ZSwgdGhpcy52YWx1ZXNUb1NvcnRbdGhpcy5zb3J0VmFsdWVdLmFzYylcblx0XHRjb25zdCBjb21wYXJhdG9yID1cblx0XHRcdCh0aGlzLnZhbHVlc1RvU29ydFt0aGlzLnNvcnRWYWx1ZV0uYXNjKVxuXHRcdFx0XHQ/IFstMSwgMV1cblx0XHRcdFx0OiBbMSwgLTFdXG5cdFx0dGhpcy52YWx1ZXNUb1NvcnRbdGhpcy5zb3J0VmFsdWVdLmFzYyA9ICF0aGlzLnZhbHVlc1RvU29ydFt0aGlzLnNvcnRWYWx1ZV0uYXNjXG5cdFx0XG5cdFx0XHRsZXQgdHlwZVZhbHVlXG5cdFx0aWYgKHRoaXMub3JkZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdHR5cGVWYWx1ZSA9IHR5cGVvZiAodGhpcy5vcmRlcnNbMF0pXG5cdFx0fVxuXHRcdGxldCBzb3J0RnVuY3Rpb24gPSB0aGlzLmdldFNvcnRGdW5jdGlvbih0aGlzLnNvcnRWYWx1ZSlcblx0XHR0aGlzLm9yZGVycyA9XG5cdFx0XHR0aGlzLnNvcnRWYWx1ZVxuXHRcdFx0XHQ/IHRoaXMub3JkZXJzLnNvcnQoKGFPcmRlcnMsIG90aGVyT3JkZXJzKSA9PiBzb3J0RnVuY3Rpb24oYU9yZGVycywgb3RoZXJPcmRlcnMsIHRoaXMudmFsdWVzVG9Tb3J0W3RoaXMuc29ydFZhbHVlXSwgY29tcGFyYXRvcikpXG5cdFx0XHRcdDogdGhpcy5vcmRlcnNcblx0fVxuXG5cdG9uRmlsdGVyQ2hhbmdlKCk6IHZvaWQge1xuXHRcdHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG5cdH1cblxuXHRjbGVhckZpbHRlcnMoKTogdm9pZCB7XG5cdFx0dGhpcy5zZWxlY3RlZEZpbHRlcnMgPSB7XG5cdFx0XHRvcmRlclN0YXRlOiAnJyxcblx0XHRcdHBheW1lbnRTdGF0ZTogJycsXG5cdFx0XHRzaGlwbWVudFN0YXRlOiAnJyxcblx0XHRcdHNoaXBtZW50TWV0aG9kOiAnJyxcblx0XHRcdGRhdGVNb2RlOiAnJyxcblx0XHRcdGRhdGVWYWx1ZTogJycsXG5cdFx0XHRkYXRlRnJvbTogJycsXG5cdFx0XHRkYXRlVG86ICcnLFxuXHRcdFx0dG90YWxNb2RlOiAnJyxcblx0XHRcdHRvdGFsVmFsdWU6IG51bGwsXG5cdFx0XHR0b3RhbE1pbjogbnVsbCxcblx0XHRcdHRvdGFsTWF4OiBudWxsXG5cdFx0fTtcblx0XHR0aGlzLmFwcGx5RmlsdGVycygpO1xuXHR9XG5cblx0dG9nZ2xlTW9iaWxlRmlsdGVycygpOiB2b2lkIHtcblx0XHR0aGlzLnNob3dNb2JpbGVGaWx0ZXJzID0gIXRoaXMuc2hvd01vYmlsZUZpbHRlcnM7XG5cdH1cblxuXHRwcml2YXRlIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcblx0XHRsZXQgZmlsdGVyZWRPcmRlcnMgPSBbLi4udGhpcy5hbGxPcmRlcnNdO1xuXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLm9yZGVyU3RhdGUpIHtcblx0XHRcdGZpbHRlcmVkT3JkZXJzID0gZmlsdGVyZWRPcmRlcnMuZmlsdGVyKG9yZGVyID0+IChvcmRlci5vcmRlclN0YXRlIHx8ICcnKSA9PT0gdGhpcy5zZWxlY3RlZEZpbHRlcnMub3JkZXJTdGF0ZSk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLnNlbGVjdGVkRmlsdGVycy5wYXltZW50U3RhdGUpIHtcblx0XHRcdGZpbHRlcmVkT3JkZXJzID0gZmlsdGVyZWRPcmRlcnMuZmlsdGVyKG9yZGVyID0+IChvcmRlci5wYXltZW50cz8uWzBdPy5zdGF0ZSB8fCAnJykgPT09IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnBheW1lbnRTdGF0ZSk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLnNlbGVjdGVkRmlsdGVycy5zaGlwbWVudFN0YXRlKSB7XG5cdFx0XHRmaWx0ZXJlZE9yZGVycyA9IGZpbHRlcmVkT3JkZXJzLmZpbHRlcihvcmRlciA9PiAob3JkZXIuc2hpcG1lbnRzPy5bMF0/LnN0YXRlIHx8ICcnKSA9PT0gdGhpcy5zZWxlY3RlZEZpbHRlcnMuc2hpcG1lbnRTdGF0ZSk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLnNlbGVjdGVkRmlsdGVycy5zaGlwbWVudE1ldGhvZCkge1xuXHRcdFx0ZmlsdGVyZWRPcmRlcnMgPSBmaWx0ZXJlZE9yZGVycy5maWx0ZXIob3JkZXIgPT4gKG9yZGVyLnNoaXBtZW50cz8uWzBdPy5tZXRob2Q/Lm5hbWUgfHwgJycpID09PSB0aGlzLnNlbGVjdGVkRmlsdGVycy5zaGlwbWVudE1ldGhvZCk7XG5cdFx0fVxuXHRcdGZpbHRlcmVkT3JkZXJzID0gZmlsdGVyZWRPcmRlcnMuZmlsdGVyKG9yZGVyID0+IHRoaXMubWF0Y2hlc0RhdGVGaWx0ZXIob3JkZXIpKTtcblx0XHRmaWx0ZXJlZE9yZGVycyA9IGZpbHRlcmVkT3JkZXJzLmZpbHRlcihvcmRlciA9PiB0aGlzLm1hdGNoZXNUb3RhbEZpbHRlcihvcmRlcikpO1xuXG5cdFx0dGhpcy5vcmRlcnMgPSBmaWx0ZXJlZE9yZGVycztcblx0XHR0aGlzLmFwcGx5Q3VycmVudFNvcnQoKTtcblx0fVxuXG5cdHByaXZhdGUgYXBwbHlDdXJyZW50U29ydCgpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuY3VycmVudFNvcnQ/Lm5hbWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3Qgc29ydENvbmZpZyA9IHRoaXMudmFsdWVzVG9Tb3J0W3RoaXMuY3VycmVudFNvcnQubmFtZV07XG5cdFx0aWYgKCFzb3J0Q29uZmlnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGNvbXBhcmF0b3IgPSB0aGlzLmN1cnJlbnRTb3J0LmFzYyA/IFstMSwgMV0gOiBbMSwgLTFdO1xuXHRcdGNvbnN0IHNvcnRGdW5jdGlvbiA9IHRoaXMuZ2V0U29ydEZ1bmN0aW9uKHRoaXMuY3VycmVudFNvcnQubmFtZSk7XG5cdFx0dGhpcy5vcmRlcnMgPSB0aGlzLm9yZGVycy5zb3J0KChhT3JkZXJzLCBvdGhlck9yZGVycykgPT4gc29ydEZ1bmN0aW9uKGFPcmRlcnMsIG90aGVyT3JkZXJzLCBzb3J0Q29uZmlnLCBjb21wYXJhdG9yKSk7XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoZXNUb3RhbEZpbHRlcihvcmRlcjogYW55KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbW9kZSA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnRvdGFsTW9kZTtcblx0XHRpZiAoIW1vZGUpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRvdGFsID0gTnVtYmVyKG9yZGVyPy50b3RhbHM/LnRvdGFsID8/IDApO1xuXHRcdGNvbnN0IHZhbHVlID0gdGhpcy50b051bWJlck9yTnVsbCh0aGlzLnNlbGVjdGVkRmlsdGVycy50b3RhbFZhbHVlKTtcblx0XHRjb25zdCBtaW4gPSB0aGlzLnRvTnVtYmVyT3JOdWxsKHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnRvdGFsTWluKTtcblx0XHRjb25zdCBtYXggPSB0aGlzLnRvTnVtYmVyT3JOdWxsKHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnRvdGFsTWF4KTtcblxuXHRcdHN3aXRjaCAobW9kZSkge1xuXHRcdFx0Y2FzZSAnZXEnOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgIT09IG51bGwgPyB0b3RhbCA9PT0gdmFsdWUgOiB0cnVlO1xuXHRcdFx0Y2FzZSAnZ3QnOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgIT09IG51bGwgPyB0b3RhbCA+IHZhbHVlIDogdHJ1ZTtcblx0XHRcdGNhc2UgJ2x0Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlICE9PSBudWxsID8gdG90YWwgPCB2YWx1ZSA6IHRydWU7XG5cdFx0XHRjYXNlICdiZXR3ZWVuJzpcblx0XHRcdFx0aWYgKG1pbiAhPT0gbnVsbCAmJiBtYXggIT09IG51bGwpIHJldHVybiB0b3RhbCA+PSBtaW4gJiYgdG90YWwgPD0gbWF4O1xuXHRcdFx0XHRpZiAobWluICE9PSBudWxsKSByZXR1cm4gdG90YWwgPj0gbWluO1xuXHRcdFx0XHRpZiAobWF4ICE9PSBudWxsKSByZXR1cm4gdG90YWwgPD0gbWF4O1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgbWF0Y2hlc0RhdGVGaWx0ZXIob3JkZXI6IGFueSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1vZGUgPSB0aGlzLnNlbGVjdGVkRmlsdGVycy5kYXRlTW9kZTtcblx0XHRpZiAoIW1vZGUpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9yZGVyRGF0ZSA9IG1vbWVudChvcmRlcj8uY2hlY2tvdXRDb21wbGV0ZWRBdCk7XG5cdFx0aWYgKCFvcmRlckRhdGUuaXNWYWxpZCgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsdWVEYXRlID0gbW9tZW50KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmRhdGVWYWx1ZSk7XG5cdFx0Y29uc3QgZnJvbURhdGUgPSBtb21lbnQodGhpcy5zZWxlY3RlZEZpbHRlcnMuZGF0ZUZyb20pO1xuXHRcdGNvbnN0IHRvRGF0ZSA9IG1vbWVudCh0aGlzLnNlbGVjdGVkRmlsdGVycy5kYXRlVG8pO1xuXG5cdFx0c3dpdGNoIChtb2RlKSB7XG5cdFx0XHRjYXNlICdlcSc6XG5cdFx0XHRcdHJldHVybiB2YWx1ZURhdGUuaXNWYWxpZCgpID8gb3JkZXJEYXRlLmlzU2FtZSh2YWx1ZURhdGUsICdkYXknKSA6IHRydWU7XG5cdFx0XHRjYXNlICdndCc6XG5cdFx0XHRcdHJldHVybiB2YWx1ZURhdGUuaXNWYWxpZCgpID8gb3JkZXJEYXRlLmlzQWZ0ZXIodmFsdWVEYXRlLCAnZGF5JykgOiB0cnVlO1xuXHRcdFx0Y2FzZSAnbHQnOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWVEYXRlLmlzVmFsaWQoKSA/IG9yZGVyRGF0ZS5pc0JlZm9yZSh2YWx1ZURhdGUsICdkYXknKSA6IHRydWU7XG5cdFx0XHRjYXNlICdiZXR3ZWVuJzpcblx0XHRcdFx0aWYgKGZyb21EYXRlLmlzVmFsaWQoKSAmJiB0b0RhdGUuaXNWYWxpZCgpKSByZXR1cm4gb3JkZXJEYXRlLmlzU2FtZU9yQWZ0ZXIoZnJvbURhdGUsICdkYXknKSAmJiBvcmRlckRhdGUuaXNTYW1lT3JCZWZvcmUodG9EYXRlLCAnZGF5Jyk7XG5cdFx0XHRcdGlmIChmcm9tRGF0ZS5pc1ZhbGlkKCkpIHJldHVybiBvcmRlckRhdGUuaXNTYW1lT3JBZnRlcihmcm9tRGF0ZSwgJ2RheScpO1xuXHRcdFx0XHRpZiAodG9EYXRlLmlzVmFsaWQoKSkgcmV0dXJuIG9yZGVyRGF0ZS5pc1NhbWVPckJlZm9yZSh0b0RhdGUsICdkYXknKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHRvTnVtYmVyT3JOdWxsKHZhbHVlOiBhbnkpOiBudW1iZXIgfCBudWxsIHtcblx0XHRpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJycpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuXHRcdHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IG51bGw7XG5cdH1cblxuXHRwcml2YXRlIGJ1aWxkRmlsdGVyT3B0aW9ucyhvcmRlcnM6IGFueVtdKTogYW55IHtcblx0XHRjb25zdCB1bmlxdWVWYWx1ZXMgPSB7XG5cdFx0XHRvcmRlclN0YXRlOiBuZXcgU2V0PHN0cmluZz4oKSxcblx0XHRcdHBheW1lbnRTdGF0ZTogbmV3IFNldDxzdHJpbmc+KCksXG5cdFx0XHRzaGlwbWVudFN0YXRlOiBuZXcgU2V0PHN0cmluZz4oKSxcblx0XHRcdHNoaXBtZW50TWV0aG9kOiBuZXcgU2V0PHN0cmluZz4oKVxuXHRcdH07XG5cblx0XHRvcmRlcnMuZm9yRWFjaChvcmRlciA9PiB7XG5cdFx0XHRpZiAob3JkZXI/Lm9yZGVyU3RhdGUpIHVuaXF1ZVZhbHVlcy5vcmRlclN0YXRlLmFkZChvcmRlci5vcmRlclN0YXRlKTtcblx0XHRcdGlmIChvcmRlcj8ucGF5bWVudHM/LlswXT8uc3RhdGUpIHVuaXF1ZVZhbHVlcy5wYXltZW50U3RhdGUuYWRkKG9yZGVyLnBheW1lbnRzWzBdLnN0YXRlKTtcblx0XHRcdGlmIChvcmRlcj8uc2hpcG1lbnRzPy5bMF0/LnN0YXRlKSB1bmlxdWVWYWx1ZXMuc2hpcG1lbnRTdGF0ZS5hZGQob3JkZXIuc2hpcG1lbnRzWzBdLnN0YXRlKTtcblx0XHRcdGlmIChvcmRlcj8uc2hpcG1lbnRzPy5bMF0/Lm1ldGhvZD8ubmFtZSkgdW5pcXVlVmFsdWVzLnNoaXBtZW50TWV0aG9kLmFkZChvcmRlci5zaGlwbWVudHNbMF0ubWV0aG9kLm5hbWUpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG9yZGVyU3RhdGU6IEFycmF5LmZyb20odW5pcXVlVmFsdWVzLm9yZGVyU3RhdGUpLnNvcnQoKSxcblx0XHRcdHBheW1lbnRTdGF0ZTogQXJyYXkuZnJvbSh1bmlxdWVWYWx1ZXMucGF5bWVudFN0YXRlKS5zb3J0KCksXG5cdFx0XHRzaGlwbWVudFN0YXRlOiBBcnJheS5mcm9tKHVuaXF1ZVZhbHVlcy5zaGlwbWVudFN0YXRlKS5zb3J0KCksXG5cdFx0XHRzaGlwbWVudE1ldGhvZDogQXJyYXkuZnJvbSh1bmlxdWVWYWx1ZXMuc2hpcG1lbnRNZXRob2QpLnNvcnQoKVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uIGZ1bmNpb24gdXRpbGl6YWRhIHBhcmEgZGVzZW1wYXRlLlxuXHQgKiBAcGFyYW0gYU9yZGVyc1xuXHQgKiBAcGFyYW0gb3RoZXJPcmRlcnNcblx0ICogQHBhcmFtIGNvbXBhcmF0b3Jcblx0ICogQHJldHVybnNcblx0ICovXG5cdHByaXZhdGUgdGllQnJlYWtlcihhT3JkZXJzOiBhbnksIG90aGVyT3JkZXJzOiBhbnksIGNvbXBhcmF0b3I6IGFueSkge1xuXHRcdHJldHVybiBhT3JkZXJzLm51bWJlci50b0xvd2VyQ2FzZSgpIDwgb3RoZXJPcmRlcnMubnVtYmVyLnRvTG93ZXJDYXNlKCkgPyBjb21wYXJhdG9yWzBdIDogY29tcGFyYXRvclsxXVxuXHR9XG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb24gY2FtYmlhIGxvcyB2YWxvcmVzIGRlIGxhIHZhcmlhYmxlIGN1cnJlbnRTb3J0XG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqIEBwYXJhbSBhc2Ncblx0ICovXG5cdHByaXZhdGUgc2V0Q3VycmVudFNvcnQobmFtZTogc3RyaW5nLCBhc2M6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmN1cnJlbnRTb3J0Lm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuY3VycmVudFNvcnQuYXNjID0gYXNjXG5cdH1cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvbiByZXRvcm5hIGxhIGZ1bmNpb24gcXVlIHNlIGRlYmUgdXRpbGl6YXIgcGFyYSBlbCBzb3J0IGRlbCBhcnJlZ2xvXG5cdCAqIEBwYXJhbSB2YWx1ZSBwYXJhbWV0cm8gcXVlIGluZGljYSBlbCB0aXBvIGRlIGZ1bmNpb24gcXVlIGRlYmUgcmV0b3JuYXJcblx0ICogQHJldHVybnMgZnVuY2lvbiBwYXJhIHV0aWxpemFyIGVuIGxhIGJ1c3F1ZWRhXG5cdCAqL1xuXHRwcml2YXRlIGdldFNvcnRGdW5jdGlvbih2YWx1ZTogYW55KTogRnVuY3Rpb24ge1xuXHRcdHN3aXRjaCAodmFsdWUpIHtcblx0XHRcdGNhc2UgJ3BheW1lbnRTdGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLnNvcnRQYXltZW50U3RhdGUuYmluZCh0aGlzKTtcblx0XHRcdGNhc2UgJ21ldGhvZCc6XG5cdFx0XHRcdHJldHVybiB0aGlzLnNvcnRTaGlwbWVudHMuYmluZCh0aGlzKTtcblx0XHRcdGNhc2UgJ21ldGhvZFN0YXRlJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuc29ydFNoaXBtZW50cy5iaW5kKHRoaXMpO1xuXHRcdFx0Y2FzZSAndG90YWwnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5zb3J0TnVtYmVyLmJpbmQodGhpcyk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5zb3J0VGV4dC5iaW5kKHRoaXMpO1xuXHRcdH1cblx0fVxuXG5cdC8qIEZ1bmNpb25lcyBwYXJhIG9yZGVybmFyICovXG5cdHByaXZhdGUgc29ydFBheW1lbnRTdGF0ZShhT3JkZXJzOiBhbnksIG90aGVyT3JkZXJzOiBhbnksIGRhdGE6IGFueSwgY29tcGFyYXRvcjogYW55KSB7XG5cdFx0cmV0dXJuIChhT3JkZXJzLnBheW1lbnRzWzBdW2RhdGEuYXR0cmlidXRlXSA9PSBvdGhlck9yZGVycy5wYXltZW50c1swXVtkYXRhLmF0dHJpYnV0ZV0pXG5cdFx0XHQ/IHRoaXMudGllQnJlYWtlcihhT3JkZXJzLCBvdGhlck9yZGVycywgY29tcGFyYXRvcilcblx0XHRcdDogU3RyaW5nKGFPcmRlcnMucGF5bWVudHNbMF1bZGF0YS5hdHRyaWJ1dGVdKS50b0xvd2VyQ2FzZSgpIDwgU3RyaW5nKG90aGVyT3JkZXJzLnBheW1lbnRzWzBdW2RhdGEuYXR0cmlidXRlXSkudG9Mb3dlckNhc2UoKSA/IGNvbXBhcmF0b3JbMF0gOiBjb21wYXJhdG9yWzFdXG5cdH1cblxuXHRwcml2YXRlIHNvcnRTaGlwbWVudHMoYU9yZGVyczogYW55LCBvdGhlck9yZGVyczogYW55LCBkYXRhOiBhbnksIGNvbXBhcmF0b3I6IGFueSkge1xuXHRcdGlmIChkYXRhLnN1YkF0dHJpYnV0ZSkge1xuXHRcdFx0cmV0dXJuIChhT3JkZXJzLnNoaXBtZW50c1swXVtkYXRhLmF0dHJpYnV0ZV1bZGF0YS5zdWJBdHRyaWJ1dGVdID09IG90aGVyT3JkZXJzLnNoaXBtZW50c1swXVtkYXRhLmF0dHJpYnV0ZV1bZGF0YS5zdWJBdHRyaWJ1dGVdKVxuXHRcdFx0XHQ/IHRoaXMudGllQnJlYWtlcihhT3JkZXJzLCBvdGhlck9yZGVycywgY29tcGFyYXRvcilcblx0XHRcdFx0OiBTdHJpbmcoYU9yZGVycy5zaGlwbWVudHNbMF1bZGF0YS5hdHRyaWJ1dGVdW2RhdGEuc3ViQXR0cmlidXRlXSkudG9Mb3dlckNhc2UoKSA8IFN0cmluZyhvdGhlck9yZGVycy5zaGlwbWVudHNbMF1bZGF0YS5hdHRyaWJ1dGVdW2RhdGEuc3ViQXR0cmlidXRlXSkudG9Mb3dlckNhc2UoKSA/IGNvbXBhcmF0b3JbMF0gOiBjb21wYXJhdG9yWzFdXG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0cmV0dXJuIChhT3JkZXJzLnNoaXBtZW50c1swXVtkYXRhLmF0dHJpYnV0ZV0gPT0gb3RoZXJPcmRlcnMuc2hpcG1lbnRzWzBdW2RhdGEuYXR0cmlidXRlXSlcblx0XHRcdFx0PyB0aGlzLnRpZUJyZWFrZXIoYU9yZGVycywgb3RoZXJPcmRlcnMsIGNvbXBhcmF0b3IpXG5cdFx0XHRcdDogU3RyaW5nKGFPcmRlcnMuc2hpcG1lbnRzWzBdW2RhdGEuYXR0cmlidXRlXSkudG9Mb3dlckNhc2UoKSA8IFN0cmluZyhvdGhlck9yZGVycy5zaGlwbWVudHNbMF1bZGF0YS5hdHRyaWJ1dGVdKS50b0xvd2VyQ2FzZSgpID8gY29tcGFyYXRvclswXSA6IGNvbXBhcmF0b3JbMV1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHNvcnROdW1iZXIoYU9yZGVyczogYW55LCBvdGhlck9yZGVyczogYW55LCBkYXRhOiBhbnksIGNvbXBhcmF0b3I6IGFueSkge1xuXHRcdGNvbnN0IHZhbHVlQSA9IGRhdGEuc3ViQXR0cmlidXRlID8gYU9yZGVycz8uW2RhdGEuYXR0cmlidXRlXT8uW2RhdGEuc3ViQXR0cmlidXRlXSA6IGFPcmRlcnM/LltkYXRhLmF0dHJpYnV0ZV07XG5cdFx0Y29uc3QgdmFsdWVCID0gZGF0YS5zdWJBdHRyaWJ1dGUgPyBvdGhlck9yZGVycz8uW2RhdGEuYXR0cmlidXRlXT8uW2RhdGEuc3ViQXR0cmlidXRlXSA6IG90aGVyT3JkZXJzPy5bZGF0YS5hdHRyaWJ1dGVdO1xuXHRcdHJldHVybiB2YWx1ZUEgPCB2YWx1ZUIgPyBjb21wYXJhdG9yWzBdIDogY29tcGFyYXRvclsxXVxuXHR9XG5cblx0cHJpdmF0ZSBzb3J0VGV4dChhT3JkZXJzOiBhbnksIG90aGVyT3JkZXJzOiBhbnksIGRhdGE6IGFueSwgY29tcGFyYXRvcjogYW55KSB7XG5cdFx0cmV0dXJuIChhT3JkZXJzW2RhdGEuYXR0cmlidXRlXSA9PSBvdGhlck9yZGVyc1tkYXRhLmF0dHJpYnV0ZV0pXG5cdFx0XHQ/IGFPcmRlcnMubnVtYmVyLnRvTG93ZXJDYXNlKCkgPCBvdGhlck9yZGVycy5udW1iZXIudG9Mb3dlckNhc2UoKSA/IGNvbXBhcmF0b3JbMF0gOiBjb21wYXJhdG9yWzFdXG5cdFx0XHQ6IFN0cmluZyhhT3JkZXJzW2RhdGEuYXR0cmlidXRlXSkudG9Mb3dlckNhc2UoKSA8IFN0cmluZyhvdGhlck9yZGVyc1tkYXRhLmF0dHJpYnV0ZV0pLnRvTG93ZXJDYXNlKCkgPyBjb21wYXJhdG9yWzBdIDogY29tcGFyYXRvclsxXVxuXHR9XG5cblx0dG9EYXRlKGRhdGU6YW55LCBmb3JtYXQ6YW55KXsgcmV0dXJuIG1vbWVudChkYXRlKS5mb3JtYXQoIWZvcm1hdCAmJiAnREQvTU0vWVlZWSwgaDptbTpzcyBhJyB8fCBmb3JtYXQpfVxuXG5cdGlzQ3VycmVudFNvcnQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY3VycmVudFNvcnQubmFtZSA9PT0gbmFtZTtcblx0fVxuXG5cdGdldFNvcnREaXJlY3Rpb24obmFtZTogc3RyaW5nKTogJ25vbmUnIHwgJ2FzYycgfCAnZGVzYycge1xuXHRcdGlmICghdGhpcy5pc0N1cnJlbnRTb3J0KG5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gJ25vbmUnO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5jdXJyZW50U29ydC5hc2MgPyAnYXNjJyA6ICdkZXNjJztcblx0fVxuXG5cdGdldEFyaWFTb3J0KG5hbWU6IHN0cmluZyk6ICdub25lJyB8ICdhc2NlbmRpbmcnIHwgJ2Rlc2NlbmRpbmcnIHtcblx0XHRjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmdldFNvcnREaXJlY3Rpb24obmFtZSk7XG5cdFx0aWYgKGRpcmVjdGlvbiA9PT0gJ2FzYycpIHtcblx0XHRcdHJldHVybiAnYXNjZW5kaW5nJztcblx0XHR9XG5cdFx0aWYgKGRpcmVjdGlvbiA9PT0gJ2Rlc2MnKSB7XG5cdFx0XHRyZXR1cm4gJ2Rlc2NlbmRpbmcnO1xuXHRcdH1cblx0XHRyZXR1cm4gJ25vbmUnO1xuXHR9XG5cblx0Z2V0Q29sdW1uQ2xhc3MoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5oYXNPcmRlclN0YXRlQ29sdW1uID8gJ2NvbC1sZyBjb2wtMTInIDogJ2NvbC1sZy0yIGNvbC0xMic7XG5cdH1cblxuXHRnb1RvT3JkZXIob3JkZXI6YW55KXtcbiAgICAgICAgdGhpcy5fb3JkZXJzU2VydmljZS5zZXRTZWxlY3RlZE9yZGVyKG9yZGVyKTtcbiAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlQnlVcmwoKGBhY2NvdW50L29yZGVycy8ke29yZGVyLm51bWJlcn1gKSlcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCIgaWQ9XCJvcmRlcnNFY0NvbXBvbmVudFwiPlxuICAgIEBpZighbG9hZGluZyl7XG4gICAgPHNlY3Rpb24gaWQ9XCJvcmRlcnNcIiBjbGFzcz1cInctMTAwXCI+XG4gICAgICAgIEBpZighcHJpY2VWaXNpYmlsaXR5LmhpZGVQcmljZXMoKSl7XG4gICAgICAgIEBpZihhbGxPcmRlcnMgJiYgYWxsT3JkZXJzLmxlbmd0aCl7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWxnLW5vbmUgbWItMlwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1zbSB3LTEwMCBmaWx0ZXJzLXRvZ2dsZS1idG5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNb2JpbGVGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICBGaWx0cm9zIHt7IHNob3dNb2JpbGVGaWx0ZXJzID8gJ+KWsicgOiAn4pa8JyB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGZpbHRlcnMtcm93IGd5LTMgbWItM1wiIFtjbGFzcy5tb2JpbGUtaGlkZGVuXT1cIiFzaG93TW9iaWxlRmlsdGVyc1wiPlxuICAgICAgICAgICAgQGlmKGhhc09yZGVyU3RhdGVDb2x1bW4pe1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14eGwtMiBjb2wteGwtMyBjb2wtbGctNCBjb2wtbWQtNiBjb2wtMTIgZmlsdGVyLWNvbFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpbHRlci1sYWJlbFwiPnt7ICdvcmRlci1zdGF0ZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGaWx0ZXJzLm9yZGVyU3RhdGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPnt7ICdhbGwnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IodmFsdWUgb2YgZmlsdGVyT3B0aW9ucy5vcmRlclN0YXRlOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJ2YWx1ZVwiPnt7IHZhbHVlIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14eGwtMiBjb2wteGwtMyBjb2wtbGctNCBjb2wtbWQtNiBjb2wtMTIgZmlsdGVyLWNvbFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpbHRlci1sYWJlbFwiPnt7ICdwYXltZW50LXN0YXRlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpbHRlcnMucGF5bWVudFN0YXRlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbHRlckNoYW5nZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj57eyAnYWxsJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICBAZm9yKHZhbHVlIG9mIGZpbHRlck9wdGlvbnMucGF5bWVudFN0YXRlOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJ2YWx1ZVwiPnt7IHZhbHVlIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14eGwtMiBjb2wteGwtMyBjb2wtbGctNCBjb2wtbWQtNiBjb2wtMTIgZmlsdGVyLWNvbFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpbHRlci1sYWJlbFwiPnt7ICdzaGlwbWVudC1zdGF0ZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGaWx0ZXJzLnNoaXBtZW50U3RhdGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPnt7ICdhbGwnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IodmFsdWUgb2YgZmlsdGVyT3B0aW9ucy5zaGlwbWVudFN0YXRlOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJ2YWx1ZVwiPnt7IHZhbHVlIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14eGwtMiBjb2wteGwtMyBjb2wtbGctNCBjb2wtbWQtNiBjb2wtMTIgZmlsdGVyLWNvbFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpbHRlci1sYWJlbFwiPnt7ICdzaGlwbWVudC1tZXRob2QnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVycy5zaGlwbWVudE1ldGhvZFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3sgJ2FsbCcgfCB0cmFuc2xhdGUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgQGZvcih2YWx1ZSBvZiBmaWx0ZXJPcHRpb25zLnNoaXBtZW50TWV0aG9kOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJ2YWx1ZVwiPnt7IHZhbHVlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14eGwtMiBjb2wteGwtMyBjb2wtbGctNCBjb2wtbWQtNiBjb2wtMTIgZmlsdGVyLWNvbFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpbHRlci1sYWJlbFwiPnt7ICdkYXRlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpbHRlcnMuZGF0ZU1vZGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPnt7ICdhbGwnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIEBmb3Iob3B0aW9uIG9mIGRhdGVNb2RlT3B0aW9uczsgdHJhY2sgJGluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+e3sgb3B0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICBAaWYoc2VsZWN0ZWRGaWx0ZXJzLmRhdGVNb2RlID09PSAnYmV0d2Vlbicpe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTEgbXQtMSBmaWx0ZXItcmFuZ2Utcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGaWx0ZXJzLmRhdGVGcm9tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVycy5kYXRlVG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbHRlckNoYW5nZSgpXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIGlmKHNlbGVjdGVkRmlsdGVycy5kYXRlTW9kZSl7XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIG10LTFcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVycy5kYXRlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHhsLTIgY29sLXhsLTMgY29sLWxnLTQgY29sLW1kLTYgY29sLTEyIGZpbHRlci1jb2xcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWx0ZXItbGFiZWxcIj57eyAndG90YWwnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVycy50b3RhbE1vZGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPnt7ICdhbGwnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIEBmb3Iob3B0aW9uIG9mIHRvdGFsTW9kZU9wdGlvbnM7IHRyYWNrICRpbmRleCl7XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPnt7IG9wdGlvbi5sYWJlbEtleSB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgQGlmKHNlbGVjdGVkRmlsdGVycy50b3RhbE1vZGUgPT09ICdiZXR3ZWVuJyl7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMSBtdC0xIGZpbHRlci1yYW5nZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBwbGFjZWhvbGRlcj1cIk1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVycy50b3RhbE1pblwiIChpbnB1dCk9XCJvbkZpbHRlckNoYW5nZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgcGxhY2Vob2xkZXI9XCJNYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpbHRlcnMudG90YWxNYXhcIiAoaW5wdXQpPVwib25GaWx0ZXJDaGFuZ2UoKVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYoc2VsZWN0ZWRGaWx0ZXJzLnRvdGFsTW9kZSl7XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gbXQtMVwiIHBsYWNlaG9sZGVyPVwiVmFsb3JcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVycy50b3RhbFZhbHVlXCIgKGlucHV0KT1cIm9uRmlsdGVyQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHhsLTIgY29sLXhsLTMgY29sLWxnLTQgY29sLW1kLTYgY29sLTEyIGQtZmxleCBhbGlnbi1pdGVtcy1lbmQgZmlsdGVyLWNvbFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gdy0xMDBcIiAoY2xpY2spPVwiY2xlYXJGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2NsZWFyLWZpbHRlcnMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZihvcmRlcnMgJiYgb3JkZXJzLmxlbmd0aCl7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItMSBib3JkZXItYm90dG9tIGQtbm9uZSBkLWxnLWZsZXhcIj5cbiAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzKClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInN0IHNvcnQtdHJpZ2dlciBteS0yXCIgW2NsYXNzLmFwcGxpZWRdPVwiaXNDdXJyZW50U29ydCgnbnVtYmVyJylcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYXNjXT1cImdldFNvcnREaXJlY3Rpb24oJ251bWJlcicpID09PSAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1kZXNjXT1cImdldFNvcnREaXJlY3Rpb24oJ251bWJlcicpID09PSAnZGVzYydcIiBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0QXJpYVNvcnQoJ251bWJlcicpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRPcmRlcnMoJ251bWJlcicpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdvcmRlcicgfCB0cmFuc2xhdGUgfX06XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzKClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInN0IHNvcnQtdHJpZ2dlciBteS0yXCIgW2NsYXNzLmFwcGxpZWRdPVwiaXNDdXJyZW50U29ydCgnZGF0ZScpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFzY109XCJnZXRTb3J0RGlyZWN0aW9uKCdkYXRlJykgPT09ICdhc2MnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWRlc2NdPVwiZ2V0U29ydERpcmVjdGlvbignZGF0ZScpID09PSAnZGVzYydcIiBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0QXJpYVNvcnQoJ2RhdGUnKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzb3J0T3JkZXJzKCdkYXRlJylcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2RhdGUnIHwgdHJhbnNsYXRlIH19OlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYoaGFzT3JkZXJTdGF0ZUNvbHVtbil7XG4gICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJnZXRDb2x1bW5DbGFzcygpXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzdCBzb3J0LXRyaWdnZXIgbXktMlwiIFtjbGFzcy5hcHBsaWVkXT1cImlzQ3VycmVudFNvcnQoJ29yZGVyU3RhdGUnKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hc2NdPVwiZ2V0U29ydERpcmVjdGlvbignb3JkZXJTdGF0ZScpID09PSAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1kZXNjXT1cImdldFNvcnREaXJlY3Rpb24oJ29yZGVyU3RhdGUnKSA9PT0gJ2Rlc2MnXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cImdldEFyaWFTb3J0KCdvcmRlclN0YXRlJylcIiAoY2xpY2spPVwic29ydE9yZGVycygnb3JkZXJTdGF0ZScpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdvcmRlci1zdGF0ZScgfCB0cmFuc2xhdGUgfX06XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzKClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInN0IHNvcnQtdHJpZ2dlciBteS0yXCIgW2NsYXNzLmFwcGxpZWRdPVwiaXNDdXJyZW50U29ydCgncGF5bWVudFN0YXRlJylcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYXNjXT1cImdldFNvcnREaXJlY3Rpb24oJ3BheW1lbnRTdGF0ZScpID09PSAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1kZXNjXT1cImdldFNvcnREaXJlY3Rpb24oJ3BheW1lbnRTdGF0ZScpID09PSAnZGVzYydcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0QXJpYVNvcnQoJ3BheW1lbnRTdGF0ZScpXCIgKGNsaWNrKT1cInNvcnRPcmRlcnMoJ3BheW1lbnRTdGF0ZScpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdwYXltZW50LXN0YXRlJyB8IHRyYW5zbGF0ZSB9fTpcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3MoKVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic3Qgc29ydC10cmlnZ2VyIG15LTJcIiBbY2xhc3MuYXBwbGllZF09XCJpc0N1cnJlbnRTb3J0KCdtZXRob2RTdGF0ZScpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFzY109XCJnZXRTb3J0RGlyZWN0aW9uKCdtZXRob2RTdGF0ZScpID09PSAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1kZXNjXT1cImdldFNvcnREaXJlY3Rpb24oJ21ldGhvZFN0YXRlJykgPT09ICdkZXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc29ydF09XCJnZXRBcmlhU29ydCgnbWV0aG9kU3RhdGUnKVwiIChjbGljayk9XCJzb3J0T3JkZXJzKCdtZXRob2RTdGF0ZScpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdzaGlwbWVudC1zdGF0ZScgfCB0cmFuc2xhdGUgfX06XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzKClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInN0IHNvcnQtdHJpZ2dlciBteS0yXCIgW2NsYXNzLmFwcGxpZWRdPVwiaXNDdXJyZW50U29ydCgnbWV0aG9kJylcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYXNjXT1cImdldFNvcnREaXJlY3Rpb24oJ21ldGhvZCcpID09PSAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1kZXNjXT1cImdldFNvcnREaXJlY3Rpb24oJ21ldGhvZCcpID09PSAnZGVzYydcIiBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0QXJpYVNvcnQoJ21ldGhvZCcpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRPcmRlcnMoJ21ldGhvZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdzaGlwbWVudC1tZXRob2QnIHwgdHJhbnNsYXRlIH19OlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJnZXRDb2x1bW5DbGFzcygpXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzdCBzb3J0LXRyaWdnZXIgbXktMlwiIFtjbGFzcy5hcHBsaWVkXT1cImlzQ3VycmVudFNvcnQoJ3RvdGFsJylcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYXNjXT1cImdldFNvcnREaXJlY3Rpb24oJ3RvdGFsJykgPT09ICdhc2MnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWRlc2NdPVwiZ2V0U29ydERpcmVjdGlvbigndG90YWwnKSA9PT0gJ2Rlc2MnXCIgW2F0dHIuYXJpYS1zb3J0XT1cImdldEFyaWFTb3J0KCd0b3RhbCcpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRPcmRlcnMoJ3RvdGFsJylcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ3RvdGFsJyB8IHRyYW5zbGF0ZSB9fTpcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGZvcihvcmRlciBvZiBvcmRlcnM7IHRyYWNrICRpbmRleCl7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaXRlbSBib3JkZXItYm90dG9tIHB5LTIgZC1ub25lIGQtbGctZmxleFwiPlxuICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3MoKVwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZnctYm9sZCBvcmRlci1udW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgb3JkZXIubnVtYmVyIH19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJnZXRDb2x1bW5DbGFzcygpXCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwcmljZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyB0b0RhdGUob3JkZXIuY2hlY2tvdXRDb21wbGV0ZWRBdCwgJ0REL01NL1lZWVknKSB8IHRyYW5zbGF0ZSB9fTxicj5cbiAgICAgICAgICAgICAgICAgICAge3sgdG9EYXRlKG9yZGVyLmNoZWNrb3V0Q29tcGxldGVkQXQsICdoOm1tOnNzIGEnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmKGhhc09yZGVyU3RhdGVDb2x1bW4pe1xuICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3MoKVwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicHJpY2VcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgb3JkZXIub3JkZXJTdGF0ZSA/IChvcmRlci5vcmRlclN0YXRlIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlKSA6ICctJyB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3MoKVwiPlxuICAgICAgICAgICAgICAgIEBpZihvcmRlci5wYXltZW50cyAmJiBvcmRlci5wYXltZW50cy5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInByaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IG9yZGVyLnBheW1lbnRzWzBdLnN0YXRlIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlIH19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3MoKVwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicHJpY2VcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgb3JkZXIuc2hpcG1lbnRzWzBdLnN0YXRlIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlIH19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIEBpZihvcmRlci50cmFja2luZyl7XG4gICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwib3JkZXIudHJhY2tpbmdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1kYXJrIGJ0bkxvZ291dCBweC0zIHB5LTEgZm9udC1zaXplLTEwIHctYXV0byBidG4tc21cIj5WZXIgc2VndWltaWVudG88L2E+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJnZXRDb2x1bW5DbGFzcygpXCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwcmljZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBvcmRlci5zaGlwbWVudHNbMF0ubWV0aG9kLm5hbWUgfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzKCkgKyAnIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgb3JkZXItdG90YWwtYWN0aW9ucydcIj5cbiAgICAgICAgICAgICAgICBAaWYocHJpY2VWaXNpYmlsaXR5LmNhblNob3dQcmljZXMoKSl7XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmdy1ib2xkIHRleHQtbm93cmFwIG9yZGVyLXRvdGFsXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IChvcmRlci50b3RhbHMudG90YWwpIHwgZWNDdXJyZW5jeVN5bWJvbCB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBweC0wIGJ0ZGV0YWxsZSBvcmRlci1kZXRhaWwtYnRuXCIgKGNsaWNrKT1cImdvVG9PcmRlcihvcmRlcilcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidWZXIgZGV0YWxsZSBkZWwgcGVkaWRvICcgKyBvcmRlci5udW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1leWVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLW1vYmlsZS1jYXJkIGQtbGctbm9uZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLW1vYmlsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZGVyLW1vYmlsZS1sYWJlbFwiPnt7ICdvcmRlcicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmRlci1tb2JpbGUtdmFsdWUgZnctYm9sZFwiPnt7IG9yZGVyLm51bWJlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLW1vYmlsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZGVyLW1vYmlsZS1sYWJlbFwiPnt7ICdkYXRlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZGVyLW1vYmlsZS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyB0b0RhdGUob3JkZXIuY2hlY2tvdXRDb21wbGV0ZWRBdCwgJ0REL01NL1lZWVknKSB8IHRyYW5zbGF0ZSB9fSB7e1xuICAgICAgICAgICAgICAgICAgICB0b0RhdGUob3JkZXIuY2hlY2tvdXRDb21wbGV0ZWRBdCwgJ2g6bW06c3MgYScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYoaGFzT3JkZXJTdGF0ZUNvbHVtbil7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3JkZXItbW9iaWxlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JkZXItbW9iaWxlLWxhYmVsXCI+e3sgJ29yZGVyLXN0YXRlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZGVyLW1vYmlsZS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBvcmRlci5vcmRlclN0YXRlID8gKG9yZGVyLm9yZGVyU3RhdGUgfCB0cmFuc2xhdGUgfCB0aXRsZWNhc2UpIDogJy0nIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3JkZXItbW9iaWxlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JkZXItbW9iaWxlLWxhYmVsXCI+e3sgJ3BheW1lbnQtc3RhdGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JkZXItbW9iaWxlLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IG9yZGVyLnBheW1lbnRzICYmIG9yZGVyLnBheW1lbnRzLmxlbmd0aCA+IDAgPyAob3JkZXIucGF5bWVudHNbMF0uc3RhdGUgfCB0cmFuc2xhdGUgfCB0aXRsZWNhc2UpIDpcbiAgICAgICAgICAgICAgICAgICAgJy0nIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3JkZXItbW9iaWxlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JkZXItbW9iaWxlLWxhYmVsXCI+e3sgJ3NoaXBtZW50LXN0YXRlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZGVyLW1vYmlsZS12YWx1ZVwiPnt7IG9yZGVyLnNoaXBtZW50c1swXS5zdGF0ZSB8IHRyYW5zbGF0ZSB8IHRpdGxlY2FzZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZGVyLW1vYmlsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZGVyLW1vYmlsZS1sYWJlbFwiPnt7ICdzaGlwbWVudC1tZXRob2QnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JkZXItbW9iaWxlLXZhbHVlXCI+e3sgb3JkZXIuc2hpcG1lbnRzWzBdLm1ldGhvZC5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3JkZXItbW9iaWxlLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICBAaWYocHJpY2VWaXNpYmlsaXR5LmNhblNob3dQcmljZXMoKSl7XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmdy1ib2xkIHRleHQtbm93cmFwIG9yZGVyLXRvdGFsIG1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgKG9yZGVyLnRvdGFscy50b3RhbCkgfCBlY0N1cnJlbmN5U3ltYm9sIH19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHB4LTAgYnRkZXRhbGxlIG9yZGVyLWRldGFpbC1idG5cIiAoY2xpY2spPVwiZ29Ub09yZGVyKG9yZGVyKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1ZlciBkZXRhbGxlIGRlbCBwZWRpZG8gJyArIG9yZGVyLm51bWJlclwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWV5ZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB9QGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgaC01MFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxoNT57eyAnbm8tb3JkZXJzJyB8IHRyYW5zbGF0ZSB9fTwvaDU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgfUBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGgtNTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8aDU+e3sgJ25vLW9yZGVycycgfCB0cmFuc2xhdGUgfX08L2g1PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICA8L3NlY3Rpb24+XG4gICAgfUBlbHNlIHtcbiAgICA8ZGl2IGNsYXNzPVwidy0xMDAgaC01MCBweS01XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxhcHAtbG9hZGluZy1mdWxsLWVjPjwvYXBwLWxvYWRpbmctZnVsbC1lYz5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZXJyb3JWaWV3PlxuICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBoLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxoND57eyAnb3JkZXJzLWVycm9yJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT4iXX0=