tango-app-ui-store-builder 1.2.17 → 1.2.18

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 (49) hide show
  1. package/esm2022/lib/components/access-denied/access-denied.component.mjs +31 -0
  2. package/esm2022/lib/components/collection-update-ai/collection-update-ai.component.mjs +3 -3
  3. package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +3 -3
  4. package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.mjs +3 -3
  5. package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +3 -3
  6. package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +3 -3
  7. package/esm2022/lib/components/fixture-template-table/find-and-replace/find-and-replace.component.mjs +3 -3
  8. package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +25 -3
  9. package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +3 -3
  10. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +3 -3
  11. package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +3 -3
  12. package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +9 -3
  13. package/esm2022/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.mjs +9 -3
  14. package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +133 -21
  15. package/esm2022/lib/components/plano-configurations/plano-configurations.component.mjs +8 -3
  16. package/esm2022/lib/components/plano-library/fixture-library/fixture-library.component.mjs +28 -5
  17. package/esm2022/lib/components/plano-tools/cad-render/cad-render.component.mjs +3 -3
  18. package/esm2022/lib/components/plano-tools/delete-floor/delete-floor.component.mjs +3 -3
  19. package/esm2022/lib/components/plano-tools/layout-touchup/layout-touchup.component.mjs +3 -3
  20. package/esm2022/lib/components/plano-tools/plano-migrate/plano-migrate.component.mjs +3 -3
  21. package/esm2022/lib/components/plano-tools/tool-page-header/tool-page-header.component.mjs +3 -3
  22. package/esm2022/lib/components/plano-tools/tools-parent/tools-parent.component.mjs +3 -3
  23. package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +3 -3
  24. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +3 -3
  25. package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +3 -3
  26. package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +3 -3
  27. package/esm2022/lib/components/popups/publish-plano-modal/publish-plano-modal.component.mjs +1 -1
  28. package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -3
  29. package/esm2022/lib/components/store-plano/store-plano.component.mjs +3 -3
  30. package/esm2022/lib/functions/feature-access.guard.mjs +20 -0
  31. package/esm2022/lib/functions/plano.function.mjs +22 -1
  32. package/esm2022/lib/services/store-builder.service.mjs +15 -3
  33. package/esm2022/lib/tango-store-builder-routing.module.mjs +11 -1
  34. package/esm2022/lib/tango-store-builder.module.mjs +5 -2
  35. package/fesm2022/tango-app-ui-store-builder.mjs +318 -61
  36. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  37. package/lib/components/access-denied/access-denied.component.d.ts +18 -0
  38. package/lib/components/fixture-template-table/fixture-template-table.component.d.ts +6 -0
  39. package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +2 -2
  40. package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +5 -5
  41. package/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.d.ts +1 -0
  42. package/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.d.ts +1 -0
  43. package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +8 -0
  44. package/lib/components/plano-library/fixture-library/fixture-library.component.d.ts +5 -1
  45. package/lib/functions/feature-access.guard.d.ts +9 -0
  46. package/lib/functions/plano.function.d.ts +9 -0
  47. package/lib/services/store-builder.service.d.ts +6 -0
  48. package/lib/tango-store-builder.module.d.ts +38 -37
  49. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  import { Component, EventEmitter, Input, Output, } from "@angular/core";
2
2
  import { Subject, takeUntil } from "rxjs";
3
3
  import { ActionConfirmPopupComponent } from "./action-confirm-popup/action-confirm-popup.component";
4
+ import { getFixtureProductCapacity } from "../../../functions/plano.function";
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "tango-app-ui-global";
6
7
  import * as i2 from "@ng-bootstrap/ng-bootstrap";
@@ -23,6 +24,11 @@ export class VerificationFeedbackComponent {
23
24
  currentFixtureIndex;
24
25
  planoFixture;
25
26
  aiFixture;
27
+ // Live fixture capacity = sum of individual shelf capacities (see plano.function),
28
+ // kept consistent with the planogram canvas instead of the stored fixtureCapacity.
29
+ get planoFixtureCapacity() {
30
+ return getFixtureProductCapacity(this.planoFixture?.shelfConfig);
31
+ }
26
32
  selectedImageForPreview = null;
27
33
  imagePreviewZoom = 1;
28
34
  imagePreviewPanX = 0;
@@ -539,11 +545,11 @@ export class VerificationFeedbackComponent {
539
545
  this.destroy$.complete();
540
546
  }
541
547
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VerificationFeedbackComponent, deps: [{ token: i1.GlobalStateService }, { token: i2.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
542
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: VerificationFeedbackComponent, selector: "lib-verification-feedback", inputs: { floorData: "floorData", totalFixtures: "totalFixtures", feedbackDetails: "feedbackDetails", cdn: "cdn", showAction: "showAction" }, outputs: { changeFixture: "changeFixture", action: "action" }, usesOnChanges: true, ngImport: i0, template: "<section id=\"verification-feedback\">\r\n\r\n <div *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\" id=\"task-info\" ngbAccordion #accordion=\"ngbAccordion\">\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"feedbackDetails?.taskInfoToggle\">\r\n <div ngbAccordionHeader ngbAccordionToggle class=\"accordion-button task-info-header\">\r\n <div class=\"w-100\">\r\n <h2>Fixture verification assigned</h2>\r\n <p>{{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"log-block\">\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{feedbackDetails?.fixtureFeedback?.taskData?.createdByName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mma, dd MMM yyyy'}}\r\n </p>\r\n <h5>Assigner</h5>\r\n </div>\r\n </div>\r\n\r\n <div class=\"log-block\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4> {{feedbackDetails?.fixtureFeedback?.taskData?.userName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.submitTime_string}}\r\n </p>\r\n <h5>Assignee</h5>\r\n </div>\r\n </div>\r\n\r\n\r\n @if (feedbackDetails?.globalComments?.length) {\r\n <h5 class=\"mb-2\">Comments</h5>\r\n <div class=\"log-block\" *ngFor=\"let c of feedbackDetails?.globalComments;let i= index\">\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n <h5>{{c?.comment}}</h5>\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\">\r\n\r\n <div id=\"feedback-handler\" class=\"d-flex align-items-center gap-6 my-6 px-3 fixture-navigate\">\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n\r\n <h3 class=\"m-0\">{{planoFixture?.header?.label}}</h3>\r\n\r\n <div class=\"d-flex align-items-center gap-3 flex-wrap\">\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span *ngIf=\"planoFixture?.fixtureCategory\" class=\"badge inactive me-1\">\r\n {{ planoFixture.fixtureCategory | titlecase}}\r\n </span>\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span *ngIf=\"planoFixture?.fixtureWidth?.value\" class=\"badge inactive me-1\">\r\n {{ planoFixture.fixtureWidth.value }} {{ planoFixture.fixtureWidth?.unit ?? 'ft' }}\r\n </span>\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span class=\"badge inactive me-1\">\r\n Fixture Capacity: {{ planoFixture?.fixtureCapacity || 0 }}\r\n </span>\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span class=\"badge inactive me-1\">\r\n Visual Merch Capacity: {{ planoFixture?.vmConfig?.length || 0 }}\r\n </span>\r\n\r\n </div>\r\n\r\n <h3 *ngIf=\"showAction\" class=\"m-0 ms-auto\">\r\n {{currentFixtureIndex}}/{{totalFixtures.length}}\r\n </h3>\r\n\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n </div>\r\n\r\n @if( this.aiFixture?.fixtureId){\r\n <div id=\"fixture-comparison\" class=\"row g-0 my-3\">\r\n @if (showAction) {\r\n <div class=\"col-4 p-2\">\r\n <div class=\"wrapper\">\r\n <div class=\"d-flex align-items-center gap-3\">\r\n @if (!isApproved && showAction) {\r\n <button class=\"btn quick-btn ms-auto\" type=\"button\" (click)=\"onEditFeedback()\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n\r\n <button class=\"btn primary-btn\" type=\"button\" (click)=\"onClickKeepPlano()\"\r\n [disabled]=\"isAIQuickEdit\">\r\n Keep plano\r\n </button>\r\n }\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <h4 class=\"m-0\">Existing template </h4>\r\n <svg [ngbTooltip]=\"planoFixture?.fixtureName\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_496_31664)\">\r\n <path\r\n d=\"M10.0013 13.3337V10.0003M10.0013 6.66699H10.0096M18.3346 10.0003C18.3346 14.6027 14.6037 18.3337 10.0013 18.3337C5.39893 18.3337 1.66797 14.6027 1.66797 10.0003C1.66797 5.39795 5.39893 1.66699 10.0013 1.66699C14.6037 1.66699 18.3346 5.39795 18.3346 10.0003Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_496_31664\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n </div>\r\n\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'keepPlano' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithPlano' \"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n }\r\n </div>\r\n </div>\r\n <fixture [fixture]=\"planoFixture\"></fixture>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-4 p-2\">\r\n <div class=\"wrapper\">\r\n @if (!isApproved && showAction) {\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <button class=\"btn redo-btn\" (click)=\"onClickRedo()\" [class.disabled]=\"isAIQuickEdit\" *ngIf=\"!feedbackDetails?.fixtureFeedback?.hideRedo\">\r\n Redo\r\n </button>\r\n\r\n <button class=\"btn quick-btn ms-auto\" type=\"button\" (click)=\"onEditAIFeedback()\"\r\n [disabled]=\"isAIQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n\r\n <button class=\"btn primary-btn\" type=\"button\" (click)=\"onClickAcceptAI()\"\r\n [disabled]=\"isAIQuickEdit\">\r\n Accept store response\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M15.6504 14.6191H4.34863V10.7373C4.23826 10.7455 4.12644 10.75 4.01367 10.75C3.97137 10.75 3.92943 10.7463 3.8877 10.7451V15.8037C3.88788 16.447 4.42222 16.9883 5.09863 16.9883H14.9004C15.5768 16.9883 16.1102 16.447 16.1104 15.8037V10.7451C16.0708 10.7462 16.0311 10.75 15.9912 10.75C15.8768 10.75 15.7629 10.7449 15.6504 10.7363V14.6191ZM15.4639 3.01172H4.53418C4.48723 3.01187 4.44973 3.03776 4.43457 3.06152V3.0625L2.67871 5.80371L2.66016 5.83301C2.04768 6.82786 2.64325 8.11739 3.73438 8.26367C3.83174 8.27561 3.92224 8.28222 4.01074 8.28223C4.58889 8.28223 5.09978 8.03419 5.45605 7.64746L6.00977 7.04688L6.56152 7.64941C6.91341 8.03371 7.42301 8.28215 8.00488 8.28223C8.58433 8.28223 9.09759 8.03349 9.44922 7.64941L10.002 7.04492L10.5557 7.64941C10.9073 8.03349 11.4206 8.28223 12 8.28223C12.5792 8.2821 13.0918 8.03337 13.4434 7.64941L13.9971 7.04492L14.5498 7.64941C14.9014 8.03349 15.4147 8.28223 15.9941 8.28223C16.0791 8.28222 16.1716 8.27533 16.2676 8.26367C17.3635 8.11504 17.9623 6.8008 17.3232 5.80371L15.5645 3.0625L15.5635 3.06152C15.5483 3.03769 15.511 3.01172 15.4639 3.01172Z\"\r\n stroke=\"#101828\" stroke-width=\"1.5\" />\r\n </svg>\r\n\r\n\r\n <h4>Store response </h4>\r\n <span class=\"badge inactive me-1\" *ngIf=\"!isAIQuickEdit\">\r\n Capacity: {{aiFixture?.fixtureCapacity || 0 }}\r\n </span>\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'acceptAi' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithAi'\"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'redo' \"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.25065 15.8335C6.90343 15.8335 5.74704 15.396 4.78148 14.521C3.81593 13.646 3.33343 12.5557 3.33398 11.2502C3.33398 9.94461 3.81676 8.85433 4.78232 7.97933C5.74787 7.10433 6.90398 6.66683 8.25065 6.66683H13.5007L11.334 4.50016L12.5007 3.3335L16.6673 7.50016L12.5007 11.6668L11.334 10.5002L13.5007 8.3335H8.25065C7.37565 8.3335 6.6151 8.61127 5.96898 9.16683C5.32287 9.72238 5.0001 10.4168 5.00065 11.2502C5.00065 12.0835 5.32371 12.7779 5.96982 13.3335C6.61593 13.8891 7.37621 14.1668 8.25065 14.1668H14.1673V15.8335H8.25065Z\"\r\n fill=\"black\" />\r\n </svg>\r\n }@else {\r\n <svg *ngIf=\"showAction && !isAIQuickEdit\" class=\"ms-auto cursor-pointer\"\r\n (click)=\"toggleAIQuickEdit()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n\r\n\r\n </div>\r\n </div>\r\n <editable-fixture [fixture]=\"aiFixture\" [editMode]=\"isAIQuickEdit\"\r\n (onCancel)=\"onCancelAIQuickEdit()\" (onDone)=\"onSaveAIQuickEdit($event)\"\r\n (editTab)=\"onEditAIFeedback($event)\"></editable-fixture>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"p-2\" [ngClass]=\"{'col-4':showAction,'col':!showAction}\">\r\n <div class=\"wrapper\">\r\n <div class=\"mb-4\" [ngStyle]=\"{'margin-top':showAction && !isApproved ? '50px' : '12px'}\">\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <h4>Store Image </h4>\r\n </div>\r\n </div>\r\n @if(cdn && aiFixture?.fixtureImage){\r\n <div class=\"fixture-image\" (click)=\"onClickImagePreview($event, cdn + aiFixture?.fixtureImage)\">\r\n @if(isImageLoading) {\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n }\r\n <img [src]=\"cdn + aiFixture?.fixtureImage\" \r\n alt=\"Store response image\"\r\n [style.display]=\"isImageLoading ? 'none' : 'block'\"\r\n (loadstart)=\"onImageLoadStart()\"\r\n (load)=\"onImageLoad()\"\r\n (error)=\"onImageError()\"\r\n (loadend)=\"onImageLoadEnd()\">\r\n </div>\r\n }@else {\r\n <div class=\"text-center my-7\">\r\n <svg width=\"186\" height=\"84\" viewBox=\"0 0 186 84\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M130.256 15.3284C140.092 15.3284 148.065 23.302 148.065 33.1379C148.065 37.2176 150.826 41.8684 154.906 41.8684H167.972C177.807 41.8687 185.781 49.8422 185.781 59.678C185.781 69.5141 177.807 77.4885 167.971 77.4885H81.3662C69.7186 77.4883 58.6349 68.4084 46.9873 68.4084H5.93652C2.65782 68.4084 0 65.7506 0 62.4719C0.000127823 59.1933 2.6579 56.5354 5.93652 56.5354H61.8728C63.0069 56.5354 63.9669 55.6929 64.2897 54.6056C64.7994 52.8892 63.6267 50.9485 61.8361 50.9485H43.6514C33.8153 50.9485 25.8418 42.974 25.8418 33.1379C25.842 23.302 33.8154 15.3284 43.6514 15.3284H130.256Z\"\r\n fill=\"#EAECF0\" />\r\n <path\r\n d=\"M126.664 27.335V48.65L120.959 43.75C118.229 41.405 113.819 41.405 111.089 43.75L96.5291 56.245C93.7991 58.59 89.3891 58.59 86.6591 56.245L85.4691 55.265C82.9841 53.095 79.0291 52.885 76.2291 54.775L59.0091 66.325L58.6241 66.605C57.3291 63.805 56.6641 60.48 56.6641 56.665V27.335C56.6641 14.595 64.2591 7 76.9991 7H106.329C119.069 7 126.664 14.595 126.664 27.335Z\"\r\n fill=\"#6BCAFF\" />\r\n <path\r\n d=\"M81.164 36.3299C85.7645 36.3299 89.494 32.6005 89.494 27.9999C89.494 23.3994 85.7645 19.6699 81.164 19.6699C76.5635 19.6699 72.834 23.3994 72.834 27.9999C72.834 32.6005 76.5635 36.3299 81.164 36.3299Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M126.665 48.65V56.665C126.665 69.405 119.07 77 106.33 77H77C68.075 77 61.635 73.255 58.625 66.605L59.01 66.325L76.23 54.775C79.03 52.885 82.985 53.095 85.47 55.265L86.66 56.245C89.39 58.59 93.8 58.59 96.53 56.245L111.09 43.75C113.82 41.405 118.23 41.405 120.96 43.75L126.665 48.65Z\"\r\n fill=\"#00A3FF\" />\r\n <circle cx=\"138.064\" cy=\"28.3128\" r=\"4.40042\" fill=\"#6BCAFF\" />\r\n <circle cx=\"47.8256\" cy=\"39.2409\" r=\"2.45255\" fill=\"#6BCAFF\" />\r\n <ellipse cx=\"139.183\" cy=\"61.0072\" rx=\"4.29197\" ry=\"4.59854\" fill=\"#00A3FF\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"vm-comparison\" *ngIf=\"feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig.length\">\r\n <h5 class=\"mb-1\">Visual Merchandise Images from AI output:</h5>\r\n\r\n <div class=\"row g-0\">\r\n\r\n @for (vm of feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig; track $index) {\r\n <div class=\"p-2\" [ngClass]=\"{'col-6':showAction, 'col-12':!showAction}\">\r\n <div class=\"vm-container\" (click)=\"onClickImagePreview($event, cdn+vm?.vmImage)\">\r\n <div class=\"vm-img\">\r\n <img [src]=\"cdn+vm?.vmImage\" alt=\"VM Image\">\r\n </div>\r\n <div class=\"d-flex flex-column gap-2 vm-details \">\r\n <h5>{{vm?.vmType}}</h5>\r\n <h5>{{vm?.vmName}}</h5>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"my-6\">\r\n <div class=\"text-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n <path\r\n d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <div class=\"mt-3 text-center\">\r\n <div class=\"fw-bold h3 mt-2\">No response</div>\r\n <div class=\"mt-4\">No AI response found for this fixture.</div>\r\n </div>\r\n </div>\r\n }\r\n\r\n\r\n @if (feedbackDetails?.fixtureFeedback?.answers?.[0]?.comments.length) {\r\n <div id=\"fixture-comments\">\r\n <h5 class=\"mb-2\">Comments</h5>\r\n\r\n <div class=\"log-block\"\r\n *ngFor=\"let c of feedbackDetails?.fixtureFeedback?.answers[0]?.comments;let i= index\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n\r\n @if(c?.responsetype === 'comment'){\r\n <h5>{{c?.comment}}</h5>\r\n }@else if(c?.responsetype === 'agree'){\r\n\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'keepPlano'\">\r\n Marked as \"Keep Plano\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithPlano'\">\r\n Marked as \"Keep Plano with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'acceptAi'\">\r\n Marked as \"Accept AI\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithAi'\">\r\n Marked as \"Accept AI with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }@else if(c?.responsetype === 'disagree'){\r\n <h5>\r\n Marked as \"Redo\"\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"img-preview\" *ngIf=\"selectedImageForPreview\" (click)=\"closeImagePreview()\">\r\n <button class=\"preview-close\" (click)=\"$event.stopPropagation(); closeImagePreview()\">&#x2715;</button>\r\n <div class=\"preview-zoom-controls\" (click)=\"$event.stopPropagation()\">\r\n <button (click)=\"onPreviewZoomOut()\">&#x2212;</button>\r\n <input type=\"range\" class=\"zoom-slider\" min=\"25\" max=\"500\" step=\"25\"\r\n [value]=\"imagePreviewZoom * 100\"\r\n (input)=\"onPreviewZoomSlider($event)\" />\r\n <span>{{ (imagePreviewZoom * 100).toFixed(0) }}%</span>\r\n <button (click)=\"onPreviewZoomIn()\">&#x2B;</button>\r\n </div>\r\n <div class=\"preview-image-container\" (click)=\"$event.stopPropagation()\"\r\n (mousedown)=\"onPreviewPanStart($event)\"\r\n (mousemove)=\"onPreviewPanMove($event)\"\r\n (mouseup)=\"onPreviewPanEnd()\"\r\n (mouseleave)=\"onPreviewPanEnd()\"\r\n (wheel)=\"onPreviewWheel($event)\">\r\n <img [src]=\"selectedImageForPreview\" class=\"full-img\"\r\n [style.transform]=\"'scale(' + imagePreviewZoom + ') translate(' + imagePreviewPanX / imagePreviewZoom + 'px,' + imagePreviewPanY / imagePreviewZoom + 'px)'\"\r\n draggable=\"false\" />\r\n </div>\r\n </div>\r\n\r\n <ng-template #skeletonLoader>\r\n <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n <div class=\"shimmer rounded\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</section>", styles: [".nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#verification-feedback{height:100%;overflow-y:auto}#verification-feedback .fixture-navigate,#verification-feedback .task-info-header{user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#verification-feedback h5{color:#1d2939;font-family:Inter;font-weight:600;font-size:12px;line-height:18px;margin:0}#verification-feedback .log-block{display:flex;gap:12px;padding:4px;margin-bottom:18px}#verification-feedback .log-block h4{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback .log-block p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085;margin:0}#verification-feedback #task-info .task-info-header{background-color:#fff!important;padding:6px;width:100%}#verification-feedback #task-info .task-info-header h2{font-weight:600;font-size:14px;line-height:20px;color:#1d2939}#verification-feedback #task-info .task-info-header p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085}#verification-feedback #fixture-quick-details .quick-edit-container{background:#f9fafb;padding:12px;border-radius:6px;width:100%;height:100%}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn{font-size:13px!important;line-height:10px!important;padding:6px 8px!important;border:1px solid rgb(208,213,221);box-shadow:0 1px 2px #1018280d;background:#fff}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-quick-details .quick-edit-container .redo-btn{font-family:Inter;font-weight:600;font-size:14px;line-height:18px;color:#1d2939;cursor:pointer}#verification-feedback #fixture-quick-details .quick-edit-container h4{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;color:#1d2939;margin:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .label{font-family:Inter;font-weight:500;font-size:14px;line-height:20px;color:#475467;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .value{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .diff .value{color:#d92d20!important;font-weight:600}#verification-feedback #fixture-quick-details .quick-edit-container .edit-input{padding:0 4px;border-radius:4px;width:50%;height:20px}#verification-feedback #fixture-comparison .wrapper{padding:12px;background:#f9fafb;border-radius:4px;height:100%}#verification-feedback #fixture-comparison .primary-btn{font-weight:600;font-size:12px;padding:8px 16px;line-height:18px;border-radius:8px;color:#009bf3;background:#eaf8ff;box-shadow:0 1px 2px #1018280d}#verification-feedback #fixture-comparison .primary-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison .btn-outline-cus{font-weight:600;font-size:12px;padding:8px 16px;line-height:18px;border-radius:8px;box-shadow:0 1px 2px #1018280d}#verification-feedback #fixture-comparison .btn-outline-cus:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison .quick-btn{font-size:13px!important;line-height:10px!important;padding:6px 8px!important;border:1px solid rgb(208,213,221);box-shadow:0 1px 2px #1018280d;background:#fff}#verification-feedback #fixture-comparison .quick-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison .redo-btn{font-weight:600;font-size:12px;padding:8px 16px;line-height:18px;border-radius:8px;color:#344054;background:#fff;border:1px solid #d0d5dd;box-shadow:0 1px 2px #1018280d}#verification-feedback #fixture-comparison .redo-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #fixture-comparison h4{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;color:#1d2939;margin:0}#verification-feedback #fixture-comparison p{font-weight:400;font-size:12px;line-height:18px;color:#475467;margin:0}#verification-feedback #fixture-comparison .fixture-image{margin-bottom:12px}#verification-feedback #fixture-comparison .fixture-image img{object-fit:contain;width:100%}#verification-feedback #vm-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #vm-comparison .vm-container{padding:12px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);display:flex;gap:12px;cursor:pointer}#verification-feedback #vm-comparison .vm-container .vm-img{width:134px;height:134px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);background:var(--Gray-50, #f9fafb)}#verification-feedback #vm-comparison .vm-container .vm-img img{border-radius:2px;min-width:132px;min-height:134px;object-fit:contain;width:100%;height:100%;display:block}#verification-feedback #vm-comparison .vm-container .vm-details,#verification-feedback #vm-comparison .vm-container .vm-details h5{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#verification-feedback .img-preview{position:fixed;inset:0;background:#000000d9;display:flex;align-items:center;justify-content:center;z-index:9999;cursor:default}#verification-feedback .preview-close{position:absolute;top:16px;right:16px;background:#ffffff26;border:none;color:#fff;font-size:20px;width:36px;height:36px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;z-index:10000}#verification-feedback .preview-close:hover{background:#ffffff4d}#verification-feedback .preview-zoom-controls{position:absolute;bottom:24px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:12px;background:#ffffff26;border-radius:8px;padding:6px 16px;z-index:10000}#verification-feedback .preview-zoom-controls span{color:#fff;font-size:14px;min-width:48px;text-align:center;-webkit-user-select:none;user-select:none}#verification-feedback .preview-zoom-controls button{background:none;border:none;color:#fff;font-size:18px;cursor:pointer;width:28px;height:28px;border-radius:4px;display:flex;align-items:center;justify-content:center}#verification-feedback .preview-zoom-controls button:hover{background:#fff3}#verification-feedback .preview-zoom-controls .zoom-slider{-webkit-appearance:none;appearance:none;width:120px;height:4px;background:#ffffff4d;border-radius:2px;outline:none;cursor:pointer}#verification-feedback .preview-zoom-controls .zoom-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:#fff;cursor:pointer}#verification-feedback .preview-zoom-controls .zoom-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:#fff;border:none;cursor:pointer}#verification-feedback .preview-image-container{overflow:hidden;display:flex;align-items:center;justify-content:center;width:90vw;height:85vh;cursor:default}#verification-feedback .preview-image-container:active{cursor:grabbing}#verification-feedback .full-img{max-width:90vw;max-height:85vh;border-radius:10px;object-fit:contain;cursor:grab;-webkit-user-select:none;user-select:none}#verification-feedback .full-img:active{cursor:grabbing}#verification-feedback .disabled{pointer-events:none;cursor:not-allowed!important;opacity:.6}.loader .shimmer{height:unset}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i2.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i2.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i2.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i2.NgbAccordionToggle, selector: "[ngbAccordionToggle]" }, { kind: "directive", type: i2.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i2.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: i4.FixtureComponent, selector: "fixture", inputs: ["fixture", "showColors", "showVMs", "showBCs", "showHeaderFooterAlways"] }, { kind: "component", type: i5.EditableFixtureComponent, selector: "editable-fixture", inputs: ["fixture", "showColors", "showVMs", "showBCs", "editMode"], outputs: ["onCancel", "onDone", "editTab"] }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i3.DatePipe, name: "date" }] });
548
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: VerificationFeedbackComponent, selector: "lib-verification-feedback", inputs: { floorData: "floorData", totalFixtures: "totalFixtures", feedbackDetails: "feedbackDetails", cdn: "cdn", showAction: "showAction" }, outputs: { changeFixture: "changeFixture", action: "action" }, usesOnChanges: true, ngImport: i0, template: "<section id=\"verification-feedback\">\r\n\r\n <div *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\" id=\"task-info\" ngbAccordion #accordion=\"ngbAccordion\">\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"feedbackDetails?.taskInfoToggle\">\r\n <div ngbAccordionHeader ngbAccordionToggle class=\"accordion-button task-info-header\">\r\n <div class=\"w-100\">\r\n <h2>Fixture verification assigned</h2>\r\n <p>{{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"log-block\">\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{feedbackDetails?.fixtureFeedback?.taskData?.createdByName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mma, dd MMM yyyy'}}\r\n </p>\r\n <h5>Assigner</h5>\r\n </div>\r\n </div>\r\n\r\n <div class=\"log-block\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4> {{feedbackDetails?.fixtureFeedback?.taskData?.userName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.submitTime_string}}\r\n </p>\r\n <h5>Assignee</h5>\r\n </div>\r\n </div>\r\n\r\n\r\n @if (feedbackDetails?.globalComments?.length) {\r\n <h5 class=\"mb-2\">Comments</h5>\r\n <div class=\"log-block\" *ngFor=\"let c of feedbackDetails?.globalComments;let i= index\">\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n <h5>{{c?.comment}}</h5>\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\">\r\n\r\n <div id=\"feedback-handler\" class=\"d-flex align-items-center gap-6 my-6 px-3 fixture-navigate\">\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n\r\n <h3 class=\"m-0\">{{planoFixture?.header?.label}}</h3>\r\n\r\n <div class=\"d-flex align-items-center gap-3 flex-wrap\">\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span *ngIf=\"planoFixture?.fixtureCategory\" class=\"badge inactive me-1\">\r\n {{ planoFixture.fixtureCategory | titlecase}}\r\n </span>\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span *ngIf=\"planoFixture?.fixtureWidth?.value\" class=\"badge inactive me-1\">\r\n {{ planoFixture.fixtureWidth.value }} {{ planoFixture.fixtureWidth?.unit ?? 'ft' }}\r\n </span>\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span class=\"badge inactive me-1\">\r\n Fixture Capacity: {{ planoFixtureCapacity }}\r\n </span>\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span class=\"badge inactive me-1\">\r\n Visual Merch Capacity: {{ planoFixture?.vmConfig?.length || 0 }}\r\n </span>\r\n\r\n </div>\r\n\r\n <h3 *ngIf=\"showAction\" class=\"m-0 ms-auto\">\r\n {{currentFixtureIndex}}/{{totalFixtures.length}}\r\n </h3>\r\n\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n </div>\r\n\r\n @if( this.aiFixture?.fixtureId){\r\n <div id=\"fixture-comparison\" class=\"row g-0 my-3\">\r\n @if (showAction) {\r\n <div class=\"col-4 p-2\">\r\n <div class=\"wrapper\">\r\n <div class=\"d-flex align-items-center gap-3\">\r\n @if (!isApproved && showAction) {\r\n <button class=\"btn quick-btn ms-auto\" type=\"button\" (click)=\"onEditFeedback()\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n\r\n <button class=\"btn primary-btn\" type=\"button\" (click)=\"onClickKeepPlano()\"\r\n [disabled]=\"isAIQuickEdit\">\r\n Keep plano\r\n </button>\r\n }\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <h4 class=\"m-0\">Existing template </h4>\r\n <svg [ngbTooltip]=\"planoFixture?.fixtureName\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_496_31664)\">\r\n <path\r\n d=\"M10.0013 13.3337V10.0003M10.0013 6.66699H10.0096M18.3346 10.0003C18.3346 14.6027 14.6037 18.3337 10.0013 18.3337C5.39893 18.3337 1.66797 14.6027 1.66797 10.0003C1.66797 5.39795 5.39893 1.66699 10.0013 1.66699C14.6037 1.66699 18.3346 5.39795 18.3346 10.0003Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_496_31664\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n </div>\r\n\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'keepPlano' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithPlano' \"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n }\r\n </div>\r\n </div>\r\n <fixture [fixture]=\"planoFixture\"></fixture>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-4 p-2\">\r\n <div class=\"wrapper\">\r\n @if (!isApproved && showAction) {\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <button class=\"btn redo-btn\" (click)=\"onClickRedo()\" [class.disabled]=\"isAIQuickEdit\" *ngIf=\"!feedbackDetails?.fixtureFeedback?.hideRedo\">\r\n Redo\r\n </button>\r\n\r\n <button class=\"btn quick-btn ms-auto\" type=\"button\" (click)=\"onEditAIFeedback()\"\r\n [disabled]=\"isAIQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n\r\n <button class=\"btn primary-btn\" type=\"button\" (click)=\"onClickAcceptAI()\"\r\n [disabled]=\"isAIQuickEdit\">\r\n Accept store response\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M15.6504 14.6191H4.34863V10.7373C4.23826 10.7455 4.12644 10.75 4.01367 10.75C3.97137 10.75 3.92943 10.7463 3.8877 10.7451V15.8037C3.88788 16.447 4.42222 16.9883 5.09863 16.9883H14.9004C15.5768 16.9883 16.1102 16.447 16.1104 15.8037V10.7451C16.0708 10.7462 16.0311 10.75 15.9912 10.75C15.8768 10.75 15.7629 10.7449 15.6504 10.7363V14.6191ZM15.4639 3.01172H4.53418C4.48723 3.01187 4.44973 3.03776 4.43457 3.06152V3.0625L2.67871 5.80371L2.66016 5.83301C2.04768 6.82786 2.64325 8.11739 3.73438 8.26367C3.83174 8.27561 3.92224 8.28222 4.01074 8.28223C4.58889 8.28223 5.09978 8.03419 5.45605 7.64746L6.00977 7.04688L6.56152 7.64941C6.91341 8.03371 7.42301 8.28215 8.00488 8.28223C8.58433 8.28223 9.09759 8.03349 9.44922 7.64941L10.002 7.04492L10.5557 7.64941C10.9073 8.03349 11.4206 8.28223 12 8.28223C12.5792 8.2821 13.0918 8.03337 13.4434 7.64941L13.9971 7.04492L14.5498 7.64941C14.9014 8.03349 15.4147 8.28223 15.9941 8.28223C16.0791 8.28222 16.1716 8.27533 16.2676 8.26367C17.3635 8.11504 17.9623 6.8008 17.3232 5.80371L15.5645 3.0625L15.5635 3.06152C15.5483 3.03769 15.511 3.01172 15.4639 3.01172Z\"\r\n stroke=\"#101828\" stroke-width=\"1.5\" />\r\n </svg>\r\n\r\n\r\n <h4>Store response </h4>\r\n <span class=\"badge inactive me-1\" *ngIf=\"!isAIQuickEdit\">\r\n Capacity: {{aiFixture?.fixtureCapacity || 0 }}\r\n </span>\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'acceptAi' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithAi'\"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'redo' \"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.25065 15.8335C6.90343 15.8335 5.74704 15.396 4.78148 14.521C3.81593 13.646 3.33343 12.5557 3.33398 11.2502C3.33398 9.94461 3.81676 8.85433 4.78232 7.97933C5.74787 7.10433 6.90398 6.66683 8.25065 6.66683H13.5007L11.334 4.50016L12.5007 3.3335L16.6673 7.50016L12.5007 11.6668L11.334 10.5002L13.5007 8.3335H8.25065C7.37565 8.3335 6.6151 8.61127 5.96898 9.16683C5.32287 9.72238 5.0001 10.4168 5.00065 11.2502C5.00065 12.0835 5.32371 12.7779 5.96982 13.3335C6.61593 13.8891 7.37621 14.1668 8.25065 14.1668H14.1673V15.8335H8.25065Z\"\r\n fill=\"black\" />\r\n </svg>\r\n }@else {\r\n <svg *ngIf=\"showAction && !isAIQuickEdit\" class=\"ms-auto cursor-pointer\"\r\n (click)=\"toggleAIQuickEdit()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n\r\n\r\n </div>\r\n </div>\r\n <editable-fixture [fixture]=\"aiFixture\" [editMode]=\"isAIQuickEdit\"\r\n (onCancel)=\"onCancelAIQuickEdit()\" (onDone)=\"onSaveAIQuickEdit($event)\"\r\n (editTab)=\"onEditAIFeedback($event)\"></editable-fixture>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"p-2\" [ngClass]=\"{'col-4':showAction,'col':!showAction}\">\r\n <div class=\"wrapper\">\r\n <div class=\"mb-4\" [ngStyle]=\"{'margin-top':showAction && !isApproved ? '50px' : '12px'}\">\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <h4>Store Image </h4>\r\n </div>\r\n </div>\r\n @if(cdn && aiFixture?.fixtureImage){\r\n <div class=\"fixture-image\" (click)=\"onClickImagePreview($event, cdn + aiFixture?.fixtureImage)\">\r\n @if(isImageLoading) {\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n }\r\n <img [src]=\"cdn + aiFixture?.fixtureImage\" \r\n alt=\"Store response image\"\r\n [style.display]=\"isImageLoading ? 'none' : 'block'\"\r\n (loadstart)=\"onImageLoadStart()\"\r\n (load)=\"onImageLoad()\"\r\n (error)=\"onImageError()\"\r\n (loadend)=\"onImageLoadEnd()\">\r\n </div>\r\n }@else {\r\n <div class=\"text-center my-7\">\r\n <svg width=\"186\" height=\"84\" viewBox=\"0 0 186 84\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M130.256 15.3284C140.092 15.3284 148.065 23.302 148.065 33.1379C148.065 37.2176 150.826 41.8684 154.906 41.8684H167.972C177.807 41.8687 185.781 49.8422 185.781 59.678C185.781 69.5141 177.807 77.4885 167.971 77.4885H81.3662C69.7186 77.4883 58.6349 68.4084 46.9873 68.4084H5.93652C2.65782 68.4084 0 65.7506 0 62.4719C0.000127823 59.1933 2.6579 56.5354 5.93652 56.5354H61.8728C63.0069 56.5354 63.9669 55.6929 64.2897 54.6056C64.7994 52.8892 63.6267 50.9485 61.8361 50.9485H43.6514C33.8153 50.9485 25.8418 42.974 25.8418 33.1379C25.842 23.302 33.8154 15.3284 43.6514 15.3284H130.256Z\"\r\n fill=\"#EAECF0\" />\r\n <path\r\n d=\"M126.664 27.335V48.65L120.959 43.75C118.229 41.405 113.819 41.405 111.089 43.75L96.5291 56.245C93.7991 58.59 89.3891 58.59 86.6591 56.245L85.4691 55.265C82.9841 53.095 79.0291 52.885 76.2291 54.775L59.0091 66.325L58.6241 66.605C57.3291 63.805 56.6641 60.48 56.6641 56.665V27.335C56.6641 14.595 64.2591 7 76.9991 7H106.329C119.069 7 126.664 14.595 126.664 27.335Z\"\r\n fill=\"#6BCAFF\" />\r\n <path\r\n d=\"M81.164 36.3299C85.7645 36.3299 89.494 32.6005 89.494 27.9999C89.494 23.3994 85.7645 19.6699 81.164 19.6699C76.5635 19.6699 72.834 23.3994 72.834 27.9999C72.834 32.6005 76.5635 36.3299 81.164 36.3299Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M126.665 48.65V56.665C126.665 69.405 119.07 77 106.33 77H77C68.075 77 61.635 73.255 58.625 66.605L59.01 66.325L76.23 54.775C79.03 52.885 82.985 53.095 85.47 55.265L86.66 56.245C89.39 58.59 93.8 58.59 96.53 56.245L111.09 43.75C113.82 41.405 118.23 41.405 120.96 43.75L126.665 48.65Z\"\r\n fill=\"#00A3FF\" />\r\n <circle cx=\"138.064\" cy=\"28.3128\" r=\"4.40042\" fill=\"#6BCAFF\" />\r\n <circle cx=\"47.8256\" cy=\"39.2409\" r=\"2.45255\" fill=\"#6BCAFF\" />\r\n <ellipse cx=\"139.183\" cy=\"61.0072\" rx=\"4.29197\" ry=\"4.59854\" fill=\"#00A3FF\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"vm-comparison\" *ngIf=\"feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig.length\">\r\n <h5 class=\"mb-1\">Visual Merchandise Images from AI output:</h5>\r\n\r\n <div class=\"row g-0\">\r\n\r\n @for (vm of feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig; track $index) {\r\n <div class=\"p-2\" [ngClass]=\"{'col-6':showAction, 'col-12':!showAction}\">\r\n <div class=\"vm-container\" (click)=\"onClickImagePreview($event, cdn+vm?.vmImage)\">\r\n <div class=\"vm-img\">\r\n <img [src]=\"cdn+vm?.vmImage\" alt=\"VM Image\">\r\n </div>\r\n <div class=\"d-flex flex-column gap-2 vm-details \">\r\n <h5>{{vm?.vmType}}</h5>\r\n <h5>{{vm?.vmName}}</h5>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"my-6\">\r\n <div class=\"text-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n <path\r\n d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <div class=\"mt-3 text-center\">\r\n <div class=\"fw-bold h3 mt-2\">No response</div>\r\n <div class=\"mt-4\">No AI response found for this fixture.</div>\r\n </div>\r\n </div>\r\n }\r\n\r\n\r\n @if (feedbackDetails?.fixtureFeedback?.answers?.[0]?.comments.length) {\r\n <div id=\"fixture-comments\">\r\n <h5 class=\"mb-2\">Comments</h5>\r\n\r\n <div class=\"log-block\"\r\n *ngFor=\"let c of feedbackDetails?.fixtureFeedback?.answers[0]?.comments;let i= index\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n\r\n @if(c?.responsetype === 'comment'){\r\n <h5>{{c?.comment}}</h5>\r\n }@else if(c?.responsetype === 'agree'){\r\n\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'keepPlano'\">\r\n Marked as \"Keep Plano\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithPlano'\">\r\n Marked as \"Keep Plano with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'acceptAi'\">\r\n Marked as \"Accept AI\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithAi'\">\r\n Marked as \"Accept AI with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }@else if(c?.responsetype === 'disagree'){\r\n <h5>\r\n Marked as \"Redo\"\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"img-preview\" *ngIf=\"selectedImageForPreview\" (click)=\"closeImagePreview()\">\r\n <button class=\"preview-close\" (click)=\"$event.stopPropagation(); closeImagePreview()\">&#x2715;</button>\r\n <div class=\"preview-zoom-controls\" (click)=\"$event.stopPropagation()\">\r\n <button (click)=\"onPreviewZoomOut()\">&#x2212;</button>\r\n <input type=\"range\" class=\"zoom-slider\" min=\"25\" max=\"500\" step=\"25\"\r\n [value]=\"imagePreviewZoom * 100\"\r\n (input)=\"onPreviewZoomSlider($event)\" />\r\n <span>{{ (imagePreviewZoom * 100).toFixed(0) }}%</span>\r\n <button (click)=\"onPreviewZoomIn()\">&#x2B;</button>\r\n </div>\r\n <div class=\"preview-image-container\" (click)=\"$event.stopPropagation()\"\r\n (mousedown)=\"onPreviewPanStart($event)\"\r\n (mousemove)=\"onPreviewPanMove($event)\"\r\n (mouseup)=\"onPreviewPanEnd()\"\r\n (mouseleave)=\"onPreviewPanEnd()\"\r\n (wheel)=\"onPreviewWheel($event)\">\r\n <img [src]=\"selectedImageForPreview\" class=\"full-img\"\r\n [style.transform]=\"'scale(' + imagePreviewZoom + ') translate(' + imagePreviewPanX / imagePreviewZoom + 'px,' + imagePreviewPanY / imagePreviewZoom + 'px)'\"\r\n draggable=\"false\" />\r\n </div>\r\n </div>\r\n\r\n <ng-template #skeletonLoader>\r\n <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n <div class=\"shimmer rounded\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</section>", styles: [".nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#verification-feedback{height:100%;overflow-y:auto}#verification-feedback .fixture-navigate,#verification-feedback .task-info-header{user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#verification-feedback h5{color:#1d2939;font-family:Inter;font-weight:600;font-size:12px;line-height:18px;margin:0}#verification-feedback .log-block{display:flex;gap:12px;padding:4px;margin-bottom:18px}#verification-feedback .log-block h4{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback .log-block p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085;margin:0}#verification-feedback #task-info .task-info-header{background-color:#fff!important;padding:6px;width:100%}#verification-feedback #task-info .task-info-header h2{font-weight:600;font-size:14px;line-height:20px;color:#1d2939}#verification-feedback #task-info .task-info-header p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085}#verification-feedback #fixture-quick-details .quick-edit-container{background:#f9fafb;padding:12px;border-radius:6px;width:100%;height:100%}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn{font-size:13px!important;line-height:10px!important;padding:6px 8px!important;border:1px solid rgb(208,213,221);box-shadow:0 1px 2px #1018280d;background:#fff}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-quick-details .quick-edit-container .redo-btn{font-family:Inter;font-weight:600;font-size:14px;line-height:18px;color:#1d2939;cursor:pointer}#verification-feedback #fixture-quick-details .quick-edit-container h4{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;color:#1d2939;margin:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .label{font-family:Inter;font-weight:500;font-size:14px;line-height:20px;color:#475467;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .value{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .diff .value{color:#d92d20!important;font-weight:600}#verification-feedback #fixture-quick-details .quick-edit-container .edit-input{padding:0 4px;border-radius:4px;width:50%;height:20px}#verification-feedback #fixture-comparison .wrapper{padding:12px;background:#f9fafb;border-radius:4px;height:100%}#verification-feedback #fixture-comparison .primary-btn{font-weight:600;font-size:12px;padding:8px 16px;line-height:18px;border-radius:8px;color:#009bf3;background:#eaf8ff;box-shadow:0 1px 2px #1018280d}#verification-feedback #fixture-comparison .primary-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison .btn-outline-cus{font-weight:600;font-size:12px;padding:8px 16px;line-height:18px;border-radius:8px;box-shadow:0 1px 2px #1018280d}#verification-feedback #fixture-comparison .btn-outline-cus:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison .quick-btn{font-size:13px!important;line-height:10px!important;padding:6px 8px!important;border:1px solid rgb(208,213,221);box-shadow:0 1px 2px #1018280d;background:#fff}#verification-feedback #fixture-comparison .quick-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison .redo-btn{font-weight:600;font-size:12px;padding:8px 16px;line-height:18px;border-radius:8px;color:#344054;background:#fff;border:1px solid #d0d5dd;box-shadow:0 1px 2px #1018280d}#verification-feedback #fixture-comparison .redo-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #fixture-comparison h4{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;color:#1d2939;margin:0}#verification-feedback #fixture-comparison p{font-weight:400;font-size:12px;line-height:18px;color:#475467;margin:0}#verification-feedback #fixture-comparison .fixture-image{margin-bottom:12px}#verification-feedback #fixture-comparison .fixture-image img{object-fit:contain;width:100%}#verification-feedback #vm-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #vm-comparison .vm-container{padding:12px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);display:flex;gap:12px;cursor:pointer}#verification-feedback #vm-comparison .vm-container .vm-img{width:134px;height:134px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);background:var(--Gray-50, #f9fafb)}#verification-feedback #vm-comparison .vm-container .vm-img img{border-radius:2px;min-width:132px;min-height:134px;object-fit:contain;width:100%;height:100%;display:block}#verification-feedback #vm-comparison .vm-container .vm-details,#verification-feedback #vm-comparison .vm-container .vm-details h5{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#verification-feedback .img-preview{position:fixed;inset:0;background:#000000d9;display:flex;align-items:center;justify-content:center;z-index:9999;cursor:default}#verification-feedback .preview-close{position:absolute;top:16px;right:16px;background:#ffffff26;border:none;color:#fff;font-size:20px;width:36px;height:36px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;z-index:10000}#verification-feedback .preview-close:hover{background:#ffffff4d}#verification-feedback .preview-zoom-controls{position:absolute;bottom:24px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:12px;background:#ffffff26;border-radius:8px;padding:6px 16px;z-index:10000}#verification-feedback .preview-zoom-controls span{color:#fff;font-size:14px;min-width:48px;text-align:center;-webkit-user-select:none;user-select:none}#verification-feedback .preview-zoom-controls button{background:none;border:none;color:#fff;font-size:18px;cursor:pointer;width:28px;height:28px;border-radius:4px;display:flex;align-items:center;justify-content:center}#verification-feedback .preview-zoom-controls button:hover{background:#fff3}#verification-feedback .preview-zoom-controls .zoom-slider{-webkit-appearance:none;appearance:none;width:120px;height:4px;background:#ffffff4d;border-radius:2px;outline:none;cursor:pointer}#verification-feedback .preview-zoom-controls .zoom-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:#fff;cursor:pointer}#verification-feedback .preview-zoom-controls .zoom-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:#fff;border:none;cursor:pointer}#verification-feedback .preview-image-container{overflow:hidden;display:flex;align-items:center;justify-content:center;width:90vw;height:85vh;cursor:default}#verification-feedback .preview-image-container:active{cursor:grabbing}#verification-feedback .full-img{max-width:90vw;max-height:85vh;border-radius:10px;object-fit:contain;cursor:grab;-webkit-user-select:none;user-select:none}#verification-feedback .full-img:active{cursor:grabbing}#verification-feedback .disabled{pointer-events:none;cursor:not-allowed!important;opacity:.6}.loader .shimmer{height:unset}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i2.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i2.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i2.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i2.NgbAccordionToggle, selector: "[ngbAccordionToggle]" }, { kind: "directive", type: i2.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i2.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: i4.FixtureComponent, selector: "fixture", inputs: ["fixture", "showColors", "showVMs", "showBCs", "showHeaderFooterAlways"] }, { kind: "component", type: i5.EditableFixtureComponent, selector: "editable-fixture", inputs: ["fixture", "showColors", "showVMs", "showBCs", "editMode"], outputs: ["onCancel", "onDone", "editTab"] }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i3.DatePipe, name: "date" }] });
543
549
  }
544
550
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VerificationFeedbackComponent, decorators: [{
545
551
  type: Component,
546
- args: [{ selector: "lib-verification-feedback", template: "<section id=\"verification-feedback\">\r\n\r\n <div *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\" id=\"task-info\" ngbAccordion #accordion=\"ngbAccordion\">\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"feedbackDetails?.taskInfoToggle\">\r\n <div ngbAccordionHeader ngbAccordionToggle class=\"accordion-button task-info-header\">\r\n <div class=\"w-100\">\r\n <h2>Fixture verification assigned</h2>\r\n <p>{{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"log-block\">\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{feedbackDetails?.fixtureFeedback?.taskData?.createdByName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mma, dd MMM yyyy'}}\r\n </p>\r\n <h5>Assigner</h5>\r\n </div>\r\n </div>\r\n\r\n <div class=\"log-block\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4> {{feedbackDetails?.fixtureFeedback?.taskData?.userName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.submitTime_string}}\r\n </p>\r\n <h5>Assignee</h5>\r\n </div>\r\n </div>\r\n\r\n\r\n @if (feedbackDetails?.globalComments?.length) {\r\n <h5 class=\"mb-2\">Comments</h5>\r\n <div class=\"log-block\" *ngFor=\"let c of feedbackDetails?.globalComments;let i= index\">\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n <h5>{{c?.comment}}</h5>\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\">\r\n\r\n <div id=\"feedback-handler\" class=\"d-flex align-items-center gap-6 my-6 px-3 fixture-navigate\">\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n\r\n <h3 class=\"m-0\">{{planoFixture?.header?.label}}</h3>\r\n\r\n <div class=\"d-flex align-items-center gap-3 flex-wrap\">\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span *ngIf=\"planoFixture?.fixtureCategory\" class=\"badge inactive me-1\">\r\n {{ planoFixture.fixtureCategory | titlecase}}\r\n </span>\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span *ngIf=\"planoFixture?.fixtureWidth?.value\" class=\"badge inactive me-1\">\r\n {{ planoFixture.fixtureWidth.value }} {{ planoFixture.fixtureWidth?.unit ?? 'ft' }}\r\n </span>\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span class=\"badge inactive me-1\">\r\n Fixture Capacity: {{ planoFixture?.fixtureCapacity || 0 }}\r\n </span>\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span class=\"badge inactive me-1\">\r\n Visual Merch Capacity: {{ planoFixture?.vmConfig?.length || 0 }}\r\n </span>\r\n\r\n </div>\r\n\r\n <h3 *ngIf=\"showAction\" class=\"m-0 ms-auto\">\r\n {{currentFixtureIndex}}/{{totalFixtures.length}}\r\n </h3>\r\n\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n </div>\r\n\r\n @if( this.aiFixture?.fixtureId){\r\n <div id=\"fixture-comparison\" class=\"row g-0 my-3\">\r\n @if (showAction) {\r\n <div class=\"col-4 p-2\">\r\n <div class=\"wrapper\">\r\n <div class=\"d-flex align-items-center gap-3\">\r\n @if (!isApproved && showAction) {\r\n <button class=\"btn quick-btn ms-auto\" type=\"button\" (click)=\"onEditFeedback()\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n\r\n <button class=\"btn primary-btn\" type=\"button\" (click)=\"onClickKeepPlano()\"\r\n [disabled]=\"isAIQuickEdit\">\r\n Keep plano\r\n </button>\r\n }\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <h4 class=\"m-0\">Existing template </h4>\r\n <svg [ngbTooltip]=\"planoFixture?.fixtureName\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_496_31664)\">\r\n <path\r\n d=\"M10.0013 13.3337V10.0003M10.0013 6.66699H10.0096M18.3346 10.0003C18.3346 14.6027 14.6037 18.3337 10.0013 18.3337C5.39893 18.3337 1.66797 14.6027 1.66797 10.0003C1.66797 5.39795 5.39893 1.66699 10.0013 1.66699C14.6037 1.66699 18.3346 5.39795 18.3346 10.0003Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_496_31664\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n </div>\r\n\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'keepPlano' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithPlano' \"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n }\r\n </div>\r\n </div>\r\n <fixture [fixture]=\"planoFixture\"></fixture>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-4 p-2\">\r\n <div class=\"wrapper\">\r\n @if (!isApproved && showAction) {\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <button class=\"btn redo-btn\" (click)=\"onClickRedo()\" [class.disabled]=\"isAIQuickEdit\" *ngIf=\"!feedbackDetails?.fixtureFeedback?.hideRedo\">\r\n Redo\r\n </button>\r\n\r\n <button class=\"btn quick-btn ms-auto\" type=\"button\" (click)=\"onEditAIFeedback()\"\r\n [disabled]=\"isAIQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n\r\n <button class=\"btn primary-btn\" type=\"button\" (click)=\"onClickAcceptAI()\"\r\n [disabled]=\"isAIQuickEdit\">\r\n Accept store response\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M15.6504 14.6191H4.34863V10.7373C4.23826 10.7455 4.12644 10.75 4.01367 10.75C3.97137 10.75 3.92943 10.7463 3.8877 10.7451V15.8037C3.88788 16.447 4.42222 16.9883 5.09863 16.9883H14.9004C15.5768 16.9883 16.1102 16.447 16.1104 15.8037V10.7451C16.0708 10.7462 16.0311 10.75 15.9912 10.75C15.8768 10.75 15.7629 10.7449 15.6504 10.7363V14.6191ZM15.4639 3.01172H4.53418C4.48723 3.01187 4.44973 3.03776 4.43457 3.06152V3.0625L2.67871 5.80371L2.66016 5.83301C2.04768 6.82786 2.64325 8.11739 3.73438 8.26367C3.83174 8.27561 3.92224 8.28222 4.01074 8.28223C4.58889 8.28223 5.09978 8.03419 5.45605 7.64746L6.00977 7.04688L6.56152 7.64941C6.91341 8.03371 7.42301 8.28215 8.00488 8.28223C8.58433 8.28223 9.09759 8.03349 9.44922 7.64941L10.002 7.04492L10.5557 7.64941C10.9073 8.03349 11.4206 8.28223 12 8.28223C12.5792 8.2821 13.0918 8.03337 13.4434 7.64941L13.9971 7.04492L14.5498 7.64941C14.9014 8.03349 15.4147 8.28223 15.9941 8.28223C16.0791 8.28222 16.1716 8.27533 16.2676 8.26367C17.3635 8.11504 17.9623 6.8008 17.3232 5.80371L15.5645 3.0625L15.5635 3.06152C15.5483 3.03769 15.511 3.01172 15.4639 3.01172Z\"\r\n stroke=\"#101828\" stroke-width=\"1.5\" />\r\n </svg>\r\n\r\n\r\n <h4>Store response </h4>\r\n <span class=\"badge inactive me-1\" *ngIf=\"!isAIQuickEdit\">\r\n Capacity: {{aiFixture?.fixtureCapacity || 0 }}\r\n </span>\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'acceptAi' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithAi'\"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'redo' \"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.25065 15.8335C6.90343 15.8335 5.74704 15.396 4.78148 14.521C3.81593 13.646 3.33343 12.5557 3.33398 11.2502C3.33398 9.94461 3.81676 8.85433 4.78232 7.97933C5.74787 7.10433 6.90398 6.66683 8.25065 6.66683H13.5007L11.334 4.50016L12.5007 3.3335L16.6673 7.50016L12.5007 11.6668L11.334 10.5002L13.5007 8.3335H8.25065C7.37565 8.3335 6.6151 8.61127 5.96898 9.16683C5.32287 9.72238 5.0001 10.4168 5.00065 11.2502C5.00065 12.0835 5.32371 12.7779 5.96982 13.3335C6.61593 13.8891 7.37621 14.1668 8.25065 14.1668H14.1673V15.8335H8.25065Z\"\r\n fill=\"black\" />\r\n </svg>\r\n }@else {\r\n <svg *ngIf=\"showAction && !isAIQuickEdit\" class=\"ms-auto cursor-pointer\"\r\n (click)=\"toggleAIQuickEdit()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n\r\n\r\n </div>\r\n </div>\r\n <editable-fixture [fixture]=\"aiFixture\" [editMode]=\"isAIQuickEdit\"\r\n (onCancel)=\"onCancelAIQuickEdit()\" (onDone)=\"onSaveAIQuickEdit($event)\"\r\n (editTab)=\"onEditAIFeedback($event)\"></editable-fixture>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"p-2\" [ngClass]=\"{'col-4':showAction,'col':!showAction}\">\r\n <div class=\"wrapper\">\r\n <div class=\"mb-4\" [ngStyle]=\"{'margin-top':showAction && !isApproved ? '50px' : '12px'}\">\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <h4>Store Image </h4>\r\n </div>\r\n </div>\r\n @if(cdn && aiFixture?.fixtureImage){\r\n <div class=\"fixture-image\" (click)=\"onClickImagePreview($event, cdn + aiFixture?.fixtureImage)\">\r\n @if(isImageLoading) {\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n }\r\n <img [src]=\"cdn + aiFixture?.fixtureImage\" \r\n alt=\"Store response image\"\r\n [style.display]=\"isImageLoading ? 'none' : 'block'\"\r\n (loadstart)=\"onImageLoadStart()\"\r\n (load)=\"onImageLoad()\"\r\n (error)=\"onImageError()\"\r\n (loadend)=\"onImageLoadEnd()\">\r\n </div>\r\n }@else {\r\n <div class=\"text-center my-7\">\r\n <svg width=\"186\" height=\"84\" viewBox=\"0 0 186 84\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M130.256 15.3284C140.092 15.3284 148.065 23.302 148.065 33.1379C148.065 37.2176 150.826 41.8684 154.906 41.8684H167.972C177.807 41.8687 185.781 49.8422 185.781 59.678C185.781 69.5141 177.807 77.4885 167.971 77.4885H81.3662C69.7186 77.4883 58.6349 68.4084 46.9873 68.4084H5.93652C2.65782 68.4084 0 65.7506 0 62.4719C0.000127823 59.1933 2.6579 56.5354 5.93652 56.5354H61.8728C63.0069 56.5354 63.9669 55.6929 64.2897 54.6056C64.7994 52.8892 63.6267 50.9485 61.8361 50.9485H43.6514C33.8153 50.9485 25.8418 42.974 25.8418 33.1379C25.842 23.302 33.8154 15.3284 43.6514 15.3284H130.256Z\"\r\n fill=\"#EAECF0\" />\r\n <path\r\n d=\"M126.664 27.335V48.65L120.959 43.75C118.229 41.405 113.819 41.405 111.089 43.75L96.5291 56.245C93.7991 58.59 89.3891 58.59 86.6591 56.245L85.4691 55.265C82.9841 53.095 79.0291 52.885 76.2291 54.775L59.0091 66.325L58.6241 66.605C57.3291 63.805 56.6641 60.48 56.6641 56.665V27.335C56.6641 14.595 64.2591 7 76.9991 7H106.329C119.069 7 126.664 14.595 126.664 27.335Z\"\r\n fill=\"#6BCAFF\" />\r\n <path\r\n d=\"M81.164 36.3299C85.7645 36.3299 89.494 32.6005 89.494 27.9999C89.494 23.3994 85.7645 19.6699 81.164 19.6699C76.5635 19.6699 72.834 23.3994 72.834 27.9999C72.834 32.6005 76.5635 36.3299 81.164 36.3299Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M126.665 48.65V56.665C126.665 69.405 119.07 77 106.33 77H77C68.075 77 61.635 73.255 58.625 66.605L59.01 66.325L76.23 54.775C79.03 52.885 82.985 53.095 85.47 55.265L86.66 56.245C89.39 58.59 93.8 58.59 96.53 56.245L111.09 43.75C113.82 41.405 118.23 41.405 120.96 43.75L126.665 48.65Z\"\r\n fill=\"#00A3FF\" />\r\n <circle cx=\"138.064\" cy=\"28.3128\" r=\"4.40042\" fill=\"#6BCAFF\" />\r\n <circle cx=\"47.8256\" cy=\"39.2409\" r=\"2.45255\" fill=\"#6BCAFF\" />\r\n <ellipse cx=\"139.183\" cy=\"61.0072\" rx=\"4.29197\" ry=\"4.59854\" fill=\"#00A3FF\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"vm-comparison\" *ngIf=\"feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig.length\">\r\n <h5 class=\"mb-1\">Visual Merchandise Images from AI output:</h5>\r\n\r\n <div class=\"row g-0\">\r\n\r\n @for (vm of feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig; track $index) {\r\n <div class=\"p-2\" [ngClass]=\"{'col-6':showAction, 'col-12':!showAction}\">\r\n <div class=\"vm-container\" (click)=\"onClickImagePreview($event, cdn+vm?.vmImage)\">\r\n <div class=\"vm-img\">\r\n <img [src]=\"cdn+vm?.vmImage\" alt=\"VM Image\">\r\n </div>\r\n <div class=\"d-flex flex-column gap-2 vm-details \">\r\n <h5>{{vm?.vmType}}</h5>\r\n <h5>{{vm?.vmName}}</h5>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"my-6\">\r\n <div class=\"text-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n <path\r\n d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <div class=\"mt-3 text-center\">\r\n <div class=\"fw-bold h3 mt-2\">No response</div>\r\n <div class=\"mt-4\">No AI response found for this fixture.</div>\r\n </div>\r\n </div>\r\n }\r\n\r\n\r\n @if (feedbackDetails?.fixtureFeedback?.answers?.[0]?.comments.length) {\r\n <div id=\"fixture-comments\">\r\n <h5 class=\"mb-2\">Comments</h5>\r\n\r\n <div class=\"log-block\"\r\n *ngFor=\"let c of feedbackDetails?.fixtureFeedback?.answers[0]?.comments;let i= index\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n\r\n @if(c?.responsetype === 'comment'){\r\n <h5>{{c?.comment}}</h5>\r\n }@else if(c?.responsetype === 'agree'){\r\n\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'keepPlano'\">\r\n Marked as \"Keep Plano\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithPlano'\">\r\n Marked as \"Keep Plano with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'acceptAi'\">\r\n Marked as \"Accept AI\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithAi'\">\r\n Marked as \"Accept AI with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }@else if(c?.responsetype === 'disagree'){\r\n <h5>\r\n Marked as \"Redo\"\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"img-preview\" *ngIf=\"selectedImageForPreview\" (click)=\"closeImagePreview()\">\r\n <button class=\"preview-close\" (click)=\"$event.stopPropagation(); closeImagePreview()\">&#x2715;</button>\r\n <div class=\"preview-zoom-controls\" (click)=\"$event.stopPropagation()\">\r\n <button (click)=\"onPreviewZoomOut()\">&#x2212;</button>\r\n <input type=\"range\" class=\"zoom-slider\" min=\"25\" max=\"500\" step=\"25\"\r\n [value]=\"imagePreviewZoom * 100\"\r\n (input)=\"onPreviewZoomSlider($event)\" />\r\n <span>{{ (imagePreviewZoom * 100).toFixed(0) }}%</span>\r\n <button (click)=\"onPreviewZoomIn()\">&#x2B;</button>\r\n </div>\r\n <div class=\"preview-image-container\" (click)=\"$event.stopPropagation()\"\r\n (mousedown)=\"onPreviewPanStart($event)\"\r\n (mousemove)=\"onPreviewPanMove($event)\"\r\n (mouseup)=\"onPreviewPanEnd()\"\r\n (mouseleave)=\"onPreviewPanEnd()\"\r\n (wheel)=\"onPreviewWheel($event)\">\r\n <img [src]=\"selectedImageForPreview\" class=\"full-img\"\r\n [style.transform]=\"'scale(' + imagePreviewZoom + ') translate(' + imagePreviewPanX / imagePreviewZoom + 'px,' + imagePreviewPanY / imagePreviewZoom + 'px)'\"\r\n draggable=\"false\" />\r\n </div>\r\n </div>\r\n\r\n <ng-template #skeletonLoader>\r\n <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n <div class=\"shimmer rounded\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</section>", styles: [".nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#verification-feedback{height:100%;overflow-y:auto}#verification-feedback .fixture-navigate,#verification-feedback .task-info-header{user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#verification-feedback h5{color:#1d2939;font-family:Inter;font-weight:600;font-size:12px;line-height:18px;margin:0}#verification-feedback .log-block{display:flex;gap:12px;padding:4px;margin-bottom:18px}#verification-feedback .log-block h4{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback .log-block p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085;margin:0}#verification-feedback #task-info .task-info-header{background-color:#fff!important;padding:6px;width:100%}#verification-feedback #task-info .task-info-header h2{font-weight:600;font-size:14px;line-height:20px;color:#1d2939}#verification-feedback #task-info .task-info-header p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085}#verification-feedback #fixture-quick-details .quick-edit-container{background:#f9fafb;padding:12px;border-radius:6px;width:100%;height:100%}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn{font-size:13px!important;line-height:10px!important;padding:6px 8px!important;border:1px solid rgb(208,213,221);box-shadow:0 1px 2px #1018280d;background:#fff}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-quick-details .quick-edit-container .redo-btn{font-family:Inter;font-weight:600;font-size:14px;line-height:18px;color:#1d2939;cursor:pointer}#verification-feedback #fixture-quick-details .quick-edit-container h4{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;color:#1d2939;margin:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .label{font-family:Inter;font-weight:500;font-size:14px;line-height:20px;color:#475467;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .value{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .diff .value{color:#d92d20!important;font-weight:600}#verification-feedback #fixture-quick-details .quick-edit-container .edit-input{padding:0 4px;border-radius:4px;width:50%;height:20px}#verification-feedback #fixture-comparison .wrapper{padding:12px;background:#f9fafb;border-radius:4px;height:100%}#verification-feedback #fixture-comparison .primary-btn{font-weight:600;font-size:12px;padding:8px 16px;line-height:18px;border-radius:8px;color:#009bf3;background:#eaf8ff;box-shadow:0 1px 2px #1018280d}#verification-feedback #fixture-comparison .primary-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison .btn-outline-cus{font-weight:600;font-size:12px;padding:8px 16px;line-height:18px;border-radius:8px;box-shadow:0 1px 2px #1018280d}#verification-feedback #fixture-comparison .btn-outline-cus:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison .quick-btn{font-size:13px!important;line-height:10px!important;padding:6px 8px!important;border:1px solid rgb(208,213,221);box-shadow:0 1px 2px #1018280d;background:#fff}#verification-feedback #fixture-comparison .quick-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison .redo-btn{font-weight:600;font-size:12px;padding:8px 16px;line-height:18px;border-radius:8px;color:#344054;background:#fff;border:1px solid #d0d5dd;box-shadow:0 1px 2px #1018280d}#verification-feedback #fixture-comparison .redo-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #fixture-comparison h4{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;color:#1d2939;margin:0}#verification-feedback #fixture-comparison p{font-weight:400;font-size:12px;line-height:18px;color:#475467;margin:0}#verification-feedback #fixture-comparison .fixture-image{margin-bottom:12px}#verification-feedback #fixture-comparison .fixture-image img{object-fit:contain;width:100%}#verification-feedback #vm-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #vm-comparison .vm-container{padding:12px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);display:flex;gap:12px;cursor:pointer}#verification-feedback #vm-comparison .vm-container .vm-img{width:134px;height:134px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);background:var(--Gray-50, #f9fafb)}#verification-feedback #vm-comparison .vm-container .vm-img img{border-radius:2px;min-width:132px;min-height:134px;object-fit:contain;width:100%;height:100%;display:block}#verification-feedback #vm-comparison .vm-container .vm-details,#verification-feedback #vm-comparison .vm-container .vm-details h5{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#verification-feedback .img-preview{position:fixed;inset:0;background:#000000d9;display:flex;align-items:center;justify-content:center;z-index:9999;cursor:default}#verification-feedback .preview-close{position:absolute;top:16px;right:16px;background:#ffffff26;border:none;color:#fff;font-size:20px;width:36px;height:36px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;z-index:10000}#verification-feedback .preview-close:hover{background:#ffffff4d}#verification-feedback .preview-zoom-controls{position:absolute;bottom:24px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:12px;background:#ffffff26;border-radius:8px;padding:6px 16px;z-index:10000}#verification-feedback .preview-zoom-controls span{color:#fff;font-size:14px;min-width:48px;text-align:center;-webkit-user-select:none;user-select:none}#verification-feedback .preview-zoom-controls button{background:none;border:none;color:#fff;font-size:18px;cursor:pointer;width:28px;height:28px;border-radius:4px;display:flex;align-items:center;justify-content:center}#verification-feedback .preview-zoom-controls button:hover{background:#fff3}#verification-feedback .preview-zoom-controls .zoom-slider{-webkit-appearance:none;appearance:none;width:120px;height:4px;background:#ffffff4d;border-radius:2px;outline:none;cursor:pointer}#verification-feedback .preview-zoom-controls .zoom-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:#fff;cursor:pointer}#verification-feedback .preview-zoom-controls .zoom-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:#fff;border:none;cursor:pointer}#verification-feedback .preview-image-container{overflow:hidden;display:flex;align-items:center;justify-content:center;width:90vw;height:85vh;cursor:default}#verification-feedback .preview-image-container:active{cursor:grabbing}#verification-feedback .full-img{max-width:90vw;max-height:85vh;border-radius:10px;object-fit:contain;cursor:grab;-webkit-user-select:none;user-select:none}#verification-feedback .full-img:active{cursor:grabbing}#verification-feedback .disabled{pointer-events:none;cursor:not-allowed!important;opacity:.6}.loader .shimmer{height:unset}\n"] }]
552
+ args: [{ selector: "lib-verification-feedback", template: "<section id=\"verification-feedback\">\r\n\r\n <div *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\" id=\"task-info\" ngbAccordion #accordion=\"ngbAccordion\">\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"feedbackDetails?.taskInfoToggle\">\r\n <div ngbAccordionHeader ngbAccordionToggle class=\"accordion-button task-info-header\">\r\n <div class=\"w-100\">\r\n <h2>Fixture verification assigned</h2>\r\n <p>{{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"log-block\">\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{feedbackDetails?.fixtureFeedback?.taskData?.createdByName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mma, dd MMM yyyy'}}\r\n </p>\r\n <h5>Assigner</h5>\r\n </div>\r\n </div>\r\n\r\n <div class=\"log-block\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4> {{feedbackDetails?.fixtureFeedback?.taskData?.userName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.submitTime_string}}\r\n </p>\r\n <h5>Assignee</h5>\r\n </div>\r\n </div>\r\n\r\n\r\n @if (feedbackDetails?.globalComments?.length) {\r\n <h5 class=\"mb-2\">Comments</h5>\r\n <div class=\"log-block\" *ngFor=\"let c of feedbackDetails?.globalComments;let i= index\">\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n <h5>{{c?.comment}}</h5>\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\">\r\n\r\n <div id=\"feedback-handler\" class=\"d-flex align-items-center gap-6 my-6 px-3 fixture-navigate\">\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n\r\n <h3 class=\"m-0\">{{planoFixture?.header?.label}}</h3>\r\n\r\n <div class=\"d-flex align-items-center gap-3 flex-wrap\">\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span *ngIf=\"planoFixture?.fixtureCategory\" class=\"badge inactive me-1\">\r\n {{ planoFixture.fixtureCategory | titlecase}}\r\n </span>\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span *ngIf=\"planoFixture?.fixtureWidth?.value\" class=\"badge inactive me-1\">\r\n {{ planoFixture.fixtureWidth.value }} {{ planoFixture.fixtureWidth?.unit ?? 'ft' }}\r\n </span>\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span class=\"badge inactive me-1\">\r\n Fixture Capacity: {{ planoFixtureCapacity }}\r\n </span>\r\n\r\n <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n </svg>\r\n\r\n <span class=\"badge inactive me-1\">\r\n Visual Merch Capacity: {{ planoFixture?.vmConfig?.length || 0 }}\r\n </span>\r\n\r\n </div>\r\n\r\n <h3 *ngIf=\"showAction\" class=\"m-0 ms-auto\">\r\n {{currentFixtureIndex}}/{{totalFixtures.length}}\r\n </h3>\r\n\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n </div>\r\n\r\n @if( this.aiFixture?.fixtureId){\r\n <div id=\"fixture-comparison\" class=\"row g-0 my-3\">\r\n @if (showAction) {\r\n <div class=\"col-4 p-2\">\r\n <div class=\"wrapper\">\r\n <div class=\"d-flex align-items-center gap-3\">\r\n @if (!isApproved && showAction) {\r\n <button class=\"btn quick-btn ms-auto\" type=\"button\" (click)=\"onEditFeedback()\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n\r\n <button class=\"btn primary-btn\" type=\"button\" (click)=\"onClickKeepPlano()\"\r\n [disabled]=\"isAIQuickEdit\">\r\n Keep plano\r\n </button>\r\n }\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <h4 class=\"m-0\">Existing template </h4>\r\n <svg [ngbTooltip]=\"planoFixture?.fixtureName\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_496_31664)\">\r\n <path\r\n d=\"M10.0013 13.3337V10.0003M10.0013 6.66699H10.0096M18.3346 10.0003C18.3346 14.6027 14.6037 18.3337 10.0013 18.3337C5.39893 18.3337 1.66797 14.6027 1.66797 10.0003C1.66797 5.39795 5.39893 1.66699 10.0013 1.66699C14.6037 1.66699 18.3346 5.39795 18.3346 10.0003Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_496_31664\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n </div>\r\n\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'keepPlano' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithPlano' \"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n }\r\n </div>\r\n </div>\r\n <fixture [fixture]=\"planoFixture\"></fixture>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-4 p-2\">\r\n <div class=\"wrapper\">\r\n @if (!isApproved && showAction) {\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <button class=\"btn redo-btn\" (click)=\"onClickRedo()\" [class.disabled]=\"isAIQuickEdit\" *ngIf=\"!feedbackDetails?.fixtureFeedback?.hideRedo\">\r\n Redo\r\n </button>\r\n\r\n <button class=\"btn quick-btn ms-auto\" type=\"button\" (click)=\"onEditAIFeedback()\"\r\n [disabled]=\"isAIQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n\r\n <button class=\"btn primary-btn\" type=\"button\" (click)=\"onClickAcceptAI()\"\r\n [disabled]=\"isAIQuickEdit\">\r\n Accept store response\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M15.6504 14.6191H4.34863V10.7373C4.23826 10.7455 4.12644 10.75 4.01367 10.75C3.97137 10.75 3.92943 10.7463 3.8877 10.7451V15.8037C3.88788 16.447 4.42222 16.9883 5.09863 16.9883H14.9004C15.5768 16.9883 16.1102 16.447 16.1104 15.8037V10.7451C16.0708 10.7462 16.0311 10.75 15.9912 10.75C15.8768 10.75 15.7629 10.7449 15.6504 10.7363V14.6191ZM15.4639 3.01172H4.53418C4.48723 3.01187 4.44973 3.03776 4.43457 3.06152V3.0625L2.67871 5.80371L2.66016 5.83301C2.04768 6.82786 2.64325 8.11739 3.73438 8.26367C3.83174 8.27561 3.92224 8.28222 4.01074 8.28223C4.58889 8.28223 5.09978 8.03419 5.45605 7.64746L6.00977 7.04688L6.56152 7.64941C6.91341 8.03371 7.42301 8.28215 8.00488 8.28223C8.58433 8.28223 9.09759 8.03349 9.44922 7.64941L10.002 7.04492L10.5557 7.64941C10.9073 8.03349 11.4206 8.28223 12 8.28223C12.5792 8.2821 13.0918 8.03337 13.4434 7.64941L13.9971 7.04492L14.5498 7.64941C14.9014 8.03349 15.4147 8.28223 15.9941 8.28223C16.0791 8.28222 16.1716 8.27533 16.2676 8.26367C17.3635 8.11504 17.9623 6.8008 17.3232 5.80371L15.5645 3.0625L15.5635 3.06152C15.5483 3.03769 15.511 3.01172 15.4639 3.01172Z\"\r\n stroke=\"#101828\" stroke-width=\"1.5\" />\r\n </svg>\r\n\r\n\r\n <h4>Store response </h4>\r\n <span class=\"badge inactive me-1\" *ngIf=\"!isAIQuickEdit\">\r\n Capacity: {{aiFixture?.fixtureCapacity || 0 }}\r\n </span>\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'acceptAi' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithAi'\"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'redo' \"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.25065 15.8335C6.90343 15.8335 5.74704 15.396 4.78148 14.521C3.81593 13.646 3.33343 12.5557 3.33398 11.2502C3.33398 9.94461 3.81676 8.85433 4.78232 7.97933C5.74787 7.10433 6.90398 6.66683 8.25065 6.66683H13.5007L11.334 4.50016L12.5007 3.3335L16.6673 7.50016L12.5007 11.6668L11.334 10.5002L13.5007 8.3335H8.25065C7.37565 8.3335 6.6151 8.61127 5.96898 9.16683C5.32287 9.72238 5.0001 10.4168 5.00065 11.2502C5.00065 12.0835 5.32371 12.7779 5.96982 13.3335C6.61593 13.8891 7.37621 14.1668 8.25065 14.1668H14.1673V15.8335H8.25065Z\"\r\n fill=\"black\" />\r\n </svg>\r\n }@else {\r\n <svg *ngIf=\"showAction && !isAIQuickEdit\" class=\"ms-auto cursor-pointer\"\r\n (click)=\"toggleAIQuickEdit()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n\r\n\r\n </div>\r\n </div>\r\n <editable-fixture [fixture]=\"aiFixture\" [editMode]=\"isAIQuickEdit\"\r\n (onCancel)=\"onCancelAIQuickEdit()\" (onDone)=\"onSaveAIQuickEdit($event)\"\r\n (editTab)=\"onEditAIFeedback($event)\"></editable-fixture>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"p-2\" [ngClass]=\"{'col-4':showAction,'col':!showAction}\">\r\n <div class=\"wrapper\">\r\n <div class=\"mb-4\" [ngStyle]=\"{'margin-top':showAction && !isApproved ? '50px' : '12px'}\">\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <h4>Store Image </h4>\r\n </div>\r\n </div>\r\n @if(cdn && aiFixture?.fixtureImage){\r\n <div class=\"fixture-image\" (click)=\"onClickImagePreview($event, cdn + aiFixture?.fixtureImage)\">\r\n @if(isImageLoading) {\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n }\r\n <img [src]=\"cdn + aiFixture?.fixtureImage\" \r\n alt=\"Store response image\"\r\n [style.display]=\"isImageLoading ? 'none' : 'block'\"\r\n (loadstart)=\"onImageLoadStart()\"\r\n (load)=\"onImageLoad()\"\r\n (error)=\"onImageError()\"\r\n (loadend)=\"onImageLoadEnd()\">\r\n </div>\r\n }@else {\r\n <div class=\"text-center my-7\">\r\n <svg width=\"186\" height=\"84\" viewBox=\"0 0 186 84\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M130.256 15.3284C140.092 15.3284 148.065 23.302 148.065 33.1379C148.065 37.2176 150.826 41.8684 154.906 41.8684H167.972C177.807 41.8687 185.781 49.8422 185.781 59.678C185.781 69.5141 177.807 77.4885 167.971 77.4885H81.3662C69.7186 77.4883 58.6349 68.4084 46.9873 68.4084H5.93652C2.65782 68.4084 0 65.7506 0 62.4719C0.000127823 59.1933 2.6579 56.5354 5.93652 56.5354H61.8728C63.0069 56.5354 63.9669 55.6929 64.2897 54.6056C64.7994 52.8892 63.6267 50.9485 61.8361 50.9485H43.6514C33.8153 50.9485 25.8418 42.974 25.8418 33.1379C25.842 23.302 33.8154 15.3284 43.6514 15.3284H130.256Z\"\r\n fill=\"#EAECF0\" />\r\n <path\r\n d=\"M126.664 27.335V48.65L120.959 43.75C118.229 41.405 113.819 41.405 111.089 43.75L96.5291 56.245C93.7991 58.59 89.3891 58.59 86.6591 56.245L85.4691 55.265C82.9841 53.095 79.0291 52.885 76.2291 54.775L59.0091 66.325L58.6241 66.605C57.3291 63.805 56.6641 60.48 56.6641 56.665V27.335C56.6641 14.595 64.2591 7 76.9991 7H106.329C119.069 7 126.664 14.595 126.664 27.335Z\"\r\n fill=\"#6BCAFF\" />\r\n <path\r\n d=\"M81.164 36.3299C85.7645 36.3299 89.494 32.6005 89.494 27.9999C89.494 23.3994 85.7645 19.6699 81.164 19.6699C76.5635 19.6699 72.834 23.3994 72.834 27.9999C72.834 32.6005 76.5635 36.3299 81.164 36.3299Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M126.665 48.65V56.665C126.665 69.405 119.07 77 106.33 77H77C68.075 77 61.635 73.255 58.625 66.605L59.01 66.325L76.23 54.775C79.03 52.885 82.985 53.095 85.47 55.265L86.66 56.245C89.39 58.59 93.8 58.59 96.53 56.245L111.09 43.75C113.82 41.405 118.23 41.405 120.96 43.75L126.665 48.65Z\"\r\n fill=\"#00A3FF\" />\r\n <circle cx=\"138.064\" cy=\"28.3128\" r=\"4.40042\" fill=\"#6BCAFF\" />\r\n <circle cx=\"47.8256\" cy=\"39.2409\" r=\"2.45255\" fill=\"#6BCAFF\" />\r\n <ellipse cx=\"139.183\" cy=\"61.0072\" rx=\"4.29197\" ry=\"4.59854\" fill=\"#00A3FF\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"vm-comparison\" *ngIf=\"feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig.length\">\r\n <h5 class=\"mb-1\">Visual Merchandise Images from AI output:</h5>\r\n\r\n <div class=\"row g-0\">\r\n\r\n @for (vm of feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig; track $index) {\r\n <div class=\"p-2\" [ngClass]=\"{'col-6':showAction, 'col-12':!showAction}\">\r\n <div class=\"vm-container\" (click)=\"onClickImagePreview($event, cdn+vm?.vmImage)\">\r\n <div class=\"vm-img\">\r\n <img [src]=\"cdn+vm?.vmImage\" alt=\"VM Image\">\r\n </div>\r\n <div class=\"d-flex flex-column gap-2 vm-details \">\r\n <h5>{{vm?.vmType}}</h5>\r\n <h5>{{vm?.vmName}}</h5>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"my-6\">\r\n <div class=\"text-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n <path\r\n d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <div class=\"mt-3 text-center\">\r\n <div class=\"fw-bold h3 mt-2\">No response</div>\r\n <div class=\"mt-4\">No AI response found for this fixture.</div>\r\n </div>\r\n </div>\r\n }\r\n\r\n\r\n @if (feedbackDetails?.fixtureFeedback?.answers?.[0]?.comments.length) {\r\n <div id=\"fixture-comments\">\r\n <h5 class=\"mb-2\">Comments</h5>\r\n\r\n <div class=\"log-block\"\r\n *ngFor=\"let c of feedbackDetails?.fixtureFeedback?.answers[0]?.comments;let i= index\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n\r\n @if(c?.responsetype === 'comment'){\r\n <h5>{{c?.comment}}</h5>\r\n }@else if(c?.responsetype === 'agree'){\r\n\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'keepPlano'\">\r\n Marked as \"Keep Plano\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithPlano'\">\r\n Marked as \"Keep Plano with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'acceptAi'\">\r\n Marked as \"Accept AI\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithAi'\">\r\n Marked as \"Accept AI with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }@else if(c?.responsetype === 'disagree'){\r\n <h5>\r\n Marked as \"Redo\"\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"img-preview\" *ngIf=\"selectedImageForPreview\" (click)=\"closeImagePreview()\">\r\n <button class=\"preview-close\" (click)=\"$event.stopPropagation(); closeImagePreview()\">&#x2715;</button>\r\n <div class=\"preview-zoom-controls\" (click)=\"$event.stopPropagation()\">\r\n <button (click)=\"onPreviewZoomOut()\">&#x2212;</button>\r\n <input type=\"range\" class=\"zoom-slider\" min=\"25\" max=\"500\" step=\"25\"\r\n [value]=\"imagePreviewZoom * 100\"\r\n (input)=\"onPreviewZoomSlider($event)\" />\r\n <span>{{ (imagePreviewZoom * 100).toFixed(0) }}%</span>\r\n <button (click)=\"onPreviewZoomIn()\">&#x2B;</button>\r\n </div>\r\n <div class=\"preview-image-container\" (click)=\"$event.stopPropagation()\"\r\n (mousedown)=\"onPreviewPanStart($event)\"\r\n (mousemove)=\"onPreviewPanMove($event)\"\r\n (mouseup)=\"onPreviewPanEnd()\"\r\n (mouseleave)=\"onPreviewPanEnd()\"\r\n (wheel)=\"onPreviewWheel($event)\">\r\n <img [src]=\"selectedImageForPreview\" class=\"full-img\"\r\n [style.transform]=\"'scale(' + imagePreviewZoom + ') translate(' + imagePreviewPanX / imagePreviewZoom + 'px,' + imagePreviewPanY / imagePreviewZoom + 'px)'\"\r\n draggable=\"false\" />\r\n </div>\r\n </div>\r\n\r\n <ng-template #skeletonLoader>\r\n <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n <div class=\"shimmer rounded\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n <br />\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</section>", styles: [".nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#verification-feedback{height:100%;overflow-y:auto}#verification-feedback .fixture-navigate,#verification-feedback .task-info-header{user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#verification-feedback h5{color:#1d2939;font-family:Inter;font-weight:600;font-size:12px;line-height:18px;margin:0}#verification-feedback .log-block{display:flex;gap:12px;padding:4px;margin-bottom:18px}#verification-feedback .log-block h4{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback .log-block p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085;margin:0}#verification-feedback #task-info .task-info-header{background-color:#fff!important;padding:6px;width:100%}#verification-feedback #task-info .task-info-header h2{font-weight:600;font-size:14px;line-height:20px;color:#1d2939}#verification-feedback #task-info .task-info-header p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085}#verification-feedback #fixture-quick-details .quick-edit-container{background:#f9fafb;padding:12px;border-radius:6px;width:100%;height:100%}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn{font-size:13px!important;line-height:10px!important;padding:6px 8px!important;border:1px solid rgb(208,213,221);box-shadow:0 1px 2px #1018280d;background:#fff}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-quick-details .quick-edit-container .redo-btn{font-family:Inter;font-weight:600;font-size:14px;line-height:18px;color:#1d2939;cursor:pointer}#verification-feedback #fixture-quick-details .quick-edit-container h4{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;color:#1d2939;margin:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .label{font-family:Inter;font-weight:500;font-size:14px;line-height:20px;color:#475467;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .value{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .diff .value{color:#d92d20!important;font-weight:600}#verification-feedback #fixture-quick-details .quick-edit-container .edit-input{padding:0 4px;border-radius:4px;width:50%;height:20px}#verification-feedback #fixture-comparison .wrapper{padding:12px;background:#f9fafb;border-radius:4px;height:100%}#verification-feedback #fixture-comparison .primary-btn{font-weight:600;font-size:12px;padding:8px 16px;line-height:18px;border-radius:8px;color:#009bf3;background:#eaf8ff;box-shadow:0 1px 2px #1018280d}#verification-feedback #fixture-comparison .primary-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison .btn-outline-cus{font-weight:600;font-size:12px;padding:8px 16px;line-height:18px;border-radius:8px;box-shadow:0 1px 2px #1018280d}#verification-feedback #fixture-comparison .btn-outline-cus:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison .quick-btn{font-size:13px!important;line-height:10px!important;padding:6px 8px!important;border:1px solid rgb(208,213,221);box-shadow:0 1px 2px #1018280d;background:#fff}#verification-feedback #fixture-comparison .quick-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison .redo-btn{font-weight:600;font-size:12px;padding:8px 16px;line-height:18px;border-radius:8px;color:#344054;background:#fff;border:1px solid #d0d5dd;box-shadow:0 1px 2px #1018280d}#verification-feedback #fixture-comparison .redo-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #fixture-comparison h4{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;color:#1d2939;margin:0}#verification-feedback #fixture-comparison p{font-weight:400;font-size:12px;line-height:18px;color:#475467;margin:0}#verification-feedback #fixture-comparison .fixture-image{margin-bottom:12px}#verification-feedback #fixture-comparison .fixture-image img{object-fit:contain;width:100%}#verification-feedback #vm-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #vm-comparison .vm-container{padding:12px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);display:flex;gap:12px;cursor:pointer}#verification-feedback #vm-comparison .vm-container .vm-img{width:134px;height:134px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);background:var(--Gray-50, #f9fafb)}#verification-feedback #vm-comparison .vm-container .vm-img img{border-radius:2px;min-width:132px;min-height:134px;object-fit:contain;width:100%;height:100%;display:block}#verification-feedback #vm-comparison .vm-container .vm-details,#verification-feedback #vm-comparison .vm-container .vm-details h5{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#verification-feedback .img-preview{position:fixed;inset:0;background:#000000d9;display:flex;align-items:center;justify-content:center;z-index:9999;cursor:default}#verification-feedback .preview-close{position:absolute;top:16px;right:16px;background:#ffffff26;border:none;color:#fff;font-size:20px;width:36px;height:36px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;z-index:10000}#verification-feedback .preview-close:hover{background:#ffffff4d}#verification-feedback .preview-zoom-controls{position:absolute;bottom:24px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:12px;background:#ffffff26;border-radius:8px;padding:6px 16px;z-index:10000}#verification-feedback .preview-zoom-controls span{color:#fff;font-size:14px;min-width:48px;text-align:center;-webkit-user-select:none;user-select:none}#verification-feedback .preview-zoom-controls button{background:none;border:none;color:#fff;font-size:18px;cursor:pointer;width:28px;height:28px;border-radius:4px;display:flex;align-items:center;justify-content:center}#verification-feedback .preview-zoom-controls button:hover{background:#fff3}#verification-feedback .preview-zoom-controls .zoom-slider{-webkit-appearance:none;appearance:none;width:120px;height:4px;background:#ffffff4d;border-radius:2px;outline:none;cursor:pointer}#verification-feedback .preview-zoom-controls .zoom-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:#fff;cursor:pointer}#verification-feedback .preview-zoom-controls .zoom-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:#fff;border:none;cursor:pointer}#verification-feedback .preview-image-container{overflow:hidden;display:flex;align-items:center;justify-content:center;width:90vw;height:85vh;cursor:default}#verification-feedback .preview-image-container:active{cursor:grabbing}#verification-feedback .full-img{max-width:90vw;max-height:85vh;border-radius:10px;object-fit:contain;cursor:grab;-webkit-user-select:none;user-select:none}#verification-feedback .full-img:active{cursor:grabbing}#verification-feedback .disabled{pointer-events:none;cursor:not-allowed!important;opacity:.6}.loader .shimmer{height:unset}\n"] }]
547
553
  }], ctorParameters: () => [{ type: i1.GlobalStateService }, { type: i2.NgbModal }], propDecorators: { floorData: [{
548
554
  type: Input
549
555
  }], totalFixtures: [{
@@ -559,4 +565,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
559
565
  }], action: [{
560
566
  type: Output
561
567
  }] } });
562
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby92ZXJpZmljYXRpb24tZmVlZGJhY2svdmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby92ZXJpZmljYXRpb24tZmVlZGJhY2svdmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdURBQXVELENBQUM7Ozs7Ozs7QUFPcEcsTUFBTSxPQUFPLDZCQUE2QjtJQWdEOUI7SUFDQTtJQTlDRCxTQUFTLENBQU07SUFDZixhQUFhLEdBQVUsRUFBRSxDQUFDO0lBQzFCLGVBQWUsQ0FBTTtJQUVyQixHQUFHLENBQVM7SUFDWixVQUFVLEdBQVksSUFBSSxDQUFDO0lBQ3BDLHlDQUF5QztJQUUvQixhQUFhLEdBQUcsSUFBSSxZQUFZLEVBR3RDLENBQUM7SUFFSyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUUzQyxvQkFBb0IsQ0FHbEI7SUFFRixhQUFhLEdBQVksSUFBSSxDQUFDO0lBRTlCLG1CQUFtQixDQUFTO0lBRTVCLFlBQVksQ0FBTTtJQUNsQixTQUFTLENBQU07SUFFZix1QkFBdUIsR0FBa0IsSUFBSSxDQUFDO0lBQzlDLGdCQUFnQixHQUFXLENBQUMsQ0FBQztJQUM3QixnQkFBZ0IsR0FBVyxDQUFDLENBQUM7SUFDN0IsZ0JBQWdCLEdBQVcsQ0FBQyxDQUFDO0lBQzdCLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDbkIsUUFBUSxHQUFXLENBQUMsQ0FBQztJQUNyQixRQUFRLEdBQVcsQ0FBQyxDQUFDO0lBRTdCLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDdEIsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUN4QixnQkFBZ0IsR0FBVyxFQUFFLENBQUM7SUFFdEMsUUFBUSxDQUFTO0lBQ2pCLE1BQU0sQ0FBUztJQUVQLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRXZDLFlBQ1UsRUFBc0IsRUFDdEIsUUFBa0I7UUFEbEIsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUN6QixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVzthQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUUxQixJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWM7YUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUN4QixJQUFJLElBQUksRUFBRSxNQUFNLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxFQUFFLE1BQU0sQ0FBQzthQUM5QjtpQkFBTTtnQkFDTCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN6QixZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFXLENBQ2pELENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLEVBQUUsTUFBTSxDQUFDO2FBQ3BDO1lBRUQsMkJBQTJCO1lBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFlBQVksRUFBRTtZQUM1QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsbUJBQW1CO2dCQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FDMUIsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUNULENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUM3RCxHQUFHLENBQUMsQ0FBQztZQUVOLElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUNqQyxJQUFJLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQ25ELENBQUM7WUFFRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBRTdDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ25DLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLEtBQUssTUFBTSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQzthQUNoQztZQUNELGlDQUFpQztZQUVqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUN4RDtZQUVELE1BQU0sV0FBVyxHQUNqQixJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWTtnQkFDeEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO2dCQUN4QyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBR0wsSUFBSSxXQUFXLElBQUksV0FBVyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDeEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7YUFDNUI7aUJBQU0sSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7YUFDNUI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7YUFDN0I7WUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pGLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQzNFO0lBQ0gsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLE1BQU0sR0FBRyxlQUFlLENBQUM7WUFDM0IsR0FBRyxJQUFJLENBQUMsWUFBWTtZQUNwQixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGFBQWE7WUFDdkQsTUFBTSxFQUFFO2dCQUNOLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNO2dCQUM1QixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNO2FBQ2hFO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEtBQWEsRUFBRSxFQUFFO1lBQ3JELE9BQU87WUFDUCw2QkFBNkI7WUFDN0IsZ0NBQWdDO1lBQ2hDLHVCQUF1QjtZQUN2QixNQUFNO1lBQ04sZ0RBQWdEO1lBQ2hELG9FQUFvRTtZQUNwRSxzREFBc0Q7WUFDdEQsd0NBQXdDO1lBRXhDLG1EQUFtRDtZQUNuRCx1Q0FBdUM7WUFDdkMsK0RBQStEO1lBQy9ELFVBQVU7WUFDVixJQUFJO1lBRUosSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLE9BQU8sRUFBRTtnQkFDMUIsWUFBWSxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUM7YUFDbkM7aUJBQU07Z0JBQ0wsWUFBWSxJQUFJLENBQUMsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQzthQUNoRDtZQUVELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FDakQsQ0FBQyxNQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FDckQsQ0FBQztZQUVGLElBQUksU0FBUyxFQUFFO2dCQUNiLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2FBQ3BEO2lCQUFNO2dCQUNMLENBQUMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO2FBQ25CO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQztRQUN0QyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsMkJBQTJCO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPO1FBRWxELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTtZQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FDOUI7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDO1FBRTFELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUVoRSxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEQsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTdELElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVc7WUFBRSxPQUFPO1FBQ3BFLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxJQUFJLENBQUMsY0FBYyxFQUFFLFdBQVc7WUFBRSxPQUFPO1FBRTFFLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQztRQUNwRCxNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDbEQsTUFBTSxxQkFBcUIsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDO1FBQzFELE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQztRQUV4RCxNQUFNLHNCQUFzQixHQUFHLENBQUMsRUFBTyxFQUFFLFdBQW1CLEVBQUUsRUFBRTtZQUM5RCxPQUFPLENBQ0wsRUFBRSxFQUFFLEtBQUssS0FBSyxTQUFTO2dCQUN2QixFQUFFLEVBQUUsS0FBSyxLQUFLLFNBQVM7Z0JBQ3ZCLEVBQUUsRUFBRSxjQUFjLEtBQUssV0FBVztnQkFDbEMsRUFBRSxFQUFFLFlBQVksS0FBSyxXQUFXLENBQ2pDLENBQUM7UUFDSixDQUFDLENBQUM7UUFFRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRSxDQUMvRCxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FDL0MsQ0FBQztRQUVGLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBTyxFQUFFLEVBQUUsQ0FDNUQsc0JBQXNCLENBQUMsRUFBRSxFQUFFLHFCQUFxQixDQUFDLENBQ2xELENBQUM7WUFFRixJQUFJLE9BQU8sRUFBRTtnQkFDWCxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsa0JBQWtCLENBQUM7Z0JBQzdDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN4QztTQUNGO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBTyxFQUFFLEVBQUUsQ0FDOUQsc0JBQXNCLENBQUMsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQzlDLENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ25CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQzVELHNCQUFzQixDQUFDLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUNqRCxDQUFDO1lBRUYsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMxQyxRQUFRLENBQUMsY0FBYyxHQUFHLGlCQUFpQixDQUFDO2dCQUM1QyxRQUFRLENBQUMsWUFBWSxHQUFHLGlCQUFpQixDQUFDO2dCQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDeEM7U0FDRjtJQUNILENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFDRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU07WUFDakMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNO1lBRXBDLE9BQU87UUFFVCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUMzQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUVwQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEVBQU8sRUFBRSxXQUFtQixFQUFFLEVBQUUsQ0FDbkQsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQ3RCLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUztZQUN0QixFQUFFLENBQUMsY0FBYyxLQUFLLFdBQVc7WUFDakMsRUFBRSxDQUFDLFlBQVksS0FBSyxXQUFXLENBQUM7UUFFbEMsMEZBQTBGO1FBQzFGLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUNFLGFBQWEsQ0FBQyxTQUFTLEtBQUssT0FBTztZQUNuQyxhQUFhLENBQUMsZUFBZSxLQUFLLENBQUM7WUFDbkMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsRUFDakU7WUFDQSxhQUFhLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztTQUNwQztRQUVELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQ0UsWUFBWSxDQUFDLFNBQVMsS0FBSyxPQUFPO1lBQ2xDLFlBQVksQ0FBQyxlQUFlLEtBQUssQ0FBQztZQUNsQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBTyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUNoRTtZQUNBLFlBQVksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1NBQ25DO1FBRUQsb0RBQW9EO1FBQ3BELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBTyxFQUFFLEVBQUUsQ0FDeEMsV0FBVyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQ3hDLENBQUM7UUFFRixJQUFJLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUVuQyxJQUFJLFlBQVksSUFBSSxVQUFVLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUNyRCx1REFBdUQ7WUFDdkQsT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDZCxXQUFXLEVBQUUsQ0FBQztnQkFDZCxTQUFTLEVBQUUsUUFBUTtnQkFDbkIsZUFBZSxFQUFFLENBQUM7Z0JBQ2xCLFFBQVEsRUFBRSxDQUFDO2dCQUNYLElBQUksRUFBRSxLQUFLO2FBQ1osQ0FBQyxDQUFDO1lBRUgseUNBQXlDO1lBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN2QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO2FBQ3JEO1lBRUQsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO1FBRUQsc0RBQXNEO1FBQ3RELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlDLDRGQUE0RjtRQUM1RixNQUFNLHdCQUF3QixHQUFHLHNCQUFzQjtZQUNyRCxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQzFCLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRSxDQUMzQyxXQUFXLENBQUMsRUFBRSxFQUFFLHdCQUF3QixDQUFDLENBQzFDLENBQUM7UUFFRixJQUFJLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUVoQyxJQUFJLGVBQWUsSUFBSSxTQUFTLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUN2RCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNYLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixTQUFTLEVBQUUsUUFBUTtnQkFDbkIsZUFBZSxFQUFFLENBQUM7Z0JBQ2xCLFFBQVEsRUFBRSxDQUFDO2dCQUNYLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1NBQzVCO1FBRUQsc0RBQXNEO1FBQ3RELE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxNQUFNLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakQsSUFBSSxTQUFTLElBQUksWUFBWSxFQUFFO1lBQzdCLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRTtnQkFDdEIsSUFBSSxFQUFFLEtBQUssWUFBWSxJQUFJLEVBQUUsS0FBSyxlQUFlO29CQUFFLE9BQU87Z0JBQzFELEVBQUUsQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7Z0JBQ2xELEVBQUUsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLGVBQWUsSUFBSSxtQkFBbUIsRUFBRTtnQkFDMUMsc0VBQXNFO2dCQUN0RSxlQUFlLENBQUMsY0FBYztvQkFDNUIsZUFBZSxDQUFDLGNBQWMsR0FBRyxTQUFTLEdBQUcsWUFBWSxDQUFDO2dCQUM1RCxlQUFlLENBQUMsWUFBWTtvQkFDMUIsZUFBZSxDQUFDLFlBQVksR0FBRyxTQUFTLEdBQUcsWUFBWSxDQUFDO2FBQzNEO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLFNBQWMsRUFBRSxjQUFtQjtRQUNoRCxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU87UUFDMUMsZ0RBQWdEO1FBQ2hELE1BQU0sUUFBUSxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUU1RSxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxRQUFRLEtBQUssU0FBUyxDQUFDO1FBRXRELGlEQUFpRDtRQUNqRCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FDN0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3ZFLENBQUM7UUFFRixDQUFDLFNBQVMsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7WUFDckQsT0FBTyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFFNUIsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDYixPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDM0IsT0FBTzthQUNSO1lBRUQsSUFDRSxPQUFPLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxTQUFTO2dCQUN4QyxPQUFPLENBQUMsZUFBZSxLQUFLLFFBQVEsQ0FBQyxlQUFlO2dCQUNwRCxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxRQUFRLEVBQ3RDO2dCQUNBLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2FBQzVCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCw2Q0FBNkM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUN2QixHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUU7YUFDNUQsV0FBVyxFQUFFO2FBQ2IsSUFBSSxFQUFFLENBQUM7UUFFWixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFekUsQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQy9DLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDZCQUE2QjtJQUM3Qix1REFBdUQ7SUFDdkQsMENBQTBDO0lBRTFDLHlDQUF5QztJQUN6QyxxRUFBcUU7SUFDckUsU0FBUztJQUVULHNCQUFzQjtJQUN0QixzQ0FBc0M7SUFDdEMsNkJBQTZCO0lBQzdCLDZEQUE2RDtJQUM3RCxVQUFVO0lBQ1YsZUFBZTtJQUNmLDJCQUEyQjtJQUMzQiwyQkFBMkI7SUFDM0IsNkJBQTZCO0lBQzdCLCtFQUErRTtJQUMvRSxzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLDZCQUE2QjtJQUM3QixnRkFBZ0Y7SUFDaEYsbUJBQW1CO0lBQ25CLFFBQVE7SUFDUixRQUFRO0lBQ1IsSUFBSTtJQUVKLElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsY0FBYyxLQUFLLFVBQVUsQ0FBQztJQUM5RSxDQUFDO0lBRUQsZUFBZSxDQUFDLE1BQTJCO1FBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ3RCLGNBQWMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxTQUFTO1lBQzlELE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsaUNBQWlDO0lBQ25DLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLElBQUk7WUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckQsSUFBSSxNQUFNLEVBQUUsTUFBTSxLQUFLLE9BQU87Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFFN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ2YsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLElBQUksRUFBRSxPQUFPO2dCQUNiLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDOUIsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZTtnQkFDL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNO2dCQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPO2dCQUMvQixPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHO2dCQUMzQixRQUFRLEVBQUUsU0FBUzthQUNwQixDQUFDLENBQUM7U0FDSjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNuRCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWU7UUFDbkIsSUFBSTtZQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRCxJQUFJLE1BQU0sRUFBRSxNQUFNLEtBQUssT0FBTztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUU3QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDZixNQUFNLEVBQUUsVUFBVTtnQkFDbEIsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUMzQixRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxlQUFlO2dCQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07Z0JBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87Z0JBQy9CLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUc7Z0JBQzNCLFFBQVEsRUFBRSxTQUFTO2FBQ3BCLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2xELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNmLElBQUksSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPO1FBRS9CLElBQUk7WUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEQsSUFBSSxNQUFNLEVBQUUsTUFBTSxLQUFLLE9BQU87Z0JBQUUsT0FBTztZQUV2QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDZixNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLGVBQWU7Z0JBQy9DLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87Z0JBQy9CLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUc7Z0JBQzNCLFFBQVEsRUFBRSxTQUFTO2FBQ3BCLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQy9DO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQWdCO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2YsTUFBTSxFQUFFLFlBQVk7WUFDcEIsSUFBSSxFQUFFLE9BQU87WUFDYixXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUztZQUN0RCxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxlQUFlO1lBQy9DLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87WUFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRztZQUMzQixRQUFRLEVBQUUsU0FBUztZQUNuQixHQUFHLEVBQUUsVUFBVSxFQUFFLEdBQUc7U0FDckIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNmLE1BQU0sRUFBRSxlQUFlO1lBQ3ZCLElBQUksRUFBRSxPQUFPO1lBQ2IsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLGVBQWU7WUFDL0MsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztZQUMvQixPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHO1lBQzNCLFFBQVEsRUFBRSxTQUFTO1NBQ3BCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUMzQyxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBYztRQUNwQyxJQUFJO1lBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELElBQUksTUFBTSxFQUFFLE1BQU0sS0FBSyxPQUFPO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBRTdDLElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTVDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNmLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixJQUFJLEVBQUUsT0FBTztnQkFDYixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQzNCLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLGVBQWU7Z0JBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtnQkFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztnQkFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRztnQkFDM0IsUUFBUSxFQUFFLFNBQVM7YUFDcEIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7U0FDNUI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDckQ7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FDakIsSUFBdUM7UUFFdkMsSUFBSTtZQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFO2dCQUMvRCxRQUFRLEVBQUUsSUFBSTtnQkFDZCxJQUFJLEVBQUUsSUFBSTtnQkFDVixRQUFRLEVBQUUsUUFBUTthQUNuQixDQUFDLENBQUM7WUFDSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUV2QyxPQUFPLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBRzlCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4QjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFpQixFQUFFLE1BQWM7UUFDbkQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxNQUFNLENBQUM7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUM7WUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQztZQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBWTtRQUM5QixNQUFNLEtBQUssR0FBRyxDQUFFLEtBQUssQ0FBQyxNQUEyQixDQUFDLEtBQUssQ0FBQztRQUN4RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDO1lBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCxjQUFjLENBQUMsS0FBaUI7UUFDOUIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO2FBQU07WUFDTCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFpQjtRQUNqQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDO1lBQUUsT0FBTztRQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFpQjtRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzVCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN6QyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRU8sUUFBUTtRQUNkLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0FqcEJVLDZCQUE2Qjs0RkFBN0IsNkJBQTZCLG1TQ25CMUMsNHpvQ0FtZVU7OzRGRGhkRyw2QkFBNkI7a0JBTHpDLFNBQVM7K0JBQ0UsMkJBQTJCOzhHQU81QixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFHSSxhQUFhO3NCQUF0QixNQUFNO2dCQUtHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBBY3Rpb25Db25maXJtUG9wdXBDb21wb25lbnQgfSBmcm9tIFwiLi9hY3Rpb24tY29uZmlybS1wb3B1cC9hY3Rpb24tY29uZmlybS1wb3B1cC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwibGliLXZlcmlmaWNhdGlvbi1mZWVkYmFja1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vdmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi92ZXJpZmljYXRpb24tZmVlZGJhY2suY29tcG9uZW50LnNjc3NcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFZlcmlmaWNhdGlvbkZlZWRiYWNrQ29tcG9uZW50XHJcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95XHJcbntcclxuICBASW5wdXQoKSBmbG9vckRhdGE6IGFueTtcclxuICBASW5wdXQoKSB0b3RhbEZpeHR1cmVzOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGZlZWRiYWNrRGV0YWlsczogYW55O1xyXG5cclxuICBASW5wdXQoKSBjZG46IHN0cmluZztcclxuICBASW5wdXQoKSBzaG93QWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuICAvLyBASW5wdXQoKSB2bUxpc3Q6IFZtTGlicmFyeUxpc3RbXSA9IFtdO1xyXG5cclxuICBAT3V0cHV0KCkgY2hhbmdlRml4dHVyZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgY3VycmVudEZpeHR1cmU6IHN0cmluZztcclxuICAgIGFjdGlvbjogXCJuZXh0XCIgfCBcInByZXZpb3VzXCI7XHJcbiAgfT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIGFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBzZWxlY3RlZEZlZWRiYWNrRGF0YToge1xyXG4gICAgY3VycmVudEZpeHR1cmU6IGFueTtcclxuICAgIGFpRmVlZGJhY2tGaXh0dXJlOiBhbnk7XHJcbiAgfTtcclxuXHJcbiAgaXNQYWdlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGN1cnJlbnRGaXh0dXJlSW5kZXg6IG51bWJlcjtcclxuXHJcbiAgcGxhbm9GaXh0dXJlOiBhbnk7XHJcbiAgYWlGaXh0dXJlOiBhbnk7XHJcblxyXG4gIHNlbGVjdGVkSW1hZ2VGb3JQcmV2aWV3OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBpbWFnZVByZXZpZXdab29tOiBudW1iZXIgPSAxO1xyXG4gIGltYWdlUHJldmlld1Bhblg6IG51bWJlciA9IDA7XHJcbiAgaW1hZ2VQcmV2aWV3UGFuWTogbnVtYmVyID0gMDtcclxuICBpc1Bhbm5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHBhbkxhc3RYOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgcGFuTGFzdFk6IG51bWJlciA9IDA7XHJcblxyXG4gIGlzQUlRdWlja0VkaXQgPSBmYWxzZTtcclxuICBpc0ltYWdlTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcHJldmlvdXNJbWFnZVVybDogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuICBpbWdDRE46IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBuZ2JNb2RhbDogTmdiTW9kYWwsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3MuZW52aXJvbm1lbnRcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChlbnYpID0+ICh0aGlzLmltZ0NETiA9IGVudi5wbGFub2dyYW1DRE4pKTtcclxuXHJcbiAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGE/LmNsaWVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIGFzIHN0cmluZyxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYXdhaXQgdGhpcy5nZXRWbXNMaXN0KCk7XHJcbiAgICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbXCJmZWVkYmFja0RldGFpbHNcIl0/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLm9uQ2FuY2VsQUlRdWlja0VkaXQoKTtcclxuICAgICAgdGhpcy5jdXJyZW50Rml4dHVyZUluZGV4ID1cclxuICAgICAgICB0aGlzLnRvdGFsRml4dHVyZXMuZmluZEluZGV4KFxyXG4gICAgICAgICAgKGY6IGFueSkgPT5cclxuICAgICAgICAgICAgZi5faWQgPT09IHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVJZCxcclxuICAgICAgICApICsgMTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnBsYW5vRml4dHVyZSA9IHN0cnVjdHVyZWRDbG9uZShcclxuICAgICAgICAgIHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LkZpeHR1cmVEYXRhLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5haUZpeHR1cmUgPSB0aGlzLnByb2Nlc3NBSUZpeHR1cmVEYXRhKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5tb3ZlU3RyZXRjaFZNc0Zyb21QbGFub1RvQUkoKTtcclxuICAgICAgICBpZiAodGhpcy5haUZpeHR1cmU/LmZpeHR1cmVUeXBlID09PSAnd2FsbCcpIHtcclxuICAgICAgICAgIHRoaXMucHJvY2Vzc1NwZWNpYWxWTVNoZWx2ZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVWTWxpc3RXaXRoQWlEYXRhKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzQXBwcm92ZWQpIHtcclxuICAgICAgICAgIHRoaXMuY29tcGFyZUZpeHR1cmUodGhpcy5haUZpeHR1cmUsIHRoaXMucGxhbm9GaXh0dXJlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0ltYWdlVXJsID1cclxuICAgICAgICB0aGlzLmNkbiAmJiB0aGlzLmFpRml4dHVyZT8uZml4dHVyZUltYWdlXHJcbiAgICAgICAgPyB0aGlzLmNkbiArIHRoaXMuYWlGaXh0dXJlLmZpeHR1cmVJbWFnZVxyXG4gICAgICAgIDogXCJcIjtcclxuXHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG5ld0ltYWdlVXJsICYmIG5ld0ltYWdlVXJsICE9PSB0aGlzLnByZXZpb3VzSW1hZ2VVcmwpIHtcclxuICAgICAgICAgIHRoaXMucHJldmlvdXNJbWFnZVVybCA9IG5ld0ltYWdlVXJsO1xyXG4gICAgICAgICAgdGhpcy5pc0ltYWdlTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICghbmV3SW1hZ2VVcmwpIHtcclxuICAgICAgICAgIHRoaXMuaXNJbWFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucHJldmlvdXNJbWFnZVVybCA9IFwiXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuaXNJbWFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJAQCB+IGZpeHR1cmVJZDpcIiwgdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUlkKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkBAIH4gaW1hZ2VQYXRoOlwiLCB0aGlzLmNkbiArIHRoaXMuYWlGaXh0dXJlPy5maXh0dXJlSW1hZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc0FJRml4dHVyZURhdGEoKSB7XHJcbiAgICBsZXQgYWlEYXRhID0gc3RydWN0dXJlZENsb25lKHtcclxuICAgICAgLi4udGhpcy5wbGFub0ZpeHR1cmUsXHJcbiAgICAgIC4uLnRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVBSURhdGEsXHJcbiAgICAgIGhlYWRlcjoge1xyXG4gICAgICAgIC4uLnRoaXMucGxhbm9GaXh0dXJlPy5oZWFkZXIsXHJcbiAgICAgICAgLi4udGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUFJRGF0YT8uaGVhZGVyLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgICBsZXQgcHJvZHVjdENvdW50ID0gMDtcclxuICAgIGFpRGF0YT8uc2hlbGZDb25maWc/LmZvckVhY2goKHM6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAvLyBpZiAoXHJcbiAgICAgIC8vICAgcy5zaGVsZlR5cGUgPT0gXCJ0cmF5XCIgJiZcclxuICAgICAgLy8gICAhcz8ub3JpZ2luYWxQcm9kdWN0Q291bnQgJiZcclxuICAgICAgLy8gICAhYWlEYXRhPy51cGRhdGVkQnlcclxuICAgICAgLy8gKSB7XHJcbiAgICAgIC8vICAgcy5vcmlnaW5hbFByb2R1Y3RDb3VudCA9IHMucHJvZHVjdFBlclNoZWxmO1xyXG4gICAgICAvLyAgIHMucHJvZHVjdFBlclNoZWxmID0gTWF0aC5mbG9vcihzLnByb2R1Y3RQZXJTaGVsZiAvIHMudHJheVJvd3MpO1xyXG4gICAgICAvLyAgIC8vIHMudHJheVJvd3MgPSBzLnRyYXlSb3dzID09IDAgPyAxIDogcy50cmF5Um93cztcclxuICAgICAgLy8gICAvLyBzLnByb2R1Y3RQZXJTaGVsZiA8PSAyMSA/IDMgOiA3O1xyXG5cclxuICAgICAgLy8gICAvLyBzLm9yaWdpbmFsUHJvZHVjdENvdW50ID0gcy5wcm9kdWN0UGVyU2hlbGY7XHJcbiAgICAgIC8vICAgLy8gcy5wcm9kdWN0UGVyU2hlbGYgPSBNYXRoLmZsb29yKFxyXG4gICAgICAvLyAgIC8vICAgcy5wcm9kdWN0UGVyU2hlbGYgLyAocy5wcm9kdWN0UGVyU2hlbGYgPD0gMjEgPyAzIDogNylcclxuICAgICAgLy8gICAvLyApO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICBpZiAocy5zaGVsZlR5cGUgPT0gXCJzaGVsZlwiKSB7XHJcbiAgICAgICAgcHJvZHVjdENvdW50ICs9IHMucHJvZHVjdFBlclNoZWxmO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHByb2R1Y3RDb3VudCArPSBzLnByb2R1Y3RQZXJTaGVsZiAqIHMudHJheVJvd3M7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzaGVsZlpvbmUgPSB0aGlzLnBsYW5vRml4dHVyZT8uc2hlbGZDb25maWcuZmluZChcclxuICAgICAgICAoc2hlbHZlOiBhbnkpID0+IHMuc2hlbGZOdW1iZXIgPT0gc2hlbHZlLnNoZWxmTnVtYmVyLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHNoZWxmWm9uZSkge1xyXG4gICAgICAgIGFpRGF0YS5zaGVsZkNvbmZpZ1tpbmRleF0gPSB7IC4uLnNoZWxmWm9uZSwgLi4ucyB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHMuem9uZSA9IFwiQm90dG9tXCI7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgYWlEYXRhLmZpeHR1cmVDYXBhY2l0eSA9IHByb2R1Y3RDb3VudDtcclxuICAgIHJldHVybiBhaURhdGE7XHJcbiAgfVxyXG5cclxuICBtb3ZlU3RyZXRjaFZNc0Zyb21QbGFub1RvQUkoKSB7XHJcbiAgICBpZiAoIXRoaXMuYWlGaXh0dXJlIHx8ICF0aGlzLnBsYW5vRml4dHVyZSkgcmV0dXJuO1xyXG5cclxuICAgIGlmICghdGhpcy5haUZpeHR1cmUudm1Db25maWcpIHtcclxuICAgICAgdGhpcy5haUZpeHR1cmUudm1Db25maWcgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhaVNoZWx2ZXMgPSB0aGlzLmFpRml4dHVyZT8uc2hlbGZDb25maWcgfHwgW107XHJcbiAgICBjb25zdCBwbGFub1NoZWx2ZXMgPSB0aGlzLnBsYW5vRml4dHVyZT8uc2hlbGZDb25maWcgfHwgW107XHJcblxyXG4gICAgaWYgKGFpU2hlbHZlcy5sZW5ndGggPT09IDAgfHwgcGxhbm9TaGVsdmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGFpRmlyc3RTaGVsZiA9IGFpU2hlbHZlc1swXTtcclxuICAgIGNvbnN0IGFpTGFzdFNoZWxmID0gYWlTaGVsdmVzW2FpU2hlbHZlcy5sZW5ndGggLSAxXTtcclxuICAgIGNvbnN0IHBsYW5vRmlyc3RTaGVsZiA9IHBsYW5vU2hlbHZlc1swXTtcclxuICAgIGNvbnN0IHBsYW5vTGFzdFNoZWxmID0gcGxhbm9TaGVsdmVzW3BsYW5vU2hlbHZlcy5sZW5ndGggLSAxXTtcclxuXHJcbiAgICBpZiAoIWFpRmlyc3RTaGVsZj8uc2hlbGZOdW1iZXIgfHwgIWFpTGFzdFNoZWxmPy5zaGVsZk51bWJlcikgcmV0dXJuO1xyXG4gICAgaWYgKCFwbGFub0ZpcnN0U2hlbGY/LnNoZWxmTnVtYmVyIHx8ICFwbGFub0xhc3RTaGVsZj8uc2hlbGZOdW1iZXIpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBhaUZpcnN0U2hlbGZOdW1iZXIgPSBhaUZpcnN0U2hlbGYuc2hlbGZOdW1iZXI7XHJcbiAgICBjb25zdCBhaUxhc3RTaGVsZk51bWJlciA9IGFpTGFzdFNoZWxmLnNoZWxmTnVtYmVyO1xyXG4gICAgY29uc3QgcGxhbm9GaXJzdFNoZWxmTnVtYmVyID0gcGxhbm9GaXJzdFNoZWxmLnNoZWxmTnVtYmVyO1xyXG4gICAgY29uc3QgcGxhbm9MYXN0U2hlbGZOdW1iZXIgPSBwbGFub0xhc3RTaGVsZi5zaGVsZk51bWJlcjtcclxuXHJcbiAgICBjb25zdCBtYXRjaGVzU3RyZXRjaENyaXRlcmlhID0gKHZtOiBhbnksIHNoZWxmTnVtYmVyOiBudW1iZXIpID0+IHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB2bT8ueFpvbmUgPT09IFwic3RyZXRjaFwiICYmXHJcbiAgICAgICAgdm0/Lnlab25lID09PSBcInN0cmV0Y2hcIiAmJlxyXG4gICAgICAgIHZtPy5zdGFydFlQb3NpdGlvbiA9PT0gc2hlbGZOdW1iZXIgJiZcclxuICAgICAgICB2bT8uZW5kWVBvc2l0aW9uID09PSBzaGVsZk51bWJlclxyXG4gICAgICApO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBoYXNGaXJzdFNoZWxmVk0gPSB0aGlzLmFpRml4dHVyZS52bUNvbmZpZy5zb21lKCh2bTogYW55KSA9PlxyXG4gICAgICBtYXRjaGVzU3RyZXRjaENyaXRlcmlhKHZtLCBhaUZpcnN0U2hlbGZOdW1iZXIpLFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoIWhhc0ZpcnN0U2hlbGZWTSkge1xyXG4gICAgICBjb25zdCBwbGFub1ZNID0gdGhpcy5wbGFub0ZpeHR1cmU/LnZtQ29uZmlnPy5maW5kKCh2bTogYW55KSA9PlxyXG4gICAgICAgIG1hdGNoZXNTdHJldGNoQ3JpdGVyaWEodm0sIHBsYW5vRmlyc3RTaGVsZk51bWJlciksXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAocGxhbm9WTSkge1xyXG4gICAgICAgIGNvbnN0IGNsb25lZFZNID0gc3RydWN0dXJlZENsb25lKHBsYW5vVk0pO1xyXG4gICAgICAgIGNsb25lZFZNLnN0YXJ0WVBvc2l0aW9uID0gYWlGaXJzdFNoZWxmTnVtYmVyO1xyXG4gICAgICAgIGNsb25lZFZNLmVuZFlQb3NpdGlvbiA9IGFpRmlyc3RTaGVsZk51bWJlcjtcclxuICAgICAgICB0aGlzLmFpRml4dHVyZS52bUNvbmZpZy5wdXNoKGNsb25lZFZNKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhhc0xhc3RTaGVsZlZNID0gdGhpcy5haUZpeHR1cmUudm1Db25maWcuc29tZSgodm06IGFueSkgPT5cclxuICAgICAgbWF0Y2hlc1N0cmV0Y2hDcml0ZXJpYSh2bSwgYWlMYXN0U2hlbGZOdW1iZXIpLFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoIWhhc0xhc3RTaGVsZlZNKSB7XHJcbiAgICAgIGNvbnN0IHBsYW5vVk0gPSB0aGlzLnBsYW5vRml4dHVyZT8udm1Db25maWc/LmZpbmQoKHZtOiBhbnkpID0+XHJcbiAgICAgICAgbWF0Y2hlc1N0cmV0Y2hDcml0ZXJpYSh2bSwgcGxhbm9MYXN0U2hlbGZOdW1iZXIpLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHBsYW5vVk0pIHtcclxuICAgICAgICBjb25zdCBjbG9uZWRWTSA9IHN0cnVjdHVyZWRDbG9uZShwbGFub1ZNKTtcclxuICAgICAgICBjbG9uZWRWTS5zdGFydFlQb3NpdGlvbiA9IGFpTGFzdFNoZWxmTnVtYmVyO1xyXG4gICAgICAgIGNsb25lZFZNLmVuZFlQb3NpdGlvbiA9IGFpTGFzdFNoZWxmTnVtYmVyO1xyXG4gICAgICAgIHRoaXMuYWlGaXh0dXJlLnZtQ29uZmlnLnB1c2goY2xvbmVkVk0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzU3BlY2lhbFZNU2hlbHZlcygpIHtcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuYWlGaXh0dXJlPy52bUNvbmZpZz8ubGVuZ3RoIHx8XHJcbiAgICAgICF0aGlzLmFpRml4dHVyZT8uc2hlbGZDb25maWc/Lmxlbmd0aFxyXG4gICAgKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc2hlbHZlcyA9IHRoaXMuYWlGaXh0dXJlLnNoZWxmQ29uZmlnO1xyXG4gICAgY29uc3Qgdm1zID0gdGhpcy5haUZpeHR1cmUudm1Db25maWc7XHJcblxyXG4gICAgY29uc3QgaXNTdHJldGNoVk0gPSAodm06IGFueSwgc2hlbGZOdW1iZXI6IG51bWJlcikgPT5cclxuICAgICAgdm0ueFpvbmUgPT09IFwic3RyZXRjaFwiICYmXHJcbiAgICAgIHZtLnlab25lID09PSBcInN0cmV0Y2hcIiAmJlxyXG4gICAgICB2bS5zdGFydFlQb3NpdGlvbiA9PT0gc2hlbGZOdW1iZXIgJiZcclxuICAgICAgdm0uZW5kWVBvc2l0aW9uID09PSBzaGVsZk51bWJlcjtcclxuXHJcbiAgICAvLyAtLS0gSGFuZGxlIGxlZ2FjeSB3b3JrYXJvdW5kOiBzaGVsZiB3aXRoIHR5cGUgXCJzaGVsZlwiIGFuZCAwIGNhcGFjaXR5IHVzZWQgYXMgdm1vbmx5IC0tLVxyXG4gICAgY29uc3QgZmlyc3RTaGVsZlJhdyA9IHNoZWx2ZXNbMF07XHJcbiAgICBpZiAoXHJcbiAgICAgIGZpcnN0U2hlbGZSYXcuc2hlbGZUeXBlID09PSAnc2hlbGYnICYmXHJcbiAgICAgIGZpcnN0U2hlbGZSYXcucHJvZHVjdFBlclNoZWxmID09PSAwICYmXHJcbiAgICAgIHZtcy5zb21lKCh2bTogYW55KSA9PiBpc1N0cmV0Y2hWTSh2bSwgZmlyc3RTaGVsZlJhdy5zaGVsZk51bWJlcikpXHJcbiAgICApIHtcclxuICAgICAgZmlyc3RTaGVsZlJhdy5zaGVsZlR5cGUgPSAndm1vbmx5JztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsYXN0U2hlbGZSYXcgPSBzaGVsdmVzW3NoZWx2ZXMubGVuZ3RoIC0gMV07XHJcbiAgICBpZiAoXHJcbiAgICAgIGxhc3RTaGVsZlJhdy5zaGVsZlR5cGUgPT09ICdzaGVsZicgJiZcclxuICAgICAgbGFzdFNoZWxmUmF3LnByb2R1Y3RQZXJTaGVsZiA9PT0gMCAmJlxyXG4gICAgICB2bXMuc29tZSgodm06IGFueSkgPT4gaXNTdHJldGNoVk0odm0sIGxhc3RTaGVsZlJhdy5zaGVsZk51bWJlcikpXHJcbiAgICApIHtcclxuICAgICAgbGFzdFNoZWxmUmF3LnNoZWxmVHlwZSA9ICd2bW9ubHknO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIC0tLSBUb3AgTWFza2luZzogZW5zdXJlIGZpcnN0IHNoZWxmIGlzIHZtb25seSAtLS1cclxuICAgIGNvbnN0IGZpcnN0U2hlbGYgPSBzaGVsdmVzWzBdO1xyXG4gICAgY29uc3QgdG9wTWFza2luZ1ZNID0gdm1zLmZpbmQoKHZtOiBhbnkpID0+XHJcbiAgICAgIGlzU3RyZXRjaFZNKHZtLCBmaXJzdFNoZWxmLnNoZWxmTnVtYmVyKSxcclxuICAgICk7XHJcblxyXG4gICAgbGV0IGRpZFRvcE1hc2tpbmdJbmNyZW1lbnQgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodG9wTWFza2luZ1ZNICYmIGZpcnN0U2hlbGYuc2hlbGZUeXBlICE9PSBcInZtb25seVwiKSB7XHJcbiAgICAgIC8vIEluc2VydCB2bW9ubHkgc2hlbGYgYXQgcG9zaXRpb24gMCB3aXRoIHNoZWxmTnVtYmVyIDFcclxuICAgICAgc2hlbHZlcy51bnNoaWZ0KHtcclxuICAgICAgICBzaGVsZk51bWJlcjogMSxcclxuICAgICAgICBzaGVsZlR5cGU6IFwidm1vbmx5XCIsXHJcbiAgICAgICAgcHJvZHVjdFBlclNoZWxmOiAwLFxyXG4gICAgICAgIHRyYXlSb3dzOiAwLFxyXG4gICAgICAgIHpvbmU6IFwiVG9wXCIsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gSW5jcmVtZW50IGFsbCBvdGhlciBzaGVsZiBudW1iZXJzIGJ5IDFcclxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzaGVsdmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgc2hlbHZlc1tpXS5zaGVsZk51bWJlciA9IHNoZWx2ZXNbaV0uc2hlbGZOdW1iZXIgKyAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBkaWRUb3BNYXNraW5nSW5jcmVtZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0gQm90dG9tIFNsYW5kZXI6IGVuc3VyZSBsYXN0IHNoZWxmIGlzIHZtb25seSAtLS1cclxuICAgIGNvbnN0IGxhc3RTaGVsZiA9IHNoZWx2ZXNbc2hlbHZlcy5sZW5ndGggLSAxXTtcclxuICAgIC8vIFZNIHBvc2l0aW9ucyBhcmUgc3RpbGwgdXNpbmcgb3JpZ2luYWwgbnVtYmVycywgc28gY2hlY2sgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc2hlbGYgbnVtYmVyXHJcbiAgICBjb25zdCBib3R0b21TbGFuZGVyU2hlbGZOdW1iZXIgPSBkaWRUb3BNYXNraW5nSW5jcmVtZW50XHJcbiAgICAgID8gbGFzdFNoZWxmLnNoZWxmTnVtYmVyIC0gMVxyXG4gICAgICA6IGxhc3RTaGVsZi5zaGVsZk51bWJlcjtcclxuICAgIGNvbnN0IGJvdHRvbVNsYW5kZXJWTSA9IHZtcy5maW5kKCh2bTogYW55KSA9PlxyXG4gICAgICBpc1N0cmV0Y2hWTSh2bSwgYm90dG9tU2xhbmRlclNoZWxmTnVtYmVyKSxcclxuICAgICk7XHJcblxyXG4gICAgbGV0IGRpZEJvdHRvbVNsYW5kZXJBZGQgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoYm90dG9tU2xhbmRlclZNICYmIGxhc3RTaGVsZi5zaGVsZlR5cGUgIT09IFwidm1vbmx5XCIpIHtcclxuICAgICAgY29uc3QgbmV3U2hlbGZOdW1iZXIgPSBsYXN0U2hlbGYuc2hlbGZOdW1iZXIgKyAxO1xyXG4gICAgICBzaGVsdmVzLnB1c2goe1xyXG4gICAgICAgIHNoZWxmTnVtYmVyOiBuZXdTaGVsZk51bWJlcixcclxuICAgICAgICBzaGVsZlR5cGU6IFwidm1vbmx5XCIsXHJcbiAgICAgICAgcHJvZHVjdFBlclNoZWxmOiAwLFxyXG4gICAgICAgIHRyYXlSb3dzOiAwLFxyXG4gICAgICAgIHpvbmU6IFwiQm90dG9tXCIsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZGlkQm90dG9tU2xhbmRlckFkZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIFVwZGF0ZSBWTSBwb3NpdGlvbnMgYmFzZWQgb24gd2hhdCB3YXMgYWRkZWQgLS0tXHJcbiAgICBjb25zdCB0b3BPZmZzZXQgPSBkaWRUb3BNYXNraW5nSW5jcmVtZW50ID8gMSA6IDA7XHJcbiAgICBjb25zdCBib3R0b21PZmZzZXQgPSBkaWRCb3R0b21TbGFuZGVyQWRkID8gMSA6IDA7XHJcblxyXG4gICAgaWYgKHRvcE9mZnNldCB8fCBib3R0b21PZmZzZXQpIHtcclxuICAgICAgdm1zLmZvckVhY2goKHZtOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodm0gPT09IHRvcE1hc2tpbmdWTSB8fCB2bSA9PT0gYm90dG9tU2xhbmRlclZNKSByZXR1cm47XHJcbiAgICAgICAgdm0uc3RhcnRZUG9zaXRpb24gPSB2bS5zdGFydFlQb3NpdGlvbiArIHRvcE9mZnNldDtcclxuICAgICAgICB2bS5lbmRZUG9zaXRpb24gPSB2bS5lbmRZUG9zaXRpb24gKyB0b3BPZmZzZXQ7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKGJvdHRvbVNsYW5kZXJWTSAmJiBkaWRCb3R0b21TbGFuZGVyQWRkKSB7XHJcbiAgICAgICAgLy8gK3RvcE9mZnNldCBmb3IgdGhlIHRvcCB2bW9ubHkgKyArYm90dG9tT2Zmc2V0IGZvciB0aGUgYm90dG9tIHZtb25seVxyXG4gICAgICAgIGJvdHRvbVNsYW5kZXJWTS5zdGFydFlQb3NpdGlvbiA9XHJcbiAgICAgICAgICBib3R0b21TbGFuZGVyVk0uc3RhcnRZUG9zaXRpb24gKyB0b3BPZmZzZXQgKyBib3R0b21PZmZzZXQ7XHJcbiAgICAgICAgYm90dG9tU2xhbmRlclZNLmVuZFlQb3NpdGlvbiA9XHJcbiAgICAgICAgICBib3R0b21TbGFuZGVyVk0uZW5kWVBvc2l0aW9uICsgdG9wT2Zmc2V0ICsgYm90dG9tT2Zmc2V0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb21wYXJlRml4dHVyZShhaUZpeHR1cmU6IGFueSwgY3VycmVudEZpeHR1cmU6IGFueSkge1xyXG4gICAgaWYgKCFhaUZpeHR1cmUgfHwgIWN1cnJlbnRGaXh0dXJlKSByZXR1cm47XHJcbiAgICAvKiA9PT09PT09PT09PT09PT09PSBIRUFERVIgPT09PT09PT09PT09PT09PT0gKi9cclxuICAgIGNvbnN0IGFpSGVhZGVyID0gKGFpRml4dHVyZS5oZWFkZXI/LmxhYmVsID8/IFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgY29uc3QgY3VySGVhZGVyID0gKGN1cnJlbnRGaXh0dXJlLmhlYWRlcj8ubGFiZWwgPz8gXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgYWlGaXh0dXJlLmhlYWRlci5pc0RpZmZlcmVudCA9IGFpSGVhZGVyICE9PSBjdXJIZWFkZXI7XHJcblxyXG4gICAgLyogPT09PT09PT09PT09PT09PT0gU0hFTFZFUyA9PT09PT09PT09PT09PT09PSAqL1xyXG4gICAgY29uc3QgY3VycmVudFNoZWxmTWFwID0gbmV3IE1hcDxudW1iZXIsIGFueT4oXHJcbiAgICAgIChjdXJyZW50Rml4dHVyZS5zaGVsZkNvbmZpZyA/PyBbXSkubWFwKChzOiBhbnkpID0+IFtzLnNoZWxmTnVtYmVyLCBzXSksXHJcbiAgICApO1xyXG5cclxuICAgIChhaUZpeHR1cmUuc2hlbGZDb25maWcgPz8gW10pLmZvckVhY2goKGFpU2hlbGY6IGFueSkgPT4ge1xyXG4gICAgICBhaVNoZWxmLmlzRGlmZmVyZW50ID0gZmFsc2U7XHJcblxyXG4gICAgICBjb25zdCBjdXJTaGVsZiA9IGN1cnJlbnRTaGVsZk1hcC5nZXQoYWlTaGVsZi5zaGVsZk51bWJlcik7XHJcbiAgICAgIGlmICghY3VyU2hlbGYpIHtcclxuICAgICAgICBhaVNoZWxmLmlzRGlmZmVyZW50ID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICBhaVNoZWxmLnNoZWxmVHlwZSAhPT0gY3VyU2hlbGYuc2hlbGZUeXBlIHx8XHJcbiAgICAgICAgYWlTaGVsZi5wcm9kdWN0UGVyU2hlbGYgIT09IGN1clNoZWxmLnByb2R1Y3RQZXJTaGVsZiB8fFxyXG4gICAgICAgIGFpU2hlbGYudHJheVJvd3MgIT09IGN1clNoZWxmLnRyYXlSb3dzXHJcbiAgICAgICkge1xyXG4gICAgICAgIGFpU2hlbGYuaXNEaWZmZXJlbnQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvKiA9PT09PT09PT09PT09PT09PSBWTXMgPT09PT09PT09PT09PT09PT0gKi9cclxuICAgIGNvbnN0IHZtS2V5ID0gKHY6IGFueSkgPT5cclxuICAgICAgYCR7di52bVR5cGV9fCR7di52bU5hbWV9fCR7di5zdGFydFlQb3NpdGlvbn18JHt2LmVuZFlQb3NpdGlvbn1gXHJcbiAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAudHJpbSgpO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRWTVNldCA9IG5ldyBTZXQoKGN1cnJlbnRGaXh0dXJlLnZtQ29uZmlnID8/IFtdKS5tYXAodm1LZXkpKTtcclxuXHJcbiAgICAoYWlGaXh0dXJlLnZtQ29uZmlnID8/IFtdKS5mb3JFYWNoKChhaVZNOiBhbnkpID0+IHtcclxuICAgICAgYWlWTS5pc0RpZmZlcmVudCA9ICFjdXJyZW50Vk1TZXQuaGFzKHZtS2V5KGFpVk0pKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gdXBkYXRlVk1saXN0V2l0aEFpRGF0YSgpIHtcclxuICAvLyAgIHRoaXMuYWlGaXh0dXJlPy52bUNvbmZpZz8uZm9yRWFjaCgoYWlWbTogYW55KSA9PiB7XHJcbiAgLy8gICAgIC8vIGNvbnNvbGUubG9nKFwiQEAgfiBhaVZtOlwiLCBhaVZtKTtcclxuXHJcbiAgLy8gICAgIGNvbnN0IHZtSW5MaXN0ID0gdGhpcy52bUxpc3QuZmluZChcclxuICAvLyAgICAgICAodm0pID0+IHZtLm5hbWUgPT09IGFpVm0/LnZtTmFtZSAmJiB2bS50eXBlID09PSBhaVZtPy52bVR5cGVcclxuICAvLyAgICAgKTtcclxuXHJcbiAgLy8gICAgIGlmICh2bUluTGlzdCkge1xyXG4gIC8vICAgICAgIC8vIHZtSW5MaXN0LmlkID0gYWlWbS52bU5hbWU7XHJcbiAgLy8gICAgICAgaWYgKGFpVm0/LnZtSW1hZ2UpIHtcclxuICAvLyAgICAgICAgIHZtSW5MaXN0LmltZ1VybCA9IGAke3RoaXMuaW1nQ0ROfSR7YWlWbS52bUltYWdlfWA7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIHRoaXMudm1MaXN0LnB1c2goe1xyXG4gIC8vICAgICAgICAgaWQ6IGFpVm0udm1OYW1lLFxyXG4gIC8vICAgICAgICAgbmFtZTogYWlWbS52bU5hbWUsXHJcbiAgLy8gICAgICAgICBkaXNwbGF5TmFtZTogYWlWbS52bU5hbWUgKyAoYWlWbT8udm1UeXBlID8gYCgke2FpVm0udm1UeXBlfSlgIDogXCJcIiksXHJcbiAgLy8gICAgICAgICB3aWR0aDogMTAwLFxyXG4gIC8vICAgICAgICAgaGVpZ2h0OiAxMDAsXHJcbiAgLy8gICAgICAgICB0eXBlOiBhaVZtLnZtVHlwZSxcclxuICAvLyAgICAgICAgIC4uLihhaVZtLnZtSW1hZ2UgPyB7IGltZ1VybDogYCR7dGhpcy5pbWdDRE59JHthaVZtLnZtSW1hZ2V9YCB9IDoge30pLFxyXG4gIC8vICAgICAgIH0gYXMgYW55KTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuICBnZXQgaXNBcHByb3ZlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5hcHByb3ZhbFN0YXR1cyA9PT0gXCJhcHByb3ZlZFwiO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VGaXh0dXJlKGNoYW5nZTogXCJuZXh0XCIgfCBcInByZXZpb3VzXCIpIHtcclxuICAgIHRoaXMuY2hhbmdlRml4dHVyZS5lbWl0KHtcclxuICAgICAgY3VycmVudEZpeHR1cmU6IHRoaXMuZmVlZGJhY2tEZXRhaWxzLmZpeHR1cmVGZWVkYmFjay5maXh0dXJlSWQsXHJcbiAgICAgIGFjdGlvbjogY2hhbmdlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm9uQ2FuY2VsQUlRdWlja0VkaXQoKTtcclxuICAgIC8vIHRoaXMub25DYW5jZWxQbGFub1F1aWNrRWRpdCgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DbGlja0tlZXBQbGFubygpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybUFjdGlvbihcImtlZXBQbGFub1wiKTtcclxuICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSBcIm5vdE9rXCIpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMuYWN0aW9uLmVtaXQoe1xyXG4gICAgICAgIGFjdGlvbjogXCJrZWVwUGxhbm9cIixcclxuICAgICAgICB0eXBlOiBcImFncmVlXCIsXHJcbiAgICAgICAgZml4dHVyZURhdGE6IHRoaXMucGxhbm9GaXh0dXJlLFxyXG4gICAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrLFxyXG4gICAgICAgIHJlbWFya3M6IHJlc3VsdD8ucmVtYXJrLFxyXG4gICAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gb25DbGlja0tlZXBQbGFubyBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ2xpY2tBY2NlcHRBSSgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybUFjdGlvbihcImFjY2VwdEFJXCIpO1xyXG4gICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09IFwibm90T2tcIikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgdGhpcy5hY3Rpb24uZW1pdCh7XHJcbiAgICAgICAgYWN0aW9uOiBcImFjY2VwdEFpXCIsXHJcbiAgICAgICAgdHlwZTogXCJhZ3JlZVwiLFxyXG4gICAgICAgIGZpeHR1cmVEYXRhOiB0aGlzLmFpRml4dHVyZSxcclxuICAgICAgICBmZWVkYmFjazogdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjayxcclxuICAgICAgICByZW1hcmtzOiByZXN1bHQ/LnJlbWFyayxcclxuICAgICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICB0YXNrVHlwZTogXCJmaXh0dXJlXCIsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IG9uQ2xpY2tBY2NlcHRBSSBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ2xpY2tSZWRvKCkge1xyXG4gICAgaWYgKHRoaXMuaXNBSVF1aWNrRWRpdCkgcmV0dXJuO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybUFjdGlvbihcInJlZG9cIik7XHJcbiAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gXCJub3RPa1wiKSByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLmFjdGlvbi5lbWl0KHtcclxuICAgICAgICBhY3Rpb246IFwicmVkb1wiLFxyXG4gICAgICAgIHR5cGU6IFwiZGlzYWdyZWVcIixcclxuICAgICAgICBmaXh0dXJlRGF0YTogbnVsbCxcclxuICAgICAgICBmZWVkYmFjazogdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjayxcclxuICAgICAgICByZW1hcms6IHJlc3VsdCxcclxuICAgICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICB0YXNrVHlwZTogXCJmaXh0dXJlXCIsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IG9uQ2xpY2tSZWRvIFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkVkaXRBSUZlZWRiYWNrKGRhdGFUb0VkaXQ/OiBhbnkpIHtcclxuICAgIHRoaXMuYWN0aW9uLmVtaXQoe1xyXG4gICAgICBhY3Rpb246IFwiZWRpdFdpdGhBaVwiLFxyXG4gICAgICB0eXBlOiBcImFncmVlXCIsXHJcbiAgICAgIGZpeHR1cmVEYXRhOiBkYXRhVG9FZGl0Py5maXh0dXJlRGF0YSA/PyB0aGlzLmFpRml4dHVyZSxcclxuICAgICAgZmVlZGJhY2s6IHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2ssXHJcbiAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgdGFza1R5cGU6IFwiZml4dHVyZVwiLFxyXG4gICAgICB0YWI6IGRhdGFUb0VkaXQ/LnRhYixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25FZGl0RmVlZGJhY2soKSB7XHJcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHtcclxuICAgICAgYWN0aW9uOiBcImVkaXRXaXRoUGxhbm9cIixcclxuICAgICAgdHlwZTogXCJhZ3JlZVwiLFxyXG4gICAgICBmaXh0dXJlRGF0YTogdGhpcy5wbGFub0ZpeHR1cmUsXHJcbiAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrLFxyXG4gICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQUlRdWlja0VkaXQoKSB7XHJcbiAgICB0aGlzLmlzQUlRdWlja0VkaXQgPSAhdGhpcy5pc0FJUXVpY2tFZGl0O1xyXG4gIH1cclxuXHJcbiAgb25DYW5jZWxBSVF1aWNrRWRpdCgpIHtcclxuICAgIHRoaXMuaXNBSVF1aWNrRWRpdCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TYXZlQUlRdWlja0VkaXQobmV3QWlEYXRhOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybUFjdGlvbihcImFjY2VwdEFJXCIpO1xyXG4gICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09IFwibm90T2tcIikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgdGhpcy5haUZpeHR1cmUgPSBzdHJ1Y3R1cmVkQ2xvbmUobmV3QWlEYXRhKTtcclxuXHJcbiAgICAgIHRoaXMuYWN0aW9uLmVtaXQoe1xyXG4gICAgICAgIGFjdGlvbjogXCJhY2NlcHRBaVwiLFxyXG4gICAgICAgIHR5cGU6IFwiYWdyZWVcIixcclxuICAgICAgICBmaXh0dXJlRGF0YTogdGhpcy5haUZpeHR1cmUsXHJcbiAgICAgICAgZmVlZGJhY2s6IHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2ssXHJcbiAgICAgICAgcmVtYXJrczogcmVzdWx0Py5yZW1hcmssXHJcbiAgICAgICAgcGxhbm9JZDogdGhpcy5mbG9vckRhdGEucGxhbm9JZCxcclxuICAgICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgdGFza1R5cGU6IFwiZml4dHVyZVwiLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuaXNBSVF1aWNrRWRpdCA9IGZhbHNlO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IG9uU2F2ZUFJUXVpY2tFZGl0IFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtQWN0aW9uKFxyXG4gICAgdHlwZTogXCJyZWRvXCIgfCBcImFjY2VwdEFJXCIgfCBcImtlZXBQbGFub1wiLFxyXG4gICk6IFByb21pc2U8eyBhY3Rpb246IHN0cmluZzsgcmVtYXJrOiBzdHJpbmcgfCBudWxsIH0gfCBudWxsPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihBY3Rpb25Db25maXJtUG9wdXBDb21wb25lbnQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgICBzaXplOiBcIm1kXCIsXHJcbiAgICAgICAgYmFja2Ryb3A6IFwic3RhdGljXCIsXHJcbiAgICAgIH0pO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50eXBlID0gdHlwZTtcclxuXHJcbiAgICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjx7XHJcbiAgICAgICAgYWN0aW9uOiBzdHJpbmc7XHJcbiAgICAgICAgcmVtYXJrOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgICB9PigocmVzdWx0KSA9PiByZXN1bHQpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrSW1hZ2VQcmV2aWV3KGV2ZW50OiBNb3VzZUV2ZW50LCBpbWdVcmw6IHN0cmluZykge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkSW1hZ2VGb3JQcmV2aWV3ID0gaW1nVXJsO1xyXG4gICAgdGhpcy5pbWFnZVByZXZpZXdab29tID0gMTtcclxuICAgIHRoaXMuaW1hZ2VQcmV2aWV3UGFuWCA9IDA7XHJcbiAgICB0aGlzLmltYWdlUHJldmlld1BhblkgPSAwO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VJbWFnZVByZXZpZXcoKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSW1hZ2VGb3JQcmV2aWV3ID0gbnVsbDtcclxuICAgIHRoaXMuaW1hZ2VQcmV2aWV3Wm9vbSA9IDE7XHJcbiAgICB0aGlzLmltYWdlUHJldmlld1BhblggPSAwO1xyXG4gICAgdGhpcy5pbWFnZVByZXZpZXdQYW5ZID0gMDtcclxuICB9XHJcblxyXG4gIG9uUHJldmlld1pvb21JbigpIHtcclxuICAgIHRoaXMuaW1hZ2VQcmV2aWV3Wm9vbSA9IE1hdGgubWluKHRoaXMuaW1hZ2VQcmV2aWV3Wm9vbSArIDAuMjUsIDUpO1xyXG4gICAgaWYgKHRoaXMuaW1hZ2VQcmV2aWV3Wm9vbSA8PSAxKSB0aGlzLnJlc2V0UGFuKCk7XHJcbiAgfVxyXG5cclxuICBvblByZXZpZXdab29tT3V0KCkge1xyXG4gICAgdGhpcy5pbWFnZVByZXZpZXdab29tID0gTWF0aC5tYXgodGhpcy5pbWFnZVByZXZpZXdab29tIC0gMC4yNSwgMC4yNSk7XHJcbiAgICBpZiAodGhpcy5pbWFnZVByZXZpZXdab29tIDw9IDEpIHRoaXMucmVzZXRQYW4oKTtcclxuICB9XHJcblxyXG4gIG9uUHJldmlld1pvb21TbGlkZXIoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9ICsoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG4gICAgdGhpcy5pbWFnZVByZXZpZXdab29tID0gdmFsdWUgLyAxMDA7XHJcbiAgICBpZiAodGhpcy5pbWFnZVByZXZpZXdab29tIDw9IDEpIHRoaXMucmVzZXRQYW4oKTtcclxuICB9XHJcblxyXG4gIG9uUHJldmlld1doZWVsKGV2ZW50OiBXaGVlbEV2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcclxuICAgICAgdGhpcy5vblByZXZpZXdab29tSW4oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub25QcmV2aWV3Wm9vbU91dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25QcmV2aWV3UGFuU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmltYWdlUHJldmlld1pvb20gPD0gMSkgcmV0dXJuO1xyXG4gICAgdGhpcy5pc1Bhbm5pbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5wYW5MYXN0WCA9IGV2ZW50LmNsaWVudFg7XHJcbiAgICB0aGlzLnBhbkxhc3RZID0gZXZlbnQuY2xpZW50WTtcclxuICB9XHJcblxyXG4gIG9uUHJldmlld1Bhbk1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5pc1Bhbm5pbmcpIHJldHVybjtcclxuICAgIGNvbnN0IGR4ID0gZXZlbnQuY2xpZW50WCAtIHRoaXMucGFuTGFzdFg7XHJcbiAgICBjb25zdCBkeSA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLnBhbkxhc3RZO1xyXG4gICAgdGhpcy5wYW5MYXN0WCA9IGV2ZW50LmNsaWVudFg7XHJcbiAgICB0aGlzLnBhbkxhc3RZID0gZXZlbnQuY2xpZW50WTtcclxuICAgIHRoaXMuaW1hZ2VQcmV2aWV3UGFuWCArPSBkeDtcclxuICAgIHRoaXMuaW1hZ2VQcmV2aWV3UGFuWSArPSBkeTtcclxuICB9XHJcblxyXG4gIG9uUHJldmlld1BhbkVuZCgpIHtcclxuICAgIHRoaXMuaXNQYW5uaW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0UGFuKCkge1xyXG4gICAgdGhpcy5pbWFnZVByZXZpZXdQYW5YID0gMDtcclxuICAgIHRoaXMuaW1hZ2VQcmV2aWV3UGFuWSA9IDA7XHJcbiAgfVxyXG5cclxuICBvbkltYWdlTG9hZCgpIHtcclxuICAgIHRoaXMuaXNJbWFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uSW1hZ2VFcnJvcigpIHtcclxuICAgIHRoaXMuaXNJbWFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uSW1hZ2VMb2FkU3RhcnQoKSB7XHJcbiAgICB0aGlzLmlzSW1hZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG9uSW1hZ2VMb2FkRW5kKCkge1xyXG4gICAgdGhpcy5pc0ltYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBGaXh0dXJlUXVpY2tEZXRhaWwge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICBlZGl0YWJsZTogYm9vbGVhbjtcclxuICBpc0RpZmZlcmVudD86IGJvb2xlYW47XHJcblxyXG4gIG1ldGE/OiB7XHJcbiAgICB0eXBlOiBcImZpeHR1cmVcIiB8IFwic2hlbGZcIiB8IFwidHJheVwiO1xyXG4gICAgc2hlbGZOdW1iZXI/OiBudW1iZXI7XHJcbiAgfTtcclxufVxyXG4iLCI8c2VjdGlvbiBpZD1cInZlcmlmaWNhdGlvbi1mZWVkYmFja1wiPlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8udGFza0RhdGFcIiBpZD1cInRhc2staW5mb1wiIG5nYkFjY29yZGlvbiAjYWNjb3JkaW9uPVwibmdiQWNjb3JkaW9uXCI+XHJcbiAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZGV0YWlsc1wiIFtjb2xsYXBzZWRdPVwiZmVlZGJhY2tEZXRhaWxzPy50YXNrSW5mb1RvZ2dsZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkhlYWRlciBuZ2JBY2NvcmRpb25Ub2dnbGUgY2xhc3M9XCJhY2NvcmRpb24tYnV0dG9uIHRhc2staW5mby1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMj5GaXh0dXJlIHZlcmlmaWNhdGlvbiBhc3NpZ25lZDwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+e3tmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8udGFza0RhdGE/LmNyZWF0ZWRBdCB8IGRhdGU6ICdoaDptbTpzcyBhIC0gZGQgTU1NIHl5eXknfX08L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgZmlsbD1cIiNFQUY4RkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjIuNjY3MyAyMy41VjIxLjgzMzNDMjIuNjY3MyAyMC45NDkzIDIyLjMxNjEgMjAuMTAxNCAyMS42OTEgMTkuNDc2M0MyMS4wNjU5IDE4Ljg1MTIgMjAuMjE4IDE4LjUgMTkuMzM0IDE4LjVIMTIuNjY3M0MxMS43ODMzIDE4LjUgMTAuOTM1NCAxOC44NTEyIDEwLjMxMDMgMTkuNDc2M0M5LjY4NTE3IDIwLjEwMTQgOS4zMzM5OCAyMC45NDkzIDkuMzMzOTggMjEuODMzM1YyMy41TTE5LjMzNCAxMS44MzMzQzE5LjMzNCAxMy42NzQzIDE3Ljg0MTYgMTUuMTY2NyAxNi4wMDA3IDE1LjE2NjdDMTQuMTU5NyAxNS4xNjY3IDEyLjY2NzMgMTMuNjc0MyAxMi42NjczIDExLjgzMzNDMTIuNjY3MyA5Ljk5MjM4IDE0LjE1OTcgOC41IDE2LjAwMDcgOC41QzE3Ljg0MTYgOC41IDE5LjMzNCA5Ljk5MjM4IDE5LjMzNCAxMS44MzMzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+e3tmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8udGFza0RhdGE/LmNyZWF0ZWRCeU5hbWV9fTwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LnRhc2tEYXRhPy5jcmVhdGVkQXQgfCBkYXRlOiAnaGg6bW1hLCBkZCBNTU0geXl5eSd9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+QXNzaWduZXI8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBVc2VyIGF2YXRhciAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgcng9XCIxNlwiIGZpbGw9XCIjRUFGOEZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIyLjY2NzMgMjMuNVYyMS44MzMzQzIyLjY2NzMgMjAuOTQ5MyAyMi4zMTYxIDIwLjEwMTQgMjEuNjkxIDE5LjQ3NjNDMjEuMDY1OSAxOC44NTEyIDIwLjIxOCAxOC41IDE5LjMzNCAxOC41SDEyLjY2NzNDMTEuNzgzMyAxOC41IDEwLjkzNTQgMTguODUxMiAxMC4zMTAzIDE5LjQ3NjNDOS42ODUxNyAyMC4xMDE0IDkuMzMzOTggMjAuOTQ5MyA5LjMzMzk4IDIxLjgzMzNWMjMuNU0xOS4zMzQgMTEuODMzM0MxOS4zMzQgMTMuNjc0MyAxNy44NDE2IDE1LjE2NjcgMTYuMDAwNyAxNS4xNjY3QzE0LjE1OTcgMTUuMTY2NyAxMi42NjczIDEzLjY3NDMgMTIuNjY3MyAxMS44MzMzQzEyLjY2NzMgOS45OTIzOCAxNC4xNTk3IDguNSAxNi4wMDA3IDguNUMxNy44NDE2IDguNSAxOS4zMzQgOS45OTIzOCAxOS4zMzQgMTEuODMzM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PiB7e2ZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy50YXNrRGF0YT8udXNlck5hbWV9fTwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LnRhc2tEYXRhPy5zdWJtaXRUaW1lX3N0cmluZ319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT5Bc3NpZ25lZTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChmZWVkYmFja0RldGFpbHM/Lmdsb2JhbENvbW1lbnRzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTJcIj5Db21tZW50czwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nLWJsb2NrXCIgKm5nRm9yPVwibGV0IGMgb2YgZmVlZGJhY2tEZXRhaWxzPy5nbG9iYWxDb21tZW50cztsZXQgaT0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgcng9XCIxNlwiIGZpbGw9XCIjRUFGOEZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjIuNjY3MyAyMy41VjIxLjgzMzNDMjIuNjY3MyAyMC45NDkzIDIyLjMxNjEgMjAuMTAxNCAyMS42OTEgMTkuNDc2M0MyMS4wNjU5IDE4Ljg1MTIgMjAuMjE4IDE4LjUgMTkuMzM0IDE4LjVIMTIuNjY3M0MxMS43ODMzIDE4LjUgMTAuOTM1NCAxOC44NTEyIDEwLjMxMDMgMTkuNDc2M0M5LjY4NTE3IDIwLjEwMTQgOS4zMzM5OCAyMC45NDkzIDkuMzMzOTggMjEuODMzM1YyMy41TTE5LjMzNCAxMS44MzMzQzE5LjMzNCAxMy42NzQzIDE3Ljg0MTYgMTUuMTY2NyAxNi4wMDA3IDE1LjE2NjdDMTQuMTU5NyAxNS4xNjY3IDEyLjY2NzMgMTMuNjc0MyAxMi42NjczIDExLjgzMzNDMTIuNjY3MyA5Ljk5MjM4IDE0LjE1OTcgOC41IDE2LjAwMDcgOC41QzE3Ljg0MTYgOC41IDE5LjMzNCA5Ljk5MjM4IDE5LjMzNCAxMS44MzMzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND57e2M/LnVzZXJOYW1lfX08L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD57e2M/LmNyZWF0ZWRBdHxkYXRlOidoaDptbTpzcyBhIC0gZGQgTU1NIHl5eXknfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT57e2M/LmNvbW1lbnR9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8aHIgKm5nSWY9XCJmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8udGFza0RhdGFcIj5cclxuXHJcbiAgICA8ZGl2IGlkPVwiZmVlZGJhY2staGFuZGxlclwiIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtNiBteS02IHB4LTMgZml4dHVyZS1uYXZpZ2F0ZVwiPlxyXG4gICAgICAgIDxzdmcgKm5nSWY9XCJzaG93QWN0aW9uXCIgKGNsaWNrKT1cIm9uQ2hhbmdlRml4dHVyZSgncHJldmlvdXMnKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIlxyXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUgNkw5IDEyTDE1IDE4XCIgc3Ryb2tlPVwiIzFEMjkzOVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuXHJcblxyXG4gICAgICAgIDxoMyBjbGFzcz1cIm0tMFwiPnt7cGxhbm9GaXh0dXJlPy5oZWFkZXI/LmxhYmVsfX08L2gzPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyBmbGV4LXdyYXBcIj5cclxuXHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI1XCIgaGVpZ2h0PVwiNVwiIHZpZXdCb3g9XCIwIDAgNSA1XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMi41XCIgY3k9XCIyLjVcIiByPVwiMi41XCIgZmlsbD1cIiNFQUVDRjBcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGxhbm9GaXh0dXJlPy5maXh0dXJlQ2F0ZWdvcnlcIiBjbGFzcz1cImJhZGdlIGluYWN0aXZlIG1lLTFcIj5cclxuICAgICAgICAgICAgICAgIHt7IHBsYW5vRml4dHVyZS5maXh0dXJlQ2F0ZWdvcnkgfCB0aXRsZWNhc2V9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNVwiIGhlaWdodD1cIjVcIiB2aWV3Qm94PVwiMCAwIDUgNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjIuNVwiIGN5PVwiMi41XCIgcj1cIjIuNVwiIGZpbGw9XCIjRUFFQ0YwXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInBsYW5vRml4dHVyZT8uZml4dHVyZVdpZHRoPy52YWx1ZVwiIGNsYXNzPVwiYmFkZ2UgaW5hY3RpdmUgbWUtMVwiPlxyXG4gICAgICAgICAgICAgICAge3sgcGxhbm9GaXh0dXJlLmZpeHR1cmVXaWR0aC52YWx1ZSB9fSB7eyBwbGFub0ZpeHR1cmUuZml4dHVyZVdpZHRoPy51bml0ID8/ICdmdCcgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjVcIiBoZWlnaHQ9XCI1XCIgdmlld0JveD1cIjAgMCA1IDVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyLjVcIiBjeT1cIjIuNVwiIHI9XCIyLjVcIiBmaWxsPVwiI0VBRUNGMFwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgPHNwYW4gIGNsYXNzPVwiYmFkZ2UgaW5hY3RpdmUgbWUtMVwiPlxyXG4gICAgICAgICAgICAgICAgRml4dHVyZSBDYXBhY2l0eToge3sgcGxhbm9GaXh0dXJlPy5maXh0dXJlQ2FwYWNpdHkgfHwgMCB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNVwiIGhlaWdodD1cIjVcIiB2aWV3Qm94PVwiMCAwIDUgNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjIuNVwiIGN5PVwiMi41XCIgcj1cIjIuNVwiIGZpbGw9XCIjRUFFQ0YwXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICA8c3BhbiAgY2xhc3M9XCJiYWRnZSBpbmFjdGl2ZSBtZS0xXCI+XHJcbiAgICAgICAgICAgICAgICBWaXN1YWwgTWVyY2ggQ2FwYWNpdHk6IHt7IHBsYW5vRml4dHVyZT8udm1Db25maWc/Lmxlbmd0aCB8fCAwIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxoMyAqbmdJZj1cInNob3dBY3Rpb25cIiBjbGFzcz1cIm0tMCBtcy1hdXRvXCI+XHJcbiAgICAgICAgICAgIHt7Y3VycmVudEZpeHR1cmVJbmRleH19L3t7dG90YWxGaXh0dXJlcy5sZW5ndGh9fVxyXG4gICAgICAgIDwvaDM+XHJcblxyXG4gICAgICAgIDxzdmcgKm5nSWY9XCJzaG93QWN0aW9uXCIgKGNsaWNrKT1cIm9uQ2hhbmdlRml4dHVyZSgnbmV4dCcpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiXHJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk05IDE4TDE1IDEyTDkgNlwiIHN0cm9rZT1cIiMxRDI5MzlcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgQGlmKCB0aGlzLmFpRml4dHVyZT8uZml4dHVyZUlkKXtcclxuICAgICAgICA8ZGl2IGlkPVwiZml4dHVyZS1jb21wYXJpc29uXCIgY2xhc3M9XCJyb3cgZy0wIG15LTNcIj5cclxuICAgICAgICAgICAgQGlmIChzaG93QWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTQgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWlzQXBwcm92ZWQgJiYgc2hvd0FjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gcXVpY2stYnRuIG1zLWF1dG9cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdEZlZWRiYWNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8yMjhfMTI1MzYpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjE2NjAyIDMuMzMzMkgzLjMzMjY4QzIuODkwNjUgMy4zMzMyIDIuNDY2NzMgMy41MDg3OSAyLjE1NDE3IDMuODIxMzVDMS44NDE2MSA0LjEzMzkxIDEuNjY2MDIgNC41NTc4NCAxLjY2NjAyIDQuOTk5ODZWMTYuNjY2NUMxLjY2NjAyIDE3LjEwODYgMS44NDE2MSAxNy41MzI1IDIuMTU0MTcgMTcuODQ1QzIuNDY2NzMgMTguMTU3NiAyLjg5MDY1IDE4LjMzMzIgMy4zMzI2OCAxOC4zMzMySDE0Ljk5OTNDMTUuNDQxNCAxOC4zMzMyIDE1Ljg2NTMgMTguMTU3NiAxNi4xNzc5IDE3Ljg0NUMxNi40OTA0IDE3LjUzMjUgMTYuNjY2IDE3LjEwODYgMTYuNjY2IDE2LjY2NjVWMTAuODMzMk0xNS40MTYgMi4wODMyQzE1Ljc0NzUgMS43NTE2OCAxNi4xOTcyIDEuNTY1NDMgMTYuNjY2IDEuNTY1NDNDMTcuMTM0OSAxLjU2NTQzIDE3LjU4NDUgMS43NTE2OCAxNy45MTYgMi4wODMyQzE4LjI0NzUgMi40MTQ3MiAxOC40MzM4IDIuODY0MzYgMTguNDMzOCAzLjMzMzJDMTguNDMzOCAzLjgwMjA0IDE4LjI0NzUgNC4yNTE2OCAxNy45MTYgNC41ODMyTDkuOTk5MzUgMTIuNDk5OUw2LjY2NjAyIDEzLjMzMzJMNy40OTkzNSA5Ljk5OTg2TDE1LjQxNiAyLjA4MzJaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzFEMjkzOVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMjI4XzEyNTM2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gcHJpbWFyeS1idG5cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2xpY2tLZWVwUGxhbm8oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0FJUXVpY2tFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgcGxhbm9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiAgbXktNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yLjcyNSA1LjgwMDA4TDEwIDEwLjAwODRMMTcuMjc1IDUuODAwMDhNMTAgMTguNDAwMVYxMC4wMDAxTTE3LjUgMTMuMzMzNFY2LjY2Njc1QzE3LjQ5OTcgNi4zNzQ0OCAxNy40MjI1IDYuMDg3NDIgMTcuMjc2MyA1LjgzNDM4QzE3LjEzIDUuNTgxMzQgMTYuOTE5OCA1LjM3MTIyIDE2LjY2NjcgNS4yMjUwOEwxMC44MzMzIDEuODkxNzVDMTAuNTggMS43NDU0NyAxMC4yOTI2IDEuNjY4NDYgMTAgMS42Njg0NkM5LjcwNzQ0IDEuNjY4NDYgOS40MjAwMyAxLjc0NTQ3IDkuMTY2NjcgMS44OTE3NUwzLjMzMzMzIDUuMjI1MDhDMy4wODAyMiA1LjM3MTIyIDIuODY5OTggNS41ODEzNCAyLjcyMzcyIDUuODM0MzhDMi41Nzc0NSA2LjA4NzQyIDIuNTAwMyA2LjM3NDQ4IDIuNSA2LjY2Njc1VjEzLjMzMzRDMi41MDAzIDEzLjYyNTcgMi41Nzc0NSAxMy45MTI3IDIuNzIzNzIgMTQuMTY1OEMyLjg2OTk4IDE0LjQxODggMy4wODAyMiAxNC42Mjg5IDMuMzMzMzMgMTQuNzc1MUw5LjE2NjY3IDE4LjEwODRDOS40MjAwMyAxOC4yNTQ3IDkuNzA3NDQgMTguMzMxNyAxMCAxOC4zMzE3QzEwLjI5MjYgMTguMzMxNyAxMC41OCAxOC4yNTQ3IDEwLjgzMzMgMTguMTA4NEwxNi42NjY3IDE0Ljc3NTFDMTYuOTE5OCAxNC42Mjg5IDE3LjEzIDE0LjQxODggMTcuMjc2MyAxNC4xNjU4QzE3LjQyMjUgMTMuOTEyNyAxNy40OTk3IDEzLjYyNTcgMTcuNSAxMy4zMzM0WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtLTBcIj5FeGlzdGluZyB0ZW1wbGF0ZSA8L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ2JUb29sdGlwXT1cInBsYW5vRml4dHVyZT8uZml4dHVyZU5hbWVcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80OTZfMzE2NjQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC4wMDEzIDEzLjMzMzdWMTAuMDAwM00xMC4wMDEzIDYuNjY2OTlIMTAuMDA5Nk0xOC4zMzQ2IDEwLjAwMDNDMTguMzM0NiAxNC42MDI3IDE0LjYwMzcgMTguMzMzNyAxMC4wMDEzIDE4LjMzMzdDNS4zOTg5MyAxOC4zMzM3IDEuNjY3OTcgMTQuNjAyNyAxLjY2Nzk3IDEwLjAwMDNDMS42Njc5NyA1LjM5Nzk1IDUuMzk4OTMgMS42NjY5OSAxMC4wMDEzIDEuNjY2OTlDMTQuNjAzNyAxLjY2Njk5IDE4LjMzNDYgNS4zOTc5NSAxOC4zMzQ2IDEwLjAwMDNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDk2XzMxNjY0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGlzQXBwcm92ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5hbnN3ZXJzWzBdPy51c2VyQWN0aW9uID09PSAna2VlcFBsYW5vJyB8fCBmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vyc1swXT8udXNlckFjdGlvbiA9PT0gJ2VkaXRXaXRoUGxhbm8nIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLWF1dG9cIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeT1cIjguNzQyMjhlLTA3XCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgcng9XCIxMFwiIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0LjI0NjQgNi4xNTgzOUw4LjI3OTY5IDExLjkxNjdMNi42OTYzNSAxMC4yMjUxQzYuNDA0NjkgOS45NTAwNSA1Ljk0NjM1IDkuOTMzMzkgNS42MTMwMiAxMC4xNjY3QzUuMjg4MDIgMTAuNDA4NCA1LjE5NjM1IDEwLjgzMzQgNS4zOTYzNSAxMS4xNzUxTDcuMjcxMzUgMTQuMjI1MUM3LjQ1NDY5IDE0LjUwODQgNy43NzEzNSAxNC42ODM0IDguMTI5NjkgMTQuNjgzNEM4LjQ3MTM1IDE0LjY4MzQgOC43OTYzNSAxNC41MDg0IDguOTc5NjkgMTQuMjI1MUM5LjI3OTY5IDEzLjgzMzQgMTUuMDA0NyA3LjAwODM5IDE1LjAwNDcgNy4wMDgzOUMxNS43NTQ3IDYuMjQxNzIgMTQuODQ2NCA1LjU2NjcyIDE0LjI0NjQgNi4xNTAwNUwxNC4yNDY0IDYuMTU4MzlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzEyQjc2QVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZpeHR1cmUgW2ZpeHR1cmVdPVwicGxhbm9GaXh0dXJlXCI+PC9maXh0dXJlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWlzQXBwcm92ZWQgJiYgc2hvd0FjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHJlZG8tYnRuXCIgKGNsaWNrKT1cIm9uQ2xpY2tSZWRvKClcIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNBSVF1aWNrRWRpdFwiICpuZ0lmPVwiIWZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5oaWRlUmVkb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gcXVpY2stYnRuIG1zLWF1dG9cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdEFJRmVlZGJhY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0FJUXVpY2tFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMjI4XzEyNTM2KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOS4xNjYwMiAzLjMzMzJIMy4zMzI2OEMyLjg5MDY1IDMuMzMzMiAyLjQ2NjczIDMuNTA4NzkgMi4xNTQxNyAzLjgyMTM1QzEuODQxNjEgNC4xMzM5MSAxLjY2NjAyIDQuNTU3ODQgMS42NjYwMiA0Ljk5OTg2VjE2LjY2NjVDMS42NjYwMiAxNy4xMDg2IDEuODQxNjEgMTcuNTMyNSAyLjE1NDE3IDE3Ljg0NUMyLjQ2NjczIDE4LjE1NzYgMi44OTA2NSAxOC4zMzMyIDMuMzMyNjggMTguMzMzMkgxNC45OTkzQzE1LjQ0MTQgMTguMzMzMiAxNS44NjUzIDE4LjE1NzYgMTYuMTc3OSAxNy44NDVDMTYuNDkwNCAxNy41MzI1IDE2LjY2NiAxNy4xMDg2IDE2LjY2NiAxNi42NjY1VjEwLjgzMzJNMTUuNDE2IDIuMDgzMkMxNS43NDc1IDEuNzUxNjggMTYuMTk3MiAxLjU2NTQzIDE2LjY2NiAxLjU2NTQzQzE3LjEzNDkgMS41NjU0MyAxNy41ODQ1IDEuNzUxNjggMTcuOTE2IDIuMDgzMkMxOC4yNDc1IDIuNDE0NzIgMTguNDMzOCAyLjg2NDM2IDE4LjQzMzggMy4zMzMyQzE4LjQzMzggMy44MDIwNCAxOC4yNDc1IDQuMjUxNjggMTcuOTE2IDQuNTgzMkw5Ljk5OTM1IDEyLjQ5OTlMNi42NjYwMiAxMy4zMzMyTDcuNDk5MzUgOS45OTk4NkwxNS40MTYgMi4wODMyWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxRDI5MzlcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzIyOF8xMjUzNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHByaW1hcnktYnRuXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNsaWNrQWNjZXB0QUkoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0FJUXVpY2tFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdCBzdG9yZSByZXNwb25zZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiAgbXktNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNS42NTA0IDE0LjYxOTFINC4zNDg2M1YxMC43MzczQzQuMjM4MjYgMTAuNzQ1NSA0LjEyNjQ0IDEwLjc1IDQuMDEzNjcgMTAuNzVDMy45NzEzNyAxMC43NSAzLjkyOTQzIDEwLjc0NjMgMy44ODc3IDEwLjc0NTFWMTUuODAzN0MzLjg4Nzg4IDE2LjQ0NyA0LjQyMjIyIDE2Ljk4ODMgNS4wOTg2MyAxNi45ODgzSDE0LjkwMDRDMTUuNTc2OCAxNi45ODgzIDE2LjExMDIgMTYuNDQ3IDE2LjExMDQgMTUuODAzN1YxMC43NDUxQzE2LjA3MDggMTAuNzQ2MiAxNi4wMzExIDEwLjc1IDE1Ljk5MTIgMTAuNzVDMTUuODc2OCAxMC43NSAxNS43NjI5IDEwLjc0NDkgMTUuNjUwNCAxMC43MzYzVjE0LjYxOTFaTTE1LjQ2MzkgMy4wMTE3Mkg0LjUzNDE4QzQuNDg3MjMgMy4wMTE4NyA0LjQ0OTczIDMuMDM3NzYgNC40MzQ1NyAzLjA2MTUyVjMuMDYyNUwyLjY3ODcxIDUuODAzNzFMMi42NjAxNiA1LjgzMzAxQzIuMDQ3NjggNi44Mjc4NiAyLjY0MzI1IDguMTE3MzkgMy43MzQzOCA4LjI2MzY3QzMuODMxNzQgOC4yNzU2MSAzLjkyMjI0IDguMjgyMjIgNC4wMTA3NCA4LjI4MjIzQzQuNTg4ODkgOC4yODIyMyA1LjA5OTc4IDguMDM0MTkgNS40NTYwNSA3LjY0NzQ2TDYuMDA5NzcgNy4wNDY4OEw2LjU2MTUyIDcuNjQ5NDFDNi45MTM0MSA4LjAzMzcxIDcuNDIzMDEgOC4yODIxNSA4LjAwNDg4IDguMjgyMjNDOC41ODQzMyA4LjI4MjIzIDkuMDk3NTkgOC4wMzM0OSA5LjQ0OTIyIDcuNjQ5NDFMMTAuMDAyIDcuMDQ0OTJMMTAuNTU1NyA3LjY0OTQxQzEwLjkwNzMgOC4wMzM0OSAxMS40MjA2IDguMjgyMjMgMTIgOC4yODIyM0MxMi41NzkyIDguMjgyMSAxMy4wOTE4IDguMDMzMzcgMTMuNDQzNCA3LjY0OTQxTDEzLjk5NzEgNy4wNDQ5MkwxNC41NDk4IDcuNjQ5NDFDMTQuOTAxNCA4LjAzMzQ5IDE1LjQxNDcgOC4yODIyMyAxNS45OTQxIDguMjgyMjNDMTYuMDc5MSA4LjI4MjIyIDE2LjE3MTYgOC4yNzUzMyAxNi4yNjc2IDguMjYzNjdDMTcuMzYzNSA4LjExNTA0IDE3Ljk2MjMgNi44MDA4IDE3LjMyMzIgNS44MDM3MUwxNS41NjQ1IDMuMDYyNUwxNS41NjM1IDMuMDYxNTJDMTUuNTQ4MyAzLjAzNzY5IDE1LjUxMSAzLjAxMTcyIDE1LjQ2MzkgMy4wMTE3MlpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+U3RvcmUgcmVzcG9uc2UgPC9oND5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAgY2xhc3M9XCJiYWRnZSBpbmFjdGl2ZSBtZS0xXCIgKm5nSWY9XCIhaXNBSVF1aWNrRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBhY2l0eToge3thaUZpeHR1cmU/LmZpeHR1cmVDYXBhY2l0eSB8fCAwIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXNBcHByb3ZlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnNbMF0/LnVzZXJBY3Rpb24gPT09ICdhY2NlcHRBaScgfHwgZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnNbMF0/LnVzZXJBY3Rpb24gPT09ICdlZGl0V2l0aEFpJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLWF1dG9cIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeT1cIjguNzQyMjhlLTA3XCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgcng9XCIxMFwiIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0LjI0NjQgNi4xNTgzOUw4LjI3OTY5IDExLjkxNjdMNi42OTYzNSAxMC4yMjUxQzYuNDA0NjkgOS45NTAwNSA1Ljk0NjM1IDkuOTMzMzkgNS42MTMwMiAxMC4xNjY3QzUuMjg4MDIgMTAuNDA4NCA1LjE5NjM1IDEwLjgzMzQgNS4zOTYzNSAxMS4xNzUxTDcuMjcxMzUgMTQuMjI1MUM3LjQ1NDY5IDE0LjUwODQgNy43NzEzNSAxNC42ODM0IDguMTI5NjkgMTQuNjgzNEM4LjQ3MTM1IDE0LjY4MzQgOC43OTYzNSAxNC41MDg0IDguOTc5NjkgMTQuMjI1MUM5LjI3OTY5IDEzLjgzMzQgMTUuMDA0NyA3LjAwODM5IDE1LjAwNDcgNy4wMDgzOUMxNS43NTQ3IDYuMjQxNzIgMTQuODQ2NCA1LjU2NjcyIDE0LjI0NjQgNi4xNTAwNUwxNC4yNDY0IDYuMTU4MzlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzEyQjc2QVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5hbnN3ZXJzWzBdPy51c2VyQWN0aW9uID09PSAncmVkbycgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtYXV0b1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4yNTA2NSAxNS44MzM1QzYuOTAzNDMgMTUuODMzNSA1Ljc0NzA0IDE1LjM5NiA0Ljc4MTQ4IDE0LjUyMUMzLjgxNTkzIDEzLjY0NiAzLjMzMzQzIDEyLjU1NTcgMy4zMzM5OCAxMS4yNTAyQzMuMzMzOTggOS45NDQ2MSAzLjgxNjc2IDguODU0MzMgNC43ODIzMiA3Ljk3OTMzQzUuNzQ3ODcgNy4xMDQzMyA2LjkwMzk4IDYuNjY2ODMgOC4yNTA2NSA2LjY2NjgzSDEzLjUwMDdMMTEuMzM0IDQuNTAwMTZMMTIuNTAwNyAzLjMzMzVMMTYuNjY3MyA3LjUwMDE2TDEyLjUwMDcgMTEuNjY2OEwxMS4zMzQgMTAuNTAwMkwxMy41MDA3IDguMzMzNUg4LjI1MDY1QzcuMzc1NjUgOC4zMzM1IDYuNjE1MSA4LjYxMTI3IDUuOTY4OTggOS4xNjY4M0M1LjMyMjg3IDkuNzIyMzggNS4wMDAxIDEwLjQxNjggNS4wMDA2NSAxMS4yNTAyQzUuMDAwNjUgMTIuMDgzNSA1LjMyMzcxIDEyLjc3NzkgNS45Njk4MiAxMy4zMzM1QzYuNjE1OTMgMTMuODg5MSA3LjM3NjIxIDE0LjE2NjggOC4yNTA2NSAxNC4xNjY4SDE0LjE2NzNWMTUuODMzNUg4LjI1MDY1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImJsYWNrXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInNob3dBY3Rpb24gJiYgIWlzQUlRdWlja0VkaXRcIiBjbGFzcz1cIm1zLWF1dG8gY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFJUXVpY2tFZGl0KClcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgMTUuMDAwMkgxNS43NU0xMi4zNzUgMi42MjUxN0MxMi42NzM0IDIuMzI2OCAxMy4wNzggMi4xNTkxOCAxMy41IDIuMTU5MThDMTMuNzA4OSAyLjE1OTE4IDEzLjkxNTggMi4yMDAzMyAxNC4xMDg4IDIuMjgwMjlDMTQuMzAxOSAyLjM2MDI0IDE0LjQ3NzMgMi40Nzc0MyAxNC42MjUgMi42MjUxN0MxNC43NzI3IDIuNzcyOTEgMTQuODg5OSAyLjk0ODMgMTQuOTY5OSAzLjE0MTMyQzE1LjA0OTggMy4zMzQzNSAxNS4wOTEgMy41NDEyNCAxNS4wOTEgMy43NTAxN0MxNS4wOTEgMy45NTkxIDE1LjA0OTggNC4xNjU5OSAxNC45Njk5IDQuMzU5MDJDMTQuODg5OSA0LjU1MjA0IDE0Ljc3MjcgNC43Mjc0MyAxNC42MjUgNC44NzUxN0w1LjI1IDE0LjI1MDJMMi4yNSAxNS4wMDAyTDMgMTIuMDAwMkwxMi4zNzUgMi42MjUxN1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGVkaXRhYmxlLWZpeHR1cmUgW2ZpeHR1cmVdPVwiYWlGaXh0dXJlXCIgW2VkaXRNb2RlXT1cImlzQUlRdWlja0VkaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2FuY2VsKT1cIm9uQ2FuY2VsQUlRdWlja0VkaXQoKVwiIChvbkRvbmUpPVwib25TYXZlQUlRdWlja0VkaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWRpdFRhYik9XCJvbkVkaXRBSUZlZWRiYWNrKCRldmVudClcIj48L2VkaXRhYmxlLWZpeHR1cmU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtMlwiIFtuZ0NsYXNzXT1cInsnY29sLTQnOnNob3dBY3Rpb24sJ2NvbCc6IXNob3dBY3Rpb259XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzpzaG93QWN0aW9uICYmICFpc0FwcHJvdmVkID8gJzUwcHgnIDogJzEycHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiAgbXktNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PlN0b3JlIEltYWdlIDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihjZG4gJiYgYWlGaXh0dXJlPy5maXh0dXJlSW1hZ2Upe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4dHVyZS1pbWFnZVwiIChjbGljayk9XCJvbkNsaWNrSW1hZ2VQcmV2aWV3KCRldmVudCwgY2RuICsgYWlGaXh0dXJlPy5maXh0dXJlSW1hZ2UpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoaXNJbWFnZUxvYWRpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2tlbGV0b25Mb2FkZXJcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjZG4gKyBhaUZpeHR1cmU/LmZpeHR1cmVJbWFnZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJTdG9yZSByZXNwb25zZSBpbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cImlzSW1hZ2VMb2FkaW5nID8gJ25vbmUnIDogJ2Jsb2NrJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2Fkc3RhcnQpPVwib25JbWFnZUxvYWRTdGFydCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQpPVwib25JbWFnZUxvYWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJvbkltYWdlRXJyb3IoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkZW5kKT1cIm9uSW1hZ2VMb2FkRW5kKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxODZcIiBoZWlnaHQ9XCI4NFwiIHZpZXdCb3g9XCIwIDAgMTg2IDg0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEzMC4yNTYgMTUuMzI4NEMxNDAuMDkyIDE1LjMyODQgMTQ4LjA2NSAyMy4zMDIgMTQ4LjA2NSAzMy4xMzc5QzE0OC4wNjUgMzcuMjE3NiAxNTAuODI2IDQxLjg2ODQgMTU0LjkwNiA0MS44Njg0SDE2Ny45NzJDMTc3LjgwNyA0MS44Njg3IDE4NS43ODEgNDkuODQyMiAxODUuNzgxIDU5LjY3OEMxODUuNzgxIDY5LjUxNDEgMTc3LjgwNyA3Ny40ODg1IDE2Ny45NzEgNzcuNDg4NUg4MS4zNjYyQzY5LjcxODYgNzcuNDg4MyA1OC42MzQ5IDY4LjQwODQgNDYuOTg3MyA2OC40MDg0SDUuOTM2NTJDMi42NTc4MiA2OC40MDg0IDAgNjUuNzUwNiAwIDYyLjQ3MTlDMC4wMDAxMjc4MjMgNTkuMTkzMyAyLjY1NzkgNTYuNTM1NCA1LjkzNjUyIDU2LjUzNTRINjEuODcyOEM2My4wMDY5IDU2LjUzNTQgNjMuOTY2OSA1NS42OTI5IDY0LjI4OTcgNTQuNjA1NkM2NC43OTk0IDUyLjg4OTIgNjMuNjI2NyA1MC45NDg1IDYxLjgzNjEgNTAuOTQ4NUg0My42NTE0QzMzLjgxNTMgNTAuOTQ4NSAyNS44NDE4IDQyLjk3NCAyNS44NDE4IDMzLjEzNzlDMjUuODQyIDIzLjMwMiAzMy44MTU0IDE1LjMyODQgNDMuNjUxNCAxNS4zMjg0SDEzMC4yNTZaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNFQUVDRjBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTI2LjY2NCAyNy4zMzVWNDguNjVMMTIwLjk1OSA0My43NUMxMTguMjI5IDQxLjQwNSAxMTMuODE5IDQxLjQwNSAxMTEuMDg5IDQzLjc1TDk2LjUyOTEgNTYuMjQ1QzkzLjc5OTEgNTguNTkgODkuMzg5MSA1OC41OSA4Ni42NTkxIDU2LjI0NUw4NS40NjkxIDU1LjI2NUM4Mi45ODQxIDUzLjA5NSA3OS4wMjkxIDUyLjg4NSA3Ni4yMjkxIDU0Ljc3NUw1OS4wMDkxIDY2LjMyNUw1OC42MjQxIDY2LjYwNUM1Ny4zMjkxIDYzLjgwNSA1Ni42NjQxIDYwLjQ4IDU2LjY2NDEgNTYuNjY1VjI3LjMzNUM1Ni42NjQxIDE0LjU5NSA2NC4yNTkxIDcgNzYuOTk5MSA3SDEwNi4zMjlDMTE5LjA2OSA3IDEyNi42NjQgMTQuNTk1IDEyNi42NjQgMjcuMzM1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNkJDQUZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTgxLjE2NCAzNi4zMjk5Qzg1Ljc2NDUgMzYuMzI5OSA4OS40OTQgMzIuNjAwNSA4OS40OTQgMjcuOTk5OUM4OS40OTQgMjMuMzk5NCA4NS43NjQ1IDE5LjY2OTkgODEuMTY0IDE5LjY2OTlDNzYuNTYzNSAxOS42Njk5IDcyLjgzNCAyMy4zOTk0IDcyLjgzNCAyNy45OTk5QzcyLjgzNCAzMi42MDA1IDc2LjU2MzUgMzYuMzI5OSA4MS4xNjQgMzYuMzI5OVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwQTNGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMjYuNjY1IDQ4LjY1VjU2LjY2NUMxMjYuNjY1IDY5LjQwNSAxMTkuMDcgNzcgMTA2LjMzIDc3SDc3QzY4LjA3NSA3NyA2MS42MzUgNzMuMjU1IDU4LjYyNSA2Ni42MDVMNTkuMDEgNjYuMzI1TDc2LjIzIDU0Ljc3NUM3OS4wMyA1Mi44ODUgODIuOTg1IDUzLjA5NSA4NS40NyA1NS4yNjVMODYuNjYgNTYuMjQ1Qzg5LjM5IDU4LjU5IDkzLjggNTguNTkgOTYuNTMgNTYuMjQ1TDExMS4wOSA0My43NUMxMTMuODIgNDEuNDA1IDExOC4yMyA0MS40MDUgMTIwLjk2IDQzLjc1TDEyNi42NjUgNDguNjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMwMEEzRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMzguMDY0XCIgY3k9XCIyOC4zMTI4XCIgcj1cIjQuNDAwNDJcIiBmaWxsPVwiIzZCQ0FGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjQ3LjgyNTZcIiBjeT1cIjM5LjI0MDlcIiByPVwiMi40NTI1NVwiIGZpbGw9XCIjNkJDQUZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBjeD1cIjEzOS4xODNcIiBjeT1cIjYxLjAwNzJcIiByeD1cIjQuMjkxOTdcIiByeT1cIjQuNTk4NTRcIiBmaWxsPVwiIzAwQTNGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGlkPVwidm0tY29tcGFyaXNvblwiICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVBSURhdGE/LnZtQ29uZmlnLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0xXCI+VmlzdWFsIE1lcmNoYW5kaXNlIEltYWdlcyBmcm9tIEFJIG91dHB1dDo8L2g1PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTBcIj5cclxuXHJcbiAgICAgICAgICAgICAgICBAZm9yICh2bSBvZiBmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUFJRGF0YT8udm1Db25maWc7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTJcIiBbbmdDbGFzc109XCJ7J2NvbC02JzpzaG93QWN0aW9uLCAnY29sLTEyJzohc2hvd0FjdGlvbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZtLWNvbnRhaW5lclwiIChjbGljayk9XCJvbkNsaWNrSW1hZ2VQcmV2aWV3KCRldmVudCwgY2RuK3ZtPy52bUltYWdlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZtLWltZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjZG4rdm0/LnZtSW1hZ2VcIiBhbHQ9XCJWTSBJbWFnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yIHZtLWRldGFpbHMgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1Pnt7dm0/LnZtVHlwZX19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+e3t2bT8udm1OYW1lfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1AZWxzZSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTZcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjk0XCIgaGVpZ2h0PVwiOTRcIiB2aWV3Qm94PVwiMCAwIDk0IDk0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiN1wiIHk9XCI3XCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgcng9XCI0MFwiIGZpbGw9XCIjREFGMUZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiN1wiIHk9XCI3XCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgcng9XCI0MFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCIxMy4zMzMzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTM1Ljk1MDIgNDguMTk5N0MzNS42NDg5IDQ4LjIzMTUgMzUuMzQyMiA0OC4yNTA1IDM1LjAzMTIgNDguMjUwNUMzNC44NjE3IDQ4LjI1MDUgMzQuNjk0NCA0OC4yNDM2IDM0LjUyOTMgNDguMjMzOVY1OC42MDY5QzM0LjUyOTMgNjAuMDM0OSAzNS43MTIzIDYxLjIyNiAzNy4yMDAyIDYxLjIyNjFINTYuODA0N0M1OC4yOTI3IDYxLjIyNjEgNTkuNDc1NiA2MC4wMzUgNTkuNDc1NiA1OC42MDY5VjQ4LjIzNDlDNTkuMzEzNyA0OC4yNDQxIDU5LjE0OTggNDguMjUwNSA1OC45ODU0IDQ4LjI1MDVDNTguNjcxNCA0OC4yNTA1IDU4LjM2MDggNDguMjMyNSA1OC4wNTQ3IDQ4LjE5OTdWNTUuOTg3OEgzNS45NTAyVjQ4LjE5OTdaTTU3LjkzMTYgMzIuNzczOUgzNi4wNzMyQzM1Ljg5NTkgMzIuNzczOSAzNS43NDA2IDMyLjg2NjcgMzUuNjYzMSAzMi45ODc4TDM1LjY2MTEgMzIuOTg5N0wzMi4xNTE0IDM4LjQ3MzFMMzIuMDU2NiAzOC42MjA2QzMwLjgzMTEgNDAuNzQwNCAzMi4wOTU3IDQzLjQ2NzQgMzQuNDQ3MyA0My43NzY5QzM0LjY0ODIgNDMuODAxMyAzNC44Mzc5IDQzLjgxNTkgMzUuMDI1NCA0My44MTU5QzM2LjI1NTUgNDMuODE1OSAzNy4zNDM0IDQzLjI4NzIgMzguMTAwNiA0Mi40NjUzTDM5LjAyMjUgNDEuNDY0NEwzOS45NDE0IDQyLjQ2ODNDNDAuNjkwMyA0My4yODYzIDQxLjc3NyA0My44MTU5IDQzLjAxNDYgNDMuODE1OUM0NC4yNDY3IDQzLjgxNTggNDUuMzM4NiA0My4yODU2IDQ2LjA4NjkgNDIuNDY4M0w0Ny4wMDg4IDQxLjQ2MTRMNDcuOTMwNyA0Mi40NjgzQzQ4LjY3OSA0My4yODU3IDQ5Ljc3MDcgNDMuODE1OSA1MS4wMDI5IDQzLjgxNTlDNTIuMjM1MSA0My44MTU5IDUzLjMyNjggNDMuMjg1NyA1NC4wNzUyIDQyLjQ2ODNMNTQuOTk3MSA0MS40NjE0TDU1LjkxODkgNDIuNDY4M0M1Ni42NjczIDQzLjI4NTcgNTcuNzYgNDMuODE1OSA1OC45OTIyIDQzLjgxNTlDNTkuMTczNiA0My44MTU5IDU5LjM2ODcgNDMuODAyMSA1OS41Njg0IDQzLjc3NzhINTkuNTY3NEM2MS45NjExIDQzLjQ1NzMgNjMuMjI5MyA0MC42MDc4IDYxLjg2MTMgMzguNDczMUw2MS44NjA0IDM4LjQ3NDFMNTguMzQzOCAzMi45OTA3TDU4LjM0MjggMzIuOTg3OEM1OC4yNjUzIDMyLjg2NjUgNTguMTA5MiAzMi43NzM5IDU3LjkzMTYgMzIuNzczOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1ib2xkIGgzIG10LTJcIj5ObyByZXNwb25zZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5ObyBBSSByZXNwb25zZSBmb3VuZCBmb3IgdGhpcyBmaXh0dXJlLjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1cclxuXHJcblxyXG4gICAgQGlmIChmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vycz8uWzBdPy5jb21tZW50cy5sZW5ndGgpIHtcclxuICAgICAgICA8ZGl2IGlkPVwiZml4dHVyZS1jb21tZW50c1wiPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0yXCI+Q29tbWVudHM8L2g1PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYyBvZiBmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vyc1swXT8uY29tbWVudHM7bGV0IGk9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIFVzZXIgYXZhdGFyIC0tPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgcng9XCIxNlwiIGZpbGw9XCIjRUFGOEZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIyLjY2NzMgMjMuNVYyMS44MzMzQzIyLjY2NzMgMjAuOTQ5MyAyMi4zMTYxIDIwLjEwMTQgMjEuNjkxIDE5LjQ3NjNDMjEuMDY1OSAxOC44NTEyIDIwLjIxOCAxOC41IDE5LjMzNCAxOC41SDEyLjY2NzNDMTEuNzgzMyAxOC41IDEwLjkzNTQgMTguODUxMiAxMC4zMTAzIDE5LjQ3NjNDOS42ODUxNyAyMC4xMDE0IDkuMzMzOTggMjAuOTQ5MyA5LjMzMzk4IDIxLjgzMzNWMjMuNU0xOS4zMzQgMTEuODMzM0MxOS4zMzQgMTMuNjc0MyAxNy44NDE2IDE1LjE2NjcgMTYuMDAwNyAxNS4xNjY3QzE0LjE1OTcgMTUuMTY2NyAxMi42NjczIDEzLjY3NDMgMTIuNjY3MyAxMS44MzMzQzEyLjY2NzMgOS45OTIzOCAxNC4xNTk3IDguNSAxNi4wMDA3IDguNUMxNy44NDE2IDguNSAxOS4zMzQgOS45OTIzOCAxOS4zMzQgMTEuODMzM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIGZsZXgtY29sdW1uXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0Pnt7Yz8udXNlck5hbWV9fTwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPnt7Yz8udGltZVN0YW1wIHwgZGF0ZTonaGg6bW06c3MgYSAtIGRkIE1NTSB5eXl5J319PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoYz8ucmVzcG9uc2V0eXBlID09PSAnY29tbWVudCcpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDU+e3tjPy5jb21tZW50fX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgIH1AZWxzZSBpZihjPy5yZXNwb25zZXR5cGUgPT09ICdhZ3JlZScpe1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1ICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnM/LlswXT8udXNlckFjdGlvbiA9PT0gJ2tlZXBQbGFubydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIktlZXAgUGxhbm9cIi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1ICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnM/LlswXT8udXNlckFjdGlvbiA9PT0gJ2VkaXRXaXRoUGxhbm8nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrZWQgYXMgXCJLZWVwIFBsYW5vIHdpdGggTW9kaWZpY2F0aW9uXCIuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSAqbmdJZj1cImZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5hbnN3ZXJzPy5bMF0/LnVzZXJBY3Rpb24gPT09ICdhY2NlcHRBaSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIkFjY2VwdCBBSVwiLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vycz8uWzBdPy51c2VyQWN0aW9uID09PSAnZWRpdFdpdGhBaSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIkFjY2VwdCBBSSB3aXRoIE1vZGlmaWNhdGlvblwiLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJjPy5jb21tZW50XCI+Tm90ZToge3tjLmNvbW1lbnR9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgfUBlbHNlIGlmKGM/LnJlc3BvbnNldHlwZSA9PT0gJ2Rpc2FncmVlJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIlJlZG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJjPy5jb21tZW50XCI+Tm90ZToge3tjLmNvbW1lbnR9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJpbWctcHJldmlld1wiICpuZ0lmPVwic2VsZWN0ZWRJbWFnZUZvclByZXZpZXdcIiAoY2xpY2spPVwiY2xvc2VJbWFnZVByZXZpZXcoKVwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwcmV2aWV3LWNsb3NlXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgY2xvc2VJbWFnZVByZXZpZXcoKVwiPiYjeDI3MTU7PC9idXR0b24+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctem9vbS1jb250cm9sc1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25QcmV2aWV3Wm9vbU91dCgpXCI+JiN4MjIxMjs8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGNsYXNzPVwiem9vbS1zbGlkZXJcIiBtaW49XCIyNVwiIG1heD1cIjUwMFwiIHN0ZXA9XCIyNVwiXHJcbiAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaW1hZ2VQcmV2aWV3Wm9vbSAqIDEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25QcmV2aWV3Wm9vbVNsaWRlcigkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgPHNwYW4+e3sgKGltYWdlUHJldmlld1pvb20gKiAxMDApLnRvRml4ZWQoMCkgfX0lPC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvblByZXZpZXdab29tSW4oKVwiPiYjeDJCOzwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LWltYWdlLWNvbnRhaW5lclwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblByZXZpZXdQYW5TdGFydCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25QcmV2aWV3UGFuTW92ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChtb3VzZXVwKT1cIm9uUHJldmlld1BhbkVuZCgpXCJcclxuICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uUHJldmlld1BhbkVuZCgpXCJcclxuICAgICAgICAgICAgICh3aGVlbCk9XCJvblByZXZpZXdXaGVlbCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDxpbWcgW3NyY109XCJzZWxlY3RlZEltYWdlRm9yUHJldmlld1wiIGNsYXNzPVwiZnVsbC1pbWdcIlxyXG4gICAgICAgICAgICAgICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwiJ3NjYWxlKCcgKyBpbWFnZVByZXZpZXdab29tICsgJykgdHJhbnNsYXRlKCcgKyBpbWFnZVByZXZpZXdQYW5YIC8gaW1hZ2VQcmV2aWV3Wm9vbSArICdweCwnICsgaW1hZ2VQcmV2aWV3UGFuWSAvIGltYWdlUHJldmlld1pvb20gKyAncHgpJ1wiXHJcbiAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICNza2VsZXRvbkxvYWRlcj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyIHJvdW5kZWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuPC9zZWN0aW9uPiJdfQ==
568
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby92ZXJpZmljYXRpb24tZmVlZGJhY2svdmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby92ZXJpZmljYXRpb24tZmVlZGJhY2svdmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFFcEcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7QUFNOUUsTUFBTSxPQUFPLDZCQUE2QjtJQXNEOUI7SUFDQTtJQXBERCxTQUFTLENBQU07SUFDZixhQUFhLEdBQVUsRUFBRSxDQUFDO0lBQzFCLGVBQWUsQ0FBTTtJQUVyQixHQUFHLENBQVM7SUFDWixVQUFVLEdBQVksSUFBSSxDQUFDO0lBQ3BDLHlDQUF5QztJQUUvQixhQUFhLEdBQUcsSUFBSSxZQUFZLEVBR3RDLENBQUM7SUFFSyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUUzQyxvQkFBb0IsQ0FHbEI7SUFFRixhQUFhLEdBQVksSUFBSSxDQUFDO0lBRTlCLG1CQUFtQixDQUFT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O1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7d0dBdnBCVSw2QkFBNkI7NEZBQTdCLDZCQUE2QixtU0NwQjFDLDh5b0NBbWVVOzs0RkQvY0csNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLDJCQUEyQjs4R0FPNUIsU0FBUztzQkFBakIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsR0FBRztzQkFBWCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFLRyxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgQWN0aW9uQ29uZmlybVBvcHVwQ29tcG9uZW50IH0gZnJvbSBcIi4vYWN0aW9uLWNvbmZpcm0tcG9wdXAvYWN0aW9uLWNvbmZpcm0tcG9wdXAuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XHJcbmltcG9ydCB7IGdldEZpeHR1cmVQcm9kdWN0Q2FwYWNpdHkgfSBmcm9tIFwiLi4vLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi12ZXJpZmljYXRpb24tZmVlZGJhY2tcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3ZlcmlmaWNhdGlvbi1mZWVkYmFjay5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vdmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC5zY3NzXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWZXJpZmljYXRpb25GZWVkYmFja0NvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveVxyXG57XHJcbiAgQElucHV0KCkgZmxvb3JEYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgdG90YWxGaXh0dXJlczogYW55W10gPSBbXTtcclxuICBASW5wdXQoKSBmZWVkYmFja0RldGFpbHM6IGFueTtcclxuXHJcbiAgQElucHV0KCkgY2RuOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgLy8gQElucHV0KCkgdm1MaXN0OiBWbUxpYnJhcnlMaXN0W10gPSBbXTtcclxuXHJcbiAgQE91dHB1dCgpIGNoYW5nZUZpeHR1cmUgPSBuZXcgRXZlbnRFbWl0dGVyPHtcclxuICAgIGN1cnJlbnRGaXh0dXJlOiBzdHJpbmc7XHJcbiAgICBhY3Rpb246IFwibmV4dFwiIHwgXCJwcmV2aW91c1wiO1xyXG4gIH0+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgc2VsZWN0ZWRGZWVkYmFja0RhdGE6IHtcclxuICAgIGN1cnJlbnRGaXh0dXJlOiBhbnk7XHJcbiAgICBhaUZlZWRiYWNrRml4dHVyZTogYW55O1xyXG4gIH07XHJcblxyXG4gIGlzUGFnZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBjdXJyZW50Rml4dHVyZUluZGV4OiBudW1iZXI7XHJcblxyXG4gIHBsYW5vRml4dHVyZTogYW55O1xyXG4gIGFpRml4dHVyZTogYW55O1xyXG5cclxuICAvLyBMaXZlIGZpeHR1cmUgY2FwYWNpdHkgPSBzdW0gb2YgaW5kaXZpZHVhbCBzaGVsZiBjYXBhY2l0aWVzIChzZWUgcGxhbm8uZnVuY3Rpb24pLFxyXG4gIC8vIGtlcHQgY29uc2lzdGVudCB3aXRoIHRoZSBwbGFub2dyYW0gY2FudmFzIGluc3RlYWQgb2YgdGhlIHN0b3JlZCBmaXh0dXJlQ2FwYWNpdHkuXHJcbiAgZ2V0IHBsYW5vRml4dHVyZUNhcGFjaXR5KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZ2V0Rml4dHVyZVByb2R1Y3RDYXBhY2l0eSh0aGlzLnBsYW5vRml4dHVyZT8uc2hlbGZDb25maWcpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRJbWFnZUZvclByZXZpZXc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIGltYWdlUHJldmlld1pvb206IG51bWJlciA9IDE7XHJcbiAgaW1hZ2VQcmV2aWV3UGFuWDogbnVtYmVyID0gMDtcclxuICBpbWFnZVByZXZpZXdQYW5ZOiBudW1iZXIgPSAwO1xyXG4gIGlzUGFubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcGFuTGFzdFg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBwYW5MYXN0WTogbnVtYmVyID0gMDtcclxuXHJcbiAgaXNBSVF1aWNrRWRpdCA9IGZhbHNlO1xyXG4gIGlzSW1hZ2VMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBwcmV2aW91c0ltYWdlVXJsOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG4gIGltZ0NETjogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5nYk1vZGFsOiBOZ2JNb2RhbCxcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncy5lbnZpcm9ubWVudFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGVudikgPT4gKHRoaXMuaW1nQ0ROID0gZW52LnBsYW5vZ3JhbUNETikpO1xyXG5cclxuICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhd2FpdCB0aGlzLmdldFZtc0xpc3QoKTtcclxuICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1tcImZlZWRiYWNrRGV0YWlsc1wiXT8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMub25DYW5jZWxBSVF1aWNrRWRpdCgpO1xyXG4gICAgICB0aGlzLmN1cnJlbnRGaXh0dXJlSW5kZXggPVxyXG4gICAgICAgIHRoaXMudG90YWxGaXh0dXJlcy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAoZjogYW55KSA9PlxyXG4gICAgICAgICAgICBmLl9pZCA9PT0gdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUlkLFxyXG4gICAgICAgICkgKyAxO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucGxhbm9GaXh0dXJlID0gc3RydWN0dXJlZENsb25lKFxyXG4gICAgICAgICAgdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uRml4dHVyZURhdGEsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmFpRml4dHVyZSA9IHRoaXMucHJvY2Vzc0FJRml4dHVyZURhdGEoKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLm1vdmVTdHJldGNoVk1zRnJvbVBsYW5vVG9BSSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmFpRml4dHVyZT8uZml4dHVyZVR5cGUgPT09ICd3YWxsJykge1xyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzU3BlY2lhbFZNU2hlbHZlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLnVwZGF0ZVZNbGlzdFdpdGhBaURhdGEoKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXRoaXMuaXNBcHByb3ZlZCkge1xyXG4gICAgICAgICAgdGhpcy5jb21wYXJlRml4dHVyZSh0aGlzLmFpRml4dHVyZSwgdGhpcy5wbGFub0ZpeHR1cmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbmV3SW1hZ2VVcmwgPVxyXG4gICAgICAgIHRoaXMuY2RuICYmIHRoaXMuYWlGaXh0dXJlPy5maXh0dXJlSW1hZ2VcclxuICAgICAgICA/IHRoaXMuY2RuICsgdGhpcy5haUZpeHR1cmUuZml4dHVyZUltYWdlXHJcbiAgICAgICAgOiBcIlwiO1xyXG5cclxuICAgICAgICBcclxuICAgICAgICBpZiAobmV3SW1hZ2VVcmwgJiYgbmV3SW1hZ2VVcmwgIT09IHRoaXMucHJldmlvdXNJbWFnZVVybCkge1xyXG4gICAgICAgICAgdGhpcy5wcmV2aW91c0ltYWdlVXJsID0gbmV3SW1hZ2VVcmw7XHJcbiAgICAgICAgICB0aGlzLmlzSW1hZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFuZXdJbWFnZVVybCkge1xyXG4gICAgICAgICAgdGhpcy5pc0ltYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5wcmV2aW91c0ltYWdlVXJsID0gXCJcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5pc0ltYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZml4dHVyZUlkOlwiLCB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5maXh0dXJlSWQpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBpbWFnZVBhdGg6XCIsIHRoaXMuY2RuICsgdGhpcy5haUZpeHR1cmU/LmZpeHR1cmVJbWFnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzQUlGaXh0dXJlRGF0YSgpIHtcclxuICAgIGxldCBhaURhdGEgPSBzdHJ1Y3R1cmVkQ2xvbmUoe1xyXG4gICAgICAuLi50aGlzLnBsYW5vRml4dHVyZSxcclxuICAgICAgLi4udGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUFJRGF0YSxcclxuICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgLi4udGhpcy5wbGFub0ZpeHR1cmU/LmhlYWRlcixcclxuICAgICAgICAuLi50aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5maXh0dXJlQUlEYXRhPy5oZWFkZXIsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICAgIGxldCBwcm9kdWN0Q291bnQgPSAwO1xyXG4gICAgYWlEYXRhPy5zaGVsZkNvbmZpZz8uZm9yRWFjaCgoczogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIC8vIGlmIChcclxuICAgICAgLy8gICBzLnNoZWxmVHlwZSA9PSBcInRyYXlcIiAmJlxyXG4gICAgICAvLyAgICFzPy5vcmlnaW5hbFByb2R1Y3RDb3VudCAmJlxyXG4gICAgICAvLyAgICFhaURhdGE/LnVwZGF0ZWRCeVxyXG4gICAgICAvLyApIHtcclxuICAgICAgLy8gICBzLm9yaWdpbmFsUHJvZHVjdENvdW50ID0gcy5wcm9kdWN0UGVyU2hlbGY7XHJcbiAgICAgIC8vICAgcy5wcm9kdWN0UGVyU2hlbGYgPSBNYXRoLmZsb29yKHMucHJvZHVjdFBlclNoZWxmIC8gcy50cmF5Um93cyk7XHJcbiAgICAgIC8vICAgLy8gcy50cmF5Um93cyA9IHMudHJheVJvd3MgPT0gMCA/IDEgOiBzLnRyYXlSb3dzO1xyXG4gICAgICAvLyAgIC8vIHMucHJvZHVjdFBlclNoZWxmIDw9IDIxID8gMyA6IDc7XHJcblxyXG4gICAgICAvLyAgIC8vIHMub3JpZ2luYWxQcm9kdWN0Q291bnQgPSBzLnByb2R1Y3RQZXJTaGVsZjtcclxuICAgICAgLy8gICAvLyBzLnByb2R1Y3RQZXJTaGVsZiA9IE1hdGguZmxvb3IoXHJcbiAgICAgIC8vICAgLy8gICBzLnByb2R1Y3RQZXJTaGVsZiAvIChzLnByb2R1Y3RQZXJTaGVsZiA8PSAyMSA/IDMgOiA3KVxyXG4gICAgICAvLyAgIC8vICk7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGlmIChzLnNoZWxmVHlwZSA9PSBcInNoZWxmXCIpIHtcclxuICAgICAgICBwcm9kdWN0Q291bnQgKz0gcy5wcm9kdWN0UGVyU2hlbGY7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJvZHVjdENvdW50ICs9IHMucHJvZHVjdFBlclNoZWxmICogcy50cmF5Um93cztcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHNoZWxmWm9uZSA9IHRoaXMucGxhbm9GaXh0dXJlPy5zaGVsZkNvbmZpZy5maW5kKFxyXG4gICAgICAgIChzaGVsdmU6IGFueSkgPT4gcy5zaGVsZk51bWJlciA9PSBzaGVsdmUuc2hlbGZOdW1iZXIsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoc2hlbGZab25lKSB7XHJcbiAgICAgICAgYWlEYXRhLnNoZWxmQ29uZmlnW2luZGV4XSA9IHsgLi4uc2hlbGZab25lLCAuLi5zIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcy56b25lID0gXCJCb3R0b21cIjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBhaURhdGEuZml4dHVyZUNhcGFjaXR5ID0gcHJvZHVjdENvdW50O1xyXG4gICAgcmV0dXJuIGFpRGF0YTtcclxuICB9XHJcblxyXG4gIG1vdmVTdHJldGNoVk1zRnJvbVBsYW5vVG9BSSgpIHtcclxuICAgIGlmICghdGhpcy5haUZpeHR1cmUgfHwgIXRoaXMucGxhbm9GaXh0dXJlKSByZXR1cm47XHJcblxyXG4gICAgaWYgKCF0aGlzLmFpRml4dHVyZS52bUNvbmZpZykge1xyXG4gICAgICB0aGlzLmFpRml4dHVyZS52bUNvbmZpZyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFpU2hlbHZlcyA9IHRoaXMuYWlGaXh0dXJlPy5zaGVsZkNvbmZpZyB8fCBbXTtcclxuICAgIGNvbnN0IHBsYW5vU2hlbHZlcyA9IHRoaXMucGxhbm9GaXh0dXJlPy5zaGVsZkNvbmZpZyB8fCBbXTtcclxuXHJcbiAgICBpZiAoYWlTaGVsdmVzLmxlbmd0aCA9PT0gMCB8fCBwbGFub1NoZWx2ZXMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgYWlGaXJzdFNoZWxmID0gYWlTaGVsdmVzWzBdO1xyXG4gICAgY29uc3QgYWlMYXN0U2hlbGYgPSBhaVNoZWx2ZXNbYWlTaGVsdmVzLmxlbmd0aCAtIDFdO1xyXG4gICAgY29uc3QgcGxhbm9GaXJzdFNoZWxmID0gcGxhbm9TaGVsdmVzWzBdO1xyXG4gICAgY29uc3QgcGxhbm9MYXN0U2hlbGYgPSBwbGFub1NoZWx2ZXNbcGxhbm9TaGVsdmVzLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgIGlmICghYWlGaXJzdFNoZWxmPy5zaGVsZk51bWJlciB8fCAhYWlMYXN0U2hlbGY/LnNoZWxmTnVtYmVyKSByZXR1cm47XHJcbiAgICBpZiAoIXBsYW5vRmlyc3RTaGVsZj8uc2hlbGZOdW1iZXIgfHwgIXBsYW5vTGFzdFNoZWxmPy5zaGVsZk51bWJlcikgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGFpRmlyc3RTaGVsZk51bWJlciA9IGFpRmlyc3RTaGVsZi5zaGVsZk51bWJlcjtcclxuICAgIGNvbnN0IGFpTGFzdFNoZWxmTnVtYmVyID0gYWlMYXN0U2hlbGYuc2hlbGZOdW1iZXI7XHJcbiAgICBjb25zdCBwbGFub0ZpcnN0U2hlbGZOdW1iZXIgPSBwbGFub0ZpcnN0U2hlbGYuc2hlbGZOdW1iZXI7XHJcbiAgICBjb25zdCBwbGFub0xhc3RTaGVsZk51bWJlciA9IHBsYW5vTGFzdFNoZWxmLnNoZWxmTnVtYmVyO1xyXG5cclxuICAgIGNvbnN0IG1hdGNoZXNTdHJldGNoQ3JpdGVyaWEgPSAodm06IGFueSwgc2hlbGZOdW1iZXI6IG51bWJlcikgPT4ge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHZtPy54Wm9uZSA9PT0gXCJzdHJldGNoXCIgJiZcclxuICAgICAgICB2bT8ueVpvbmUgPT09IFwic3RyZXRjaFwiICYmXHJcbiAgICAgICAgdm0/LnN0YXJ0WVBvc2l0aW9uID09PSBzaGVsZk51bWJlciAmJlxyXG4gICAgICAgIHZtPy5lbmRZUG9zaXRpb24gPT09IHNoZWxmTnVtYmVyXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGhhc0ZpcnN0U2hlbGZWTSA9IHRoaXMuYWlGaXh0dXJlLnZtQ29uZmlnLnNvbWUoKHZtOiBhbnkpID0+XHJcbiAgICAgIG1hdGNoZXNTdHJldGNoQ3JpdGVyaWEodm0sIGFpRmlyc3RTaGVsZk51bWJlciksXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghaGFzRmlyc3RTaGVsZlZNKSB7XHJcbiAgICAgIGNvbnN0IHBsYW5vVk0gPSB0aGlzLnBsYW5vRml4dHVyZT8udm1Db25maWc/LmZpbmQoKHZtOiBhbnkpID0+XHJcbiAgICAgICAgbWF0Y2hlc1N0cmV0Y2hDcml0ZXJpYSh2bSwgcGxhbm9GaXJzdFNoZWxmTnVtYmVyKSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChwbGFub1ZNKSB7XHJcbiAgICAgICAgY29uc3QgY2xvbmVkVk0gPSBzdHJ1Y3R1cmVkQ2xvbmUocGxhbm9WTSk7XHJcbiAgICAgICAgY2xvbmVkVk0uc3RhcnRZUG9zaXRpb24gPSBhaUZpcnN0U2hlbGZOdW1iZXI7XHJcbiAgICAgICAgY2xvbmVkVk0uZW5kWVBvc2l0aW9uID0gYWlGaXJzdFNoZWxmTnVtYmVyO1xyXG4gICAgICAgIHRoaXMuYWlGaXh0dXJlLnZtQ29uZmlnLnB1c2goY2xvbmVkVk0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaGFzTGFzdFNoZWxmVk0gPSB0aGlzLmFpRml4dHVyZS52bUNvbmZpZy5zb21lKCh2bTogYW55KSA9PlxyXG4gICAgICBtYXRjaGVzU3RyZXRjaENyaXRlcmlhKHZtLCBhaUxhc3RTaGVsZk51bWJlciksXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghaGFzTGFzdFNoZWxmVk0pIHtcclxuICAgICAgY29uc3QgcGxhbm9WTSA9IHRoaXMucGxhbm9GaXh0dXJlPy52bUNvbmZpZz8uZmluZCgodm06IGFueSkgPT5cclxuICAgICAgICBtYXRjaGVzU3RyZXRjaENyaXRlcmlhKHZtLCBwbGFub0xhc3RTaGVsZk51bWJlciksXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAocGxhbm9WTSkge1xyXG4gICAgICAgIGNvbnN0IGNsb25lZFZNID0gc3RydWN0dXJlZENsb25lKHBsYW5vVk0pO1xyXG4gICAgICAgIGNsb25lZFZNLnN0YXJ0WVBvc2l0aW9uID0gYWlMYXN0U2hlbGZOdW1iZXI7XHJcbiAgICAgICAgY2xvbmVkVk0uZW5kWVBvc2l0aW9uID0gYWlMYXN0U2hlbGZOdW1iZXI7XHJcbiAgICAgICAgdGhpcy5haUZpeHR1cmUudm1Db25maWcucHVzaChjbG9uZWRWTSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb2Nlc3NTcGVjaWFsVk1TaGVsdmVzKCkge1xyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5haUZpeHR1cmU/LnZtQ29uZmlnPy5sZW5ndGggfHxcclxuICAgICAgIXRoaXMuYWlGaXh0dXJlPy5zaGVsZkNvbmZpZz8ubGVuZ3RoXHJcbiAgICApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzaGVsdmVzID0gdGhpcy5haUZpeHR1cmUuc2hlbGZDb25maWc7XHJcbiAgICBjb25zdCB2bXMgPSB0aGlzLmFpRml4dHVyZS52bUNvbmZpZztcclxuXHJcbiAgICBjb25zdCBpc1N0cmV0Y2hWTSA9ICh2bTogYW55LCBzaGVsZk51bWJlcjogbnVtYmVyKSA9PlxyXG4gICAgICB2bS54Wm9uZSA9PT0gXCJzdHJldGNoXCIgJiZcclxuICAgICAgdm0ueVpvbmUgPT09IFwic3RyZXRjaFwiICYmXHJcbiAgICAgIHZtLnN0YXJ0WVBvc2l0aW9uID09PSBzaGVsZk51bWJlciAmJlxyXG4gICAgICB2bS5lbmRZUG9zaXRpb24gPT09IHNoZWxmTnVtYmVyO1xyXG5cclxuICAgIC8vIC0tLSBIYW5kbGUgbGVnYWN5IHdvcmthcm91bmQ6IHNoZWxmIHdpdGggdHlwZSBcInNoZWxmXCIgYW5kIDAgY2FwYWNpdHkgdXNlZCBhcyB2bW9ubHkgLS0tXHJcbiAgICBjb25zdCBmaXJzdFNoZWxmUmF3ID0gc2hlbHZlc1swXTtcclxuICAgIGlmIChcclxuICAgICAgZmlyc3RTaGVsZlJhdy5zaGVsZlR5cGUgPT09ICdzaGVsZicgJiZcclxuICAgICAgZmlyc3RTaGVsZlJhdy5wcm9kdWN0UGVyU2hlbGYgPT09IDAgJiZcclxuICAgICAgdm1zLnNvbWUoKHZtOiBhbnkpID0+IGlzU3RyZXRjaFZNKHZtLCBmaXJzdFNoZWxmUmF3LnNoZWxmTnVtYmVyKSlcclxuICAgICkge1xyXG4gICAgICBmaXJzdFNoZWxmUmF3LnNoZWxmVHlwZSA9ICd2bW9ubHknO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGxhc3RTaGVsZlJhdyA9IHNoZWx2ZXNbc2hlbHZlcy5sZW5ndGggLSAxXTtcclxuICAgIGlmIChcclxuICAgICAgbGFzdFNoZWxmUmF3LnNoZWxmVHlwZSA9PT0gJ3NoZWxmJyAmJlxyXG4gICAgICBsYXN0U2hlbGZSYXcucHJvZHVjdFBlclNoZWxmID09PSAwICYmXHJcbiAgICAgIHZtcy5zb21lKCh2bTogYW55KSA9PiBpc1N0cmV0Y2hWTSh2bSwgbGFzdFNoZWxmUmF3LnNoZWxmTnVtYmVyKSlcclxuICAgICkge1xyXG4gICAgICBsYXN0U2hlbGZSYXcuc2hlbGZUeXBlID0gJ3Ztb25seSc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIFRvcCBNYXNraW5nOiBlbnN1cmUgZmlyc3Qgc2hlbGYgaXMgdm1vbmx5IC0tLVxyXG4gICAgY29uc3QgZmlyc3RTaGVsZiA9IHNoZWx2ZXNbMF07XHJcbiAgICBjb25zdCB0b3BNYXNraW5nVk0gPSB2bXMuZmluZCgodm06IGFueSkgPT5cclxuICAgICAgaXNTdHJldGNoVk0odm0sIGZpcnN0U2hlbGYuc2hlbGZOdW1iZXIpLFxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgZGlkVG9wTWFza2luZ0luY3JlbWVudCA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0b3BNYXNraW5nVk0gJiYgZmlyc3RTaGVsZi5zaGVsZlR5cGUgIT09IFwidm1vbmx5XCIpIHtcclxuICAgICAgLy8gSW5zZXJ0IHZtb25seSBzaGVsZiBhdCBwb3NpdGlvbiAwIHdpdGggc2hlbGZOdW1iZXIgMVxyXG4gICAgICBzaGVsdmVzLnVuc2hpZnQoe1xyXG4gICAgICAgIHNoZWxmTnVtYmVyOiAxLFxyXG4gICAgICAgIHNoZWxmVHlwZTogXCJ2bW9ubHlcIixcclxuICAgICAgICBwcm9kdWN0UGVyU2hlbGY6IDAsXHJcbiAgICAgICAgdHJheVJvd3M6IDAsXHJcbiAgICAgICAgem9uZTogXCJUb3BcIixcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBJbmNyZW1lbnQgYWxsIG90aGVyIHNoZWxmIG51bWJlcnMgYnkgMVxyXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNoZWx2ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBzaGVsdmVzW2ldLnNoZWxmTnVtYmVyID0gc2hlbHZlc1tpXS5zaGVsZk51bWJlciArIDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRpZFRvcE1hc2tpbmdJbmNyZW1lbnQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIC0tLSBCb3R0b20gU2xhbmRlcjogZW5zdXJlIGxhc3Qgc2hlbGYgaXMgdm1vbmx5IC0tLVxyXG4gICAgY29uc3QgbGFzdFNoZWxmID0gc2hlbHZlc1tzaGVsdmVzLmxlbmd0aCAtIDFdO1xyXG4gICAgLy8gVk0gcG9zaXRpb25zIGFyZSBzdGlsbCB1c2luZyBvcmlnaW5hbCBudW1iZXJzLCBzbyBjaGVjayBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBzaGVsZiBudW1iZXJcclxuICAgIGNvbnN0IGJvdHRvbVNsYW5kZXJTaGVsZk51bWJlciA9IGRpZFRvcE1hc2tpbmdJbmNyZW1lbnRcclxuICAgICAgPyBsYXN0U2hlbGYuc2hlbGZOdW1iZXIgLSAxXHJcbiAgICAgIDogbGFzdFNoZWxmLnNoZWxmTnVtYmVyO1xyXG4gICAgY29uc3QgYm90dG9tU2xhbmRlclZNID0gdm1zLmZpbmQoKHZtOiBhbnkpID0+XHJcbiAgICAgIGlzU3RyZXRjaFZNKHZtLCBib3R0b21TbGFuZGVyU2hlbGZOdW1iZXIpLFxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgZGlkQm90dG9tU2xhbmRlckFkZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChib3R0b21TbGFuZGVyVk0gJiYgbGFzdFNoZWxmLnNoZWxmVHlwZSAhPT0gXCJ2bW9ubHlcIikge1xyXG4gICAgICBjb25zdCBuZXdTaGVsZk51bWJlciA9IGxhc3RTaGVsZi5zaGVsZk51bWJlciArIDE7XHJcbiAgICAgIHNoZWx2ZXMucHVzaCh7XHJcbiAgICAgICAgc2hlbGZOdW1iZXI6IG5ld1NoZWxmTnVtYmVyLFxyXG4gICAgICAgIHNoZWxmVHlwZTogXCJ2bW9ubHlcIixcclxuICAgICAgICBwcm9kdWN0UGVyU2hlbGY6IDAsXHJcbiAgICAgICAgdHJheVJvd3M6IDAsXHJcbiAgICAgICAgem9uZTogXCJCb3R0b21cIixcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBkaWRCb3R0b21TbGFuZGVyQWRkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0gVXBkYXRlIFZNIHBvc2l0aW9ucyBiYXNlZCBvbiB3aGF0IHdhcyBhZGRlZCAtLS1cclxuICAgIGNvbnN0IHRvcE9mZnNldCA9IGRpZFRvcE1hc2tpbmdJbmNyZW1lbnQgPyAxIDogMDtcclxuICAgIGNvbnN0IGJvdHRvbU9mZnNldCA9IGRpZEJvdHRvbVNsYW5kZXJBZGQgPyAxIDogMDtcclxuXHJcbiAgICBpZiAodG9wT2Zmc2V0IHx8IGJvdHRvbU9mZnNldCkge1xyXG4gICAgICB2bXMuZm9yRWFjaCgodm06IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh2bSA9PT0gdG9wTWFza2luZ1ZNIHx8IHZtID09PSBib3R0b21TbGFuZGVyVk0pIHJldHVybjtcclxuICAgICAgICB2bS5zdGFydFlQb3NpdGlvbiA9IHZtLnN0YXJ0WVBvc2l0aW9uICsgdG9wT2Zmc2V0O1xyXG4gICAgICAgIHZtLmVuZFlQb3NpdGlvbiA9IHZtLmVuZFlQb3NpdGlvbiArIHRvcE9mZnNldDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoYm90dG9tU2xhbmRlclZNICYmIGRpZEJvdHRvbVNsYW5kZXJBZGQpIHtcclxuICAgICAgICAvLyArdG9wT2Zmc2V0IGZvciB0aGUgdG9wIHZtb25seSArICtib3R0b21PZmZzZXQgZm9yIHRoZSBib3R0b20gdm1vbmx5XHJcbiAgICAgICAgYm90dG9tU2xhbmRlclZNLnN0YXJ0WVBvc2l0aW9uID1cclxuICAgICAgICAgIGJvdHRvbVNsYW5kZXJWTS5zdGFydFlQb3NpdGlvbiArIHRvcE9mZnNldCArIGJvdHRvbU9mZnNldDtcclxuICAgICAgICBib3R0b21TbGFuZGVyVk0uZW5kWVBvc2l0aW9uID1cclxuICAgICAgICAgIGJvdHRvbVNsYW5kZXJWTS5lbmRZUG9zaXRpb24gKyB0b3BPZmZzZXQgKyBib3R0b21PZmZzZXQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbXBhcmVGaXh0dXJlKGFpRml4dHVyZTogYW55LCBjdXJyZW50Rml4dHVyZTogYW55KSB7XHJcbiAgICBpZiAoIWFpRml4dHVyZSB8fCAhY3VycmVudEZpeHR1cmUpIHJldHVybjtcclxuICAgIC8qID09PT09PT09PT09PT09PT09IEhFQURFUiA9PT09PT09PT09PT09PT09PSAqL1xyXG4gICAgY29uc3QgYWlIZWFkZXIgPSAoYWlGaXh0dXJlLmhlYWRlcj8ubGFiZWwgPz8gXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBjdXJIZWFkZXIgPSAoY3VycmVudEZpeHR1cmUuaGVhZGVyPy5sYWJlbCA/PyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBhaUZpeHR1cmUuaGVhZGVyLmlzRGlmZmVyZW50ID0gYWlIZWFkZXIgIT09IGN1ckhlYWRlcjtcclxuXHJcbiAgICAvKiA9PT09PT09PT09PT09PT09PSBTSEVMVkVTID09PT09PT09PT09PT09PT09ICovXHJcbiAgICBjb25zdCBjdXJyZW50U2hlbGZNYXAgPSBuZXcgTWFwPG51bWJlciwgYW55PihcclxuICAgICAgKGN1cnJlbnRGaXh0dXJlLnNoZWxmQ29uZmlnID8/IFtdKS5tYXAoKHM6IGFueSkgPT4gW3Muc2hlbGZOdW1iZXIsIHNdKSxcclxuICAgICk7XHJcblxyXG4gICAgKGFpRml4dHVyZS5zaGVsZkNvbmZpZyA/PyBbXSkuZm9yRWFjaCgoYWlTaGVsZjogYW55KSA9PiB7XHJcbiAgICAgIGFpU2hlbGYuaXNEaWZmZXJlbnQgPSBmYWxzZTtcclxuXHJcbiAgICAgIGNvbnN0IGN1clNoZWxmID0gY3VycmVudFNoZWxmTWFwLmdldChhaVNoZWxmLnNoZWxmTnVtYmVyKTtcclxuICAgICAgaWYgKCFjdXJTaGVsZikge1xyXG4gICAgICAgIGFpU2hlbGYuaXNEaWZmZXJlbnQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIGFpU2hlbGYuc2hlbGZUeXBlICE9PSBjdXJTaGVsZi5zaGVsZlR5cGUgfHxcclxuICAgICAgICBhaVNoZWxmLnByb2R1Y3RQZXJTaGVsZiAhPT0gY3VyU2hlbGYucHJvZHVjdFBlclNoZWxmIHx8XHJcbiAgICAgICAgYWlTaGVsZi50cmF5Um93cyAhPT0gY3VyU2hlbGYudHJheVJvd3NcclxuICAgICAgKSB7XHJcbiAgICAgICAgYWlTaGVsZi5pc0RpZmZlcmVudCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8qID09PT09PT09PT09PT09PT09IFZNcyA9PT09PT09PT09PT09PT09PSAqL1xyXG4gICAgY29uc3Qgdm1LZXkgPSAodjogYW55KSA9PlxyXG4gICAgICBgJHt2LnZtVHlwZX18JHt2LnZtTmFtZX18JHt2LnN0YXJ0WVBvc2l0aW9ufXwke3YuZW5kWVBvc2l0aW9ufWBcclxuICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgIC50cmltKCk7XHJcblxyXG4gICAgY29uc3QgY3VycmVudFZNU2V0ID0gbmV3IFNldCgoY3VycmVudEZpeHR1cmUudm1Db25maWcgPz8gW10pLm1hcCh2bUtleSkpO1xyXG5cclxuICAgIChhaUZpeHR1cmUudm1Db25maWcgPz8gW10pLmZvckVhY2goKGFpVk06IGFueSkgPT4ge1xyXG4gICAgICBhaVZNLmlzRGlmZmVyZW50ID0gIWN1cnJlbnRWTVNldC5oYXModm1LZXkoYWlWTSkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyB1cGRhdGVWTWxpc3RXaXRoQWlEYXRhKCkge1xyXG4gIC8vICAgdGhpcy5haUZpeHR1cmU/LnZtQ29uZmlnPy5mb3JFYWNoKChhaVZtOiBhbnkpID0+IHtcclxuICAvLyAgICAgLy8gY29uc29sZS5sb2coXCJAQCB+IGFpVm06XCIsIGFpVm0pO1xyXG5cclxuICAvLyAgICAgY29uc3Qgdm1Jbkxpc3QgPSB0aGlzLnZtTGlzdC5maW5kKFxyXG4gIC8vICAgICAgICh2bSkgPT4gdm0ubmFtZSA9PT0gYWlWbT8udm1OYW1lICYmIHZtLnR5cGUgPT09IGFpVm0/LnZtVHlwZVxyXG4gIC8vICAgICApO1xyXG5cclxuICAvLyAgICAgaWYgKHZtSW5MaXN0KSB7XHJcbiAgLy8gICAgICAgLy8gdm1Jbkxpc3QuaWQgPSBhaVZtLnZtTmFtZTtcclxuICAvLyAgICAgICBpZiAoYWlWbT8udm1JbWFnZSkge1xyXG4gIC8vICAgICAgICAgdm1Jbkxpc3QuaW1nVXJsID0gYCR7dGhpcy5pbWdDRE59JHthaVZtLnZtSW1hZ2V9YDtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgdGhpcy52bUxpc3QucHVzaCh7XHJcbiAgLy8gICAgICAgICBpZDogYWlWbS52bU5hbWUsXHJcbiAgLy8gICAgICAgICBuYW1lOiBhaVZtLnZtTmFtZSxcclxuICAvLyAgICAgICAgIGRpc3BsYXlOYW1lOiBhaVZtLnZtTmFtZSArIChhaVZtPy52bVR5cGUgPyBgKCR7YWlWbS52bVR5cGV9KWAgOiBcIlwiKSxcclxuICAvLyAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgLy8gICAgICAgICBoZWlnaHQ6IDEwMCxcclxuICAvLyAgICAgICAgIHR5cGU6IGFpVm0udm1UeXBlLFxyXG4gIC8vICAgICAgICAgLi4uKGFpVm0udm1JbWFnZSA/IHsgaW1nVXJsOiBgJHt0aGlzLmltZ0NETn0ke2FpVm0udm1JbWFnZX1gIH0gOiB7fSksXHJcbiAgLy8gICAgICAgfSBhcyBhbnkpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIGdldCBpc0FwcHJvdmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFwcHJvdmFsU3RhdHVzID09PSBcImFwcHJvdmVkXCI7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZUZpeHR1cmUoY2hhbmdlOiBcIm5leHRcIiB8IFwicHJldmlvdXNcIikge1xyXG4gICAgdGhpcy5jaGFuZ2VGaXh0dXJlLmVtaXQoe1xyXG4gICAgICBjdXJyZW50Rml4dHVyZTogdGhpcy5mZWVkYmFja0RldGFpbHMuZml4dHVyZUZlZWRiYWNrLmZpeHR1cmVJZCxcclxuICAgICAgYWN0aW9uOiBjaGFuZ2UsXHJcbiAgICB9KTtcclxuICAgIHRoaXMub25DYW5jZWxBSVF1aWNrRWRpdCgpO1xyXG4gICAgLy8gdGhpcy5vbkNhbmNlbFBsYW5vUXVpY2tFZGl0KCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNsaWNrS2VlcFBsYW5vKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25maXJtQWN0aW9uKFwia2VlcFBsYW5vXCIpO1xyXG4gICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09IFwibm90T2tcIikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgdGhpcy5hY3Rpb24uZW1pdCh7XHJcbiAgICAgICAgYWN0aW9uOiBcImtlZXBQbGFub1wiLFxyXG4gICAgICAgIHR5cGU6IFwiYWdyZWVcIixcclxuICAgICAgICBmaXh0dXJlRGF0YTogdGhpcy5wbGFub0ZpeHR1cmUsXHJcbiAgICAgICAgZmVlZGJhY2s6IHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2ssXHJcbiAgICAgICAgcmVtYXJrczogcmVzdWx0Py5yZW1hcmssXHJcbiAgICAgICAgcGxhbm9JZDogdGhpcy5mbG9vckRhdGEucGxhbm9JZCxcclxuICAgICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgdGFza1R5cGU6IFwiZml4dHVyZVwiLFxyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBvbkNsaWNrS2VlcFBsYW5vIFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DbGlja0FjY2VwdEFJKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25maXJtQWN0aW9uKFwiYWNjZXB0QUlcIik7XHJcbiAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gXCJub3RPa1wiKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICB0aGlzLmFjdGlvbi5lbWl0KHtcclxuICAgICAgICBhY3Rpb246IFwiYWNjZXB0QWlcIixcclxuICAgICAgICB0eXBlOiBcImFncmVlXCIsXHJcbiAgICAgICAgZml4dHVyZURhdGE6IHRoaXMuYWlGaXh0dXJlLFxyXG4gICAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrLFxyXG4gICAgICAgIHJlbWFya3M6IHJlc3VsdD8ucmVtYXJrLFxyXG4gICAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gb25DbGlja0FjY2VwdEFJIFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DbGlja1JlZG8oKSB7XHJcbiAgICBpZiAodGhpcy5pc0FJUXVpY2tFZGl0KSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25maXJtQWN0aW9uKFwicmVkb1wiKTtcclxuICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSBcIm5vdE9rXCIpIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMuYWN0aW9uLmVtaXQoe1xyXG4gICAgICAgIGFjdGlvbjogXCJyZWRvXCIsXHJcbiAgICAgICAgdHlwZTogXCJkaXNhZ3JlZVwiLFxyXG4gICAgICAgIGZpeHR1cmVEYXRhOiBudWxsLFxyXG4gICAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrLFxyXG4gICAgICAgIHJlbWFyazogcmVzdWx0LFxyXG4gICAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gb25DbGlja1JlZG8gW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRWRpdEFJRmVlZGJhY2soZGF0YVRvRWRpdD86IGFueSkge1xyXG4gICAgdGhpcy5hY3Rpb24uZW1pdCh7XHJcbiAgICAgIGFjdGlvbjogXCJlZGl0V2l0aEFpXCIsXHJcbiAgICAgIHR5cGU6IFwiYWdyZWVcIixcclxuICAgICAgZml4dHVyZURhdGE6IGRhdGFUb0VkaXQ/LmZpeHR1cmVEYXRhID8/IHRoaXMuYWlGaXh0dXJlLFxyXG4gICAgICBmZWVkYmFjazogdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjayxcclxuICAgICAgcGxhbm9JZDogdGhpcy5mbG9vckRhdGEucGxhbm9JZCxcclxuICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICB0YXNrVHlwZTogXCJmaXh0dXJlXCIsXHJcbiAgICAgIHRhYjogZGF0YVRvRWRpdD8udGFiLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkVkaXRGZWVkYmFjaygpIHtcclxuICAgIHRoaXMuYWN0aW9uLmVtaXQoe1xyXG4gICAgICBhY3Rpb246IFwiZWRpdFdpdGhQbGFub1wiLFxyXG4gICAgICB0eXBlOiBcImFncmVlXCIsXHJcbiAgICAgIGZpeHR1cmVEYXRhOiB0aGlzLnBsYW5vRml4dHVyZSxcclxuICAgICAgZmVlZGJhY2s6IHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2ssXHJcbiAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgdGFza1R5cGU6IFwiZml4dHVyZVwiLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBSVF1aWNrRWRpdCgpIHtcclxuICAgIHRoaXMuaXNBSVF1aWNrRWRpdCA9ICF0aGlzLmlzQUlRdWlja0VkaXQ7XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbEFJUXVpY2tFZGl0KCkge1xyXG4gICAgdGhpcy5pc0FJUXVpY2tFZGl0ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvblNhdmVBSVF1aWNrRWRpdChuZXdBaURhdGE6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25maXJtQWN0aW9uKFwiYWNjZXB0QUlcIik7XHJcbiAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gXCJub3RPa1wiKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICB0aGlzLmFpRml4dHVyZSA9IHN0cnVjdHVyZWRDbG9uZShuZXdBaURhdGEpO1xyXG5cclxuICAgICAgdGhpcy5hY3Rpb24uZW1pdCh7XHJcbiAgICAgICAgYWN0aW9uOiBcImFjY2VwdEFpXCIsXHJcbiAgICAgICAgdHlwZTogXCJhZ3JlZVwiLFxyXG4gICAgICAgIGZpeHR1cmVEYXRhOiB0aGlzLmFpRml4dHVyZSxcclxuICAgICAgICBmZWVkYmFjazogdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjayxcclxuICAgICAgICByZW1hcmtzOiByZXN1bHQ/LnJlbWFyayxcclxuICAgICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICB0YXNrVHlwZTogXCJmaXh0dXJlXCIsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5pc0FJUXVpY2tFZGl0ID0gZmFsc2U7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gb25TYXZlQUlRdWlja0VkaXQgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1BY3Rpb24oXHJcbiAgICB0eXBlOiBcInJlZG9cIiB8IFwiYWNjZXB0QUlcIiB8IFwia2VlcFBsYW5vXCIsXHJcbiAgKTogUHJvbWlzZTx7IGFjdGlvbjogc3RyaW5nOyByZW1hcms6IHN0cmluZyB8IG51bGwgfSB8IG51bGw+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKEFjdGlvbkNvbmZpcm1Qb3B1cENvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICAgIHNpemU6IFwibWRcIixcclxuICAgICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgfSk7XHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnR5cGUgPSB0eXBlO1xyXG5cclxuICAgICAgcmV0dXJuIGF3YWl0IG1vZGVsUmVmLnJlc3VsdC50aGVuPHtcclxuICAgICAgICBhY3Rpb246IHN0cmluZztcclxuICAgICAgICByZW1hcms6IHN0cmluZyB8IG51bGw7XHJcbiAgICAgIH0+KChyZXN1bHQpID0+IHJlc3VsdCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2xpY2tJbWFnZVByZXZpZXcoZXZlbnQ6IE1vdXNlRXZlbnQsIGltZ1VybDogc3RyaW5nKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJbWFnZUZvclByZXZpZXcgPSBpbWdVcmw7XHJcbiAgICB0aGlzLmltYWdlUHJldmlld1pvb20gPSAxO1xyXG4gICAgdGhpcy5pbWFnZVByZXZpZXdQYW5YID0gMDtcclxuICAgIHRoaXMuaW1hZ2VQcmV2aWV3UGFuWSA9IDA7XHJcbiAgfVxyXG5cclxuICBjbG9zZUltYWdlUHJldmlldygpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJbWFnZUZvclByZXZpZXcgPSBudWxsO1xyXG4gICAgdGhpcy5pbWFnZVByZXZpZXdab29tID0gMTtcclxuICAgIHRoaXMuaW1hZ2VQcmV2aWV3UGFuWCA9IDA7XHJcbiAgICB0aGlzLmltYWdlUHJldmlld1BhblkgPSAwO1xyXG4gIH1cclxuXHJcbiAgb25QcmV2aWV3Wm9vbUluKCkge1xyXG4gICAgdGhpcy5pbWFnZVByZXZpZXdab29tID0gTWF0aC5taW4odGhpcy5pbWFnZVByZXZpZXdab29tICsgMC4yNSwgNSk7XHJcbiAgICBpZiAodGhpcy5pbWFnZVByZXZpZXdab29tIDw9IDEpIHRoaXMucmVzZXRQYW4oKTtcclxuICB9XHJcblxyXG4gIG9uUHJldmlld1pvb21PdXQoKSB7XHJcbiAgICB0aGlzLmltYWdlUHJldmlld1pvb20gPSBNYXRoLm1heCh0aGlzLmltYWdlUHJldmlld1pvb20gLSAwLjI1LCAwLjI1KTtcclxuICAgIGlmICh0aGlzLmltYWdlUHJldmlld1pvb20gPD0gMSkgdGhpcy5yZXNldFBhbigpO1xyXG4gIH1cclxuXHJcbiAgb25QcmV2aWV3Wm9vbVNsaWRlcihldmVudDogRXZlbnQpIHtcclxuICAgIGNvbnN0IHZhbHVlID0gKyhldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcbiAgICB0aGlzLmltYWdlUHJldmlld1pvb20gPSB2YWx1ZSAvIDEwMDtcclxuICAgIGlmICh0aGlzLmltYWdlUHJldmlld1pvb20gPD0gMSkgdGhpcy5yZXNldFBhbigpO1xyXG4gIH1cclxuXHJcbiAgb25QcmV2aWV3V2hlZWwoZXZlbnQ6IFdoZWVsRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBpZiAoZXZlbnQuZGVsdGFZIDwgMCkge1xyXG4gICAgICB0aGlzLm9uUHJldmlld1pvb21JbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vblByZXZpZXdab29tT3V0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblByZXZpZXdQYW5TdGFydChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuaW1hZ2VQcmV2aWV3Wm9vbSA8PSAxKSByZXR1cm47XHJcbiAgICB0aGlzLmlzUGFubmluZyA9IHRydWU7XHJcbiAgICB0aGlzLnBhbkxhc3RYID0gZXZlbnQuY2xpZW50WDtcclxuICAgIHRoaXMucGFuTGFzdFkgPSBldmVudC5jbGllbnRZO1xyXG4gIH1cclxuXHJcbiAgb25QcmV2aWV3UGFuTW92ZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmlzUGFubmluZykgcmV0dXJuO1xyXG4gICAgY29uc3QgZHggPSBldmVudC5jbGllbnRYIC0gdGhpcy5wYW5MYXN0WDtcclxuICAgIGNvbnN0IGR5ID0gZXZlbnQuY2xpZW50WSAtIHRoaXMucGFuTGFzdFk7XHJcbiAgICB0aGlzLnBhbkxhc3RYID0gZXZlbnQuY2xpZW50WDtcclxuICAgIHRoaXMucGFuTGFzdFkgPSBldmVudC5jbGllbnRZO1xyXG4gICAgdGhpcy5pbWFnZVByZXZpZXdQYW5YICs9IGR4O1xyXG4gICAgdGhpcy5pbWFnZVByZXZpZXdQYW5ZICs9IGR5O1xyXG4gIH1cclxuXHJcbiAgb25QcmV2aWV3UGFuRW5kKCkge1xyXG4gICAgdGhpcy5pc1Bhbm5pbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRQYW4oKSB7XHJcbiAgICB0aGlzLmltYWdlUHJldmlld1BhblggPSAwO1xyXG4gICAgdGhpcy5pbWFnZVByZXZpZXdQYW5ZID0gMDtcclxuICB9XHJcblxyXG4gIG9uSW1hZ2VMb2FkKCkge1xyXG4gICAgdGhpcy5pc0ltYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25JbWFnZUVycm9yKCkge1xyXG4gICAgdGhpcy5pc0ltYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25JbWFnZUxvYWRTdGFydCgpIHtcclxuICAgIHRoaXMuaXNJbWFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb25JbWFnZUxvYWRFbmQoKSB7XHJcbiAgICB0aGlzLmlzSW1hZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG5cclxuaW50ZXJmYWNlIEZpeHR1cmVRdWlja0RldGFpbCB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIGVkaXRhYmxlOiBib29sZWFuO1xyXG4gIGlzRGlmZmVyZW50PzogYm9vbGVhbjtcclxuXHJcbiAgbWV0YT86IHtcclxuICAgIHR5cGU6IFwiZml4dHVyZVwiIHwgXCJzaGVsZlwiIHwgXCJ0cmF5XCI7XHJcbiAgICBzaGVsZk51bWJlcj86IG51bWJlcjtcclxuICB9O1xyXG59XHJcbiIsIjxzZWN0aW9uIGlkPVwidmVyaWZpY2F0aW9uLWZlZWRiYWNrXCI+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cImZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy50YXNrRGF0YVwiIGlkPVwidGFzay1pbmZvXCIgbmdiQWNjb3JkaW9uICNhY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIj5cclxuICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJkZXRhaWxzXCIgW2NvbGxhcHNlZF09XCJmZWVkYmFja0RldGFpbHM/LnRhc2tJbmZvVG9nZ2xlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSGVhZGVyIG5nYkFjY29yZGlvblRvZ2dsZSBjbGFzcz1cImFjY29yZGlvbi1idXR0b24gdGFzay1pbmZvLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgyPkZpeHR1cmUgdmVyaWZpY2F0aW9uIGFzc2lnbmVkPC9oMj5cclxuICAgICAgICAgICAgICAgICAgICA8cD57e2ZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy50YXNrRGF0YT8uY3JlYXRlZEF0IHwgZGF0ZTogJ2hoOm1tOnNzIGEgLSBkZCBNTU0geXl5eSd9fTwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nLWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMTZcIiBmaWxsPVwiI0VBRjhGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMi42NjczIDIzLjVWMjEuODMzM0MyMi42NjczIDIwLjk0OTMgMjIuMzE2MSAyMC4xMDE0IDIxLjY5MSAxOS40NzYzQzIxLjA2NTkgMTguODUxMiAyMC4yMTggMTguNSAxOS4zMzQgMTguNUgxMi42NjczQzExLjc4MzMgMTguNSAxMC45MzU0IDE4Ljg1MTIgMTAuMzEwMyAxOS40NzYzQzkuNjg1MTcgMjAuMTAxNCA5LjMzMzk4IDIwLjk0OTMgOS4zMzM5OCAyMS44MzMzVjIzLjVNMTkuMzM0IDExLjgzMzNDMTkuMzM0IDEzLjY3NDMgMTcuODQxNiAxNS4xNjY3IDE2LjAwMDcgMTUuMTY2N0MxNC4xNTk3IDE1LjE2NjcgMTIuNjY3MyAxMy42NzQzIDEyLjY2NzMgMTEuODMzM0MxMi42NjczIDkuOTkyMzggMTQuMTU5NyA4LjUgMTYuMDAwNyA4LjVDMTcuODQxNiA4LjUgMTkuMzM0IDkuOTkyMzggMTkuMzM0IDExLjgzMzNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMSBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND57e2ZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy50YXNrRGF0YT8uY3JlYXRlZEJ5TmFtZX19PC9oND5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8udGFza0RhdGE/LmNyZWF0ZWRBdCB8IGRhdGU6ICdoaDptbWEsIGRkIE1NTSB5eXl5J319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT5Bc3NpZ25lcjwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nLWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFVzZXIgYXZhdGFyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgZmlsbD1cIiNFQUY4RkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjIuNjY3MyAyMy41VjIxLjgzMzNDMjIuNjY3MyAyMC45NDkzIDIyLjMxNjEgMjAuMTAxNCAyMS42OTEgMTkuNDc2M0MyMS4wNjU5IDE4Ljg1MTIgMjAuMjE4IDE4LjUgMTkuMzM0IDE4LjVIMTIuNjY3M0MxMS43ODMzIDE4LjUgMTAuOTM1NCAxOC44NTEyIDEwLjMxMDMgMTkuNDc2M0M5LjY4NTE3IDIwLjEwMTQgOS4zMzM5OCAyMC45NDkzIDkuMzMzOTggMjEuODMzM1YyMy41TTE5LjMzNCAxMS44MzMzQzE5LjMzNCAxMy42NzQzIDE3Ljg0MTYgMTUuMTY2NyAxNi4wMDA3IDE1LjE2NjdDMTQuMTU5NyAxNS4xNjY3IDEyLjY2NzMgMTMuNjc0MyAxMi42NjczIDExLjgzMzNDMTIuNjY3MyA5Ljk5MjM4IDE0LjE1OTcgOC41IDE2LjAwMDcgOC41QzE3Ljg0MTYgOC41IDE5LjMzNCA5Ljk5MjM4IDE5LjMzNCAxMS44MzMzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+IHt7ZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LnRhc2tEYXRhPy51c2VyTmFtZX19PC9oND5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8udGFza0RhdGE/LnN1Ym1pdFRpbWVfc3RyaW5nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PkFzc2lnbmVlPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGZlZWRiYWNrRGV0YWlscz8uZ2xvYmFsQ29tbWVudHM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMlwiPkNvbW1lbnRzPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctYmxvY2tcIiAqbmdGb3I9XCJsZXQgYyBvZiBmZWVkYmFja0RldGFpbHM/Lmdsb2JhbENvbW1lbnRzO2xldCBpPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgZmlsbD1cIiNFQUY4RkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMi42NjczIDIzLjVWMjEuODMzM0MyMi42NjczIDIwLjk0OTMgMjIuMzE2MSAyMC4xMDE0IDIxLjY5MSAxOS40NzYzQzIxLjA2NTkgMTguODUxMiAyMC4yMTggMTguNSAxOS4zMzQgMTguNUgxMi42NjczQzExLjc4MzMgMTguNSAxMC45MzU0IDE4Ljg1MTIgMTAuMzEwMyAxOS40NzYzQzkuNjg1MTcgMjAuMTAxNCA5LjMzMzk4IDIwLjk0OTMgOS4zMzM5OCAyMS44MzMzVjIzLjVNMTkuMzM0IDExLjgzMzNDMTkuMzM0IDEzLjY3NDMgMTcuODQxNiAxNS4xNjY3IDE2LjAwMDcgMTUuMTY2N0MxNC4xNTk3IDE1LjE2NjcgMTIuNjY3MyAxMy42NzQzIDEyLjY2NzMgMTEuODMzM0MxMi42NjczIDkuOTkyMzggMTQuMTU5NyA4LjUgMTYuMDAwNyA4LjVDMTcuODQxNiA4LjUgMTkuMzM0IDkuOTkyMzggMTkuMzM0IDExLjgzMzNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0Pnt7Yz8udXNlck5hbWV9fTwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPnt7Yz8uY3JlYXRlZEF0fGRhdGU6J2hoOm1tOnNzIGEgLSBkZCBNTU0geXl5eSd9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1Pnt7Yz8uY29tbWVudH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxociAqbmdJZj1cImZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy50YXNrRGF0YVwiPlxyXG5cclxuICAgIDxkaXYgaWQ9XCJmZWVkYmFjay1oYW5kbGVyXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC02IG15LTYgcHgtMyBmaXh0dXJlLW5hdmlnYXRlXCI+XHJcbiAgICAgICAgPHN2ZyAqbmdJZj1cInNob3dBY3Rpb25cIiAoY2xpY2spPVwib25DaGFuZ2VGaXh0dXJlKCdwcmV2aW91cycpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiXHJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xNSA2TDkgMTJMMTUgMThcIiBzdHJva2U9XCIjMUQyOTM5XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG5cclxuXHJcbiAgICAgICAgPGgzIGNsYXNzPVwibS0wXCI+e3twbGFub0ZpeHR1cmU/LmhlYWRlcj8ubGFiZWx9fTwvaDM+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxyXG5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjVcIiBoZWlnaHQ9XCI1XCIgdmlld0JveD1cIjAgMCA1IDVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyLjVcIiBjeT1cIjIuNVwiIHI9XCIyLjVcIiBmaWxsPVwiI0VBRUNGMFwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwbGFub0ZpeHR1cmU/LmZpeHR1cmVDYXRlZ29yeVwiIGNsYXNzPVwiYmFkZ2UgaW5hY3RpdmUgbWUtMVwiPlxyXG4gICAgICAgICAgICAgICAge3sgcGxhbm9GaXh0dXJlLmZpeHR1cmVDYXRlZ29yeSB8IHRpdGxlY2FzZX19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI1XCIgaGVpZ2h0PVwiNVwiIHZpZXdCb3g9XCIwIDAgNSA1XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMi41XCIgY3k9XCIyLjVcIiByPVwiMi41XCIgZmlsbD1cIiNFQUVDRjBcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGxhbm9GaXh0dXJlPy5maXh0dXJlV2lkdGg/LnZhbHVlXCIgY2xhc3M9XCJiYWRnZSBpbmFjdGl2ZSBtZS0xXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBwbGFub0ZpeHR1cmUuZml4dHVyZVdpZHRoLnZhbHVlIH19IHt7IHBsYW5vRml4dHVyZS5maXh0dXJlV2lkdGg/LnVuaXQgPz8gJ2Z0JyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNVwiIGhlaWdodD1cIjVcIiB2aWV3Qm94PVwiMCAwIDUgNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjIuNVwiIGN5PVwiMi41XCIgcj1cIjIuNVwiIGZpbGw9XCIjRUFFQ0YwXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICA8c3BhbiAgY2xhc3M9XCJiYWRnZSBpbmFjdGl2ZSBtZS0xXCI+XHJcbiAgICAgICAgICAgICAgICBGaXh0dXJlIENhcGFjaXR5OiB7eyBwbGFub0ZpeHR1cmVDYXBhY2l0eSB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNVwiIGhlaWdodD1cIjVcIiB2aWV3Qm94PVwiMCAwIDUgNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjIuNVwiIGN5PVwiMi41XCIgcj1cIjIuNVwiIGZpbGw9XCIjRUFFQ0YwXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICA8c3BhbiAgY2xhc3M9XCJiYWRnZSBpbmFjdGl2ZSBtZS0xXCI+XHJcbiAgICAgICAgICAgICAgICBWaXN1YWwgTWVyY2ggQ2FwYWNpdHk6IHt7IHBsYW5vRml4dHVyZT8udm1Db25maWc/Lmxlbmd0aCB8fCAwIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxoMyAqbmdJZj1cInNob3dBY3Rpb25cIiBjbGFzcz1cIm0tMCBtcy1hdXRvXCI+XHJcbiAgICAgICAgICAgIHt7Y3VycmVudEZpeHR1cmVJbmRleH19L3t7dG90YWxGaXh0dXJlcy5sZW5ndGh9fVxyXG4gICAgICAgIDwvaDM+XHJcblxyXG4gICAgICAgIDxzdmcgKm5nSWY9XCJzaG93QWN0aW9uXCIgKGNsaWNrKT1cIm9uQ2hhbmdlRml4dHVyZSgnbmV4dCcpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiXHJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk05IDE4TDE1IDEyTDkgNlwiIHN0cm9rZT1cIiMxRDI5MzlcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgQGlmKCB0aGlzLmFpRml4dHVyZT8uZml4dHVyZUlkKXtcclxuICAgICAgICA8ZGl2IGlkPVwiZml4dHVyZS1jb21wYXJpc29uXCIgY2xhc3M9XCJyb3cgZy0wIG15LTNcIj5cclxuICAgICAgICAgICAgQGlmIChzaG93QWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTQgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWlzQXBwcm92ZWQgJiYgc2hvd0FjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gcXVpY2stYnRuIG1zLWF1dG9cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdEZlZWRiYWNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8yMjhfMTI1MzYpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjE2NjAyIDMuMzMzMkgzLjMzMjY4QzIuODkwNjUgMy4zMzMyIDIuNDY2NzMgMy41MDg3OSAyLjE1NDE3IDMuODIxMzVDMS44NDE2MSA0LjEzMzkxIDEuNjY2MDIgNC41NTc4NCAxLjY2NjAyIDQuOTk5ODZWMTYuNjY2NUMxLjY2NjAyIDE3LjEwODYgMS44NDE2MSAxNy41MzI1IDIuMTU0MTcgMTcuODQ1QzIuNDY2NzMgMTguMTU3NiAyLjg5MDY1IDE4LjMzMzIgMy4zMzI2OCAxOC4zMzMySDE0Ljk5OTNDMTUuNDQxNCAxOC4zMzMyIDE1Ljg2NTMgMTguMTU3NiAxNi4xNzc5IDE3Ljg0NUMxNi40OTA0IDE3LjUzMjUgMTYuNjY2IDE3LjEwODYgMTYuNjY2IDE2LjY2NjVWMTAuODMzMk0xNS40MTYgMi4wODMyQzE1Ljc0NzUgMS43NTE2OCAxNi4xOTcyIDEuNTY1NDMgMTYuNjY2IDEuNTY1NDNDMTcuMTM0OSAxLjU2NTQzIDE3LjU4NDUgMS43NTE2OCAxNy45MTYgMi4wODMyQzE4LjI0NzUgMi40MTQ3MiAxOC40MzM4IDIuODY0MzYgMTguNDMzOCAzLjMzMzJDMTguNDMzOCAzLjgwMjA0IDE4LjI0NzUgNC4yNTE2OCAxNy45MTYgNC41ODMyTDkuOTk5MzUgMTIuNDk5OUw2LjY2NjAyIDEzLjMzMzJMNy40OTkzNSA5Ljk5OTg2TDE1LjQxNiAyLjA4MzJaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzFEMjkzOVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMjI4XzEyNTM2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gcHJpbWFyeS1idG5cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2xpY2tLZWVwUGxhbm8oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0FJUXVpY2tFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgcGxhbm9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiAgbXktNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yLjcyNSA1LjgwMDA4TDEwIDEwLjAwODRMMTcuMjc1IDUuODAwMDhNMTAgMTguNDAwMVYxMC4wMDAxTTE3LjUgMTMuMzMzNFY2LjY2Njc1QzE3LjQ5OTcgNi4zNzQ0OCAxNy40MjI1IDYuMDg3NDIgMTcuMjc2MyA1LjgzNDM4QzE3LjEzIDUuNTgxMzQgMTYuOTE5OCA1LjM3MTIyIDE2LjY2NjcgNS4yMjUwOEwxMC44MzMzIDEuODkxNzVDMTAuNTggMS43NDU0NyAxMC4yOTI2IDEuNjY4NDYgMTAgMS42Njg0NkM5LjcwNzQ0IDEuNjY4NDYgOS40MjAwMyAxLjc0NTQ3IDkuMTY2NjcgMS44OTE3NUwzLjMzMzMzIDUuMjI1MDhDMy4wODAyMiA1LjM3MTIyIDIuODY5OTggNS41ODEzNCAyLjcyMzcyIDUuODM0MzhDMi41Nzc0NSA2LjA4NzQyIDIuNTAwMyA2LjM3NDQ4IDIuNSA2LjY2Njc1VjEzLjMzMzRDMi41MDAzIDEzLjYyNTcgMi41Nzc0NSAxMy45MTI3IDIuNzIzNzIgMTQuMTY1OEMyLjg2OTk4IDE0LjQxODggMy4wODAyMiAxNC42Mjg5IDMuMzMzMzMgMTQuNzc1MUw5LjE2NjY3IDE4LjEwODRDOS40MjAwMyAxOC4yNTQ3IDkuNzA3NDQgMTguMzMxNyAxMCAxOC4zMzE3QzEwLjI5MjYgMTguMzMxNyAxMC41OCAxOC4yNTQ3IDEwLjgzMzMgMTguMTA4NEwxNi42NjY3IDE0Ljc3NTFDMTYuOTE5OCAxNC42Mjg5IDE3LjEzIDE0LjQxODggMTcuMjc2MyAxNC4xNjU4QzE3LjQyMjUgMTMuOTEyNyAxNy40OTk3IDEzLjYyNTcgMTcuNSAxMy4zMzM0WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtLTBcIj5FeGlzdGluZyB0ZW1wbGF0ZSA8L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ2JUb29sdGlwXT1cInBsYW5vRml4dHVyZT8uZml4dHVyZU5hbWVcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80OTZfMzE2NjQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC4wMDEzIDEzLjMzMzdWMTAuMDAwM00xMC4wMDEzIDYuNjY2OTlIMTAuMDA5Nk0xOC4zMzQ2IDEwLjAwMDNDMTguMzM0NiAxNC42MDI3IDE0LjYwMzcgMTguMzMzNyAxMC4wMDEzIDE4LjMzMzdDNS4zOTg5MyAxOC4zMzM3IDEuNjY3OTcgMTQuNjAyNyAxLjY2Nzk3IDEwLjAwMDNDMS42Njc5NyA1LjM5Nzk1IDUuMzk4OTMgMS42NjY5OSAxMC4wMDEzIDEuNjY2OTlDMTQuNjAzNyAxLjY2Njk5IDE4LjMzNDYgNS4zOTc5NSAxOC4zMzQ2IDEwLjAwMDNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDk2XzMxNjY0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGlzQXBwcm92ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5hbnN3ZXJzWzBdPy51c2VyQWN0aW9uID09PSAna2VlcFBsYW5vJyB8fCBmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vyc1swXT8udXNlckFjdGlvbiA9PT0gJ2VkaXRXaXRoUGxhbm8nIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLWF1dG9cIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeT1cIjguNzQyMjhlLTA3XCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgcng9XCIxMFwiIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0LjI0NjQgNi4xNTgzOUw4LjI3OTY5IDExLjkxNjdMNi42OTYzNSAxMC4yMjUxQzYuNDA0NjkgOS45NTAwNSA1Ljk0NjM1IDkuOTMzMzkgNS42MTMwMiAxMC4xNjY3QzUuMjg4MDIgMTAuNDA4NCA1LjE5NjM1IDEwLjgzMzQgNS4zOTYzNSAxMS4xNzUxTDcuMjcxMzUgMTQuMjI1MUM3LjQ1NDY5IDE0LjUwODQgNy43NzEzNSAxNC42ODM0IDguMTI5NjkgMTQuNjgzNEM4LjQ3MTM1IDE0LjY4MzQgOC43OTYzNSAxNC41MDg0IDguOTc5NjkgMTQuMjI1MUM5LjI3OTY5IDEzLjgzMzQgMTUuMDA0NyA3LjAwODM5IDE1LjAwNDcgNy4wMDgzOUMxNS43NTQ3IDYuMjQxNzIgMTQuODQ2NCA1LjU2NjcyIDE0LjI0NjQgNi4xNTAwNUwxNC4yNDY0IDYuMTU4MzlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzEyQjc2QVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZpeHR1cmUgW2ZpeHR1cmVdPVwicGxhbm9GaXh0dXJlXCI+PC9maXh0dXJlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWlzQXBwcm92ZWQgJiYgc2hvd0FjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHJlZG8tYnRuXCIgKGNsaWNrKT1cIm9uQ2xpY2tSZWRvKClcIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNBSVF1aWNrRWRpdFwiICpuZ0lmPVwiIWZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5oaWRlUmVkb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gcXVpY2stYnRuIG1zLWF1dG9cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdEFJRmVlZGJhY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0FJUXVpY2tFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMjI4XzEyNTM2KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOS4xNjYwMiAzLjMzMzJIMy4zMzI2OEMyLjg5MDY1IDMuMzMzMiAyLjQ2NjczIDMuNTA4NzkgMi4xNTQxNyAzLjgyMTM1QzEuODQxNjEgNC4xMzM5MSAxLjY2NjAyIDQuNTU3ODQgMS42NjYwMiA0Ljk5OTg2VjE2LjY2NjVDMS42NjYwMiAxNy4xMDg2IDEuODQxNjEgMTcuNTMyNSAyLjE1NDE3IDE3Ljg0NUMyLjQ2NjczIDE4LjE1NzYgMi44OTA2NSAxOC4zMzMyIDMuMzMyNjggMTguMzMzMkgxNC45OTkzQzE1LjQ0MTQgMTguMzMzMiAxNS44NjUzIDE4LjE1NzYgMTYuMTc3OSAxNy44NDVDMTYuNDkwNCAxNy41MzI1IDE2LjY2NiAxNy4xMDg2IDE2LjY2NiAxNi42NjY1VjEwLjgzMzJNMTUuNDE2IDIuMDgzMkMxNS43NDc1IDEuNzUxNjggMTYuMTk3MiAxLjU2NTQzIDE2LjY2NiAxLjU2NTQzQzE3LjEzNDkgMS41NjU0MyAxNy41ODQ1IDEuNzUxNjggMTcuOTE2IDIuMDgzMkMxOC4yNDc1IDIuNDE0NzIgMTguNDMzOCAyLjg2NDM2IDE4LjQzMzggMy4zMzMyQzE4LjQzMzggMy44MDIwNCAxOC4yNDc1IDQuMjUxNjggMTcuOTE2IDQuNTgzMkw5Ljk5OTM1IDEyLjQ5OTlMNi42NjYwMiAxMy4zMzMyTDcuNDk5MzUgOS45OTk4NkwxNS40MTYgMi4wODMyWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxRDI5MzlcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzIyOF8xMjUzNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHByaW1hcnktYnRuXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNsaWNrQWNjZXB0QUkoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0FJUXVpY2tFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdCBzdG9yZSByZXNwb25zZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiAgbXktNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNS42NTA0IDE0LjYxOTFINC4zNDg2M1YxMC43MzczQzQuMjM4MjYgMTAuNzQ1NSA0LjEyNjQ0IDEwLjc1IDQuMDEzNjcgMTAuNzVDMy45NzEzNyAxMC43NSAzLjkyOTQzIDEwLjc0NjMgMy44ODc3IDEwLjc0NTFWMTUuODAzN0MzLjg4Nzg4IDE2LjQ0NyA0LjQyMjIyIDE2Ljk4ODMgNS4wOTg2MyAxNi45ODgzSDE0LjkwMDRDMTUuNTc2OCAxNi45ODgzIDE2LjExMDIgMTYuNDQ3IDE2LjExMDQgMTUuODAzN1YxMC43NDUxQzE2LjA3MDggMTAuNzQ2MiAxNi4wMzExIDEwLjc1IDE1Ljk5MTIgMTAuNzVDMTUuODc2OCAxMC43NSAxNS43NjI5IDEwLjc0NDkgMTUuNjUwNCAxMC43MzYzVjE0LjYxOTFaTTE1LjQ2MzkgMy4wMTE3Mkg0LjUzNDE4QzQuNDg3MjMgMy4wMTE4NyA0LjQ0OTczIDMuMDM3NzYgNC40MzQ1NyAzLjA2MTUyVjMuMDYyNUwyLjY3ODcxIDUuODAzNzFMMi42NjAxNiA1LjgzMzAxQzIuMDQ3NjggNi44Mjc4NiAyLjY0MzI1IDguMTE3MzkgMy43MzQzOCA4LjI2MzY3QzMuODMxNzQgOC4yNzU2MSAzLjkyMjI0IDguMjgyMjIgNC4wMTA3NCA4LjI4MjIzQzQuNTg4ODkgOC4yODIyMyA1LjA5OTc4IDguMDM0MTkgNS40NTYwNSA3LjY0NzQ2TDYuMDA5NzcgNy4wNDY4OEw2LjU2MTUyIDcuNjQ5NDFDNi45MTM0MSA4LjAzMzcxIDcuNDIzMDEgOC4yODIxNSA4LjAwNDg4IDguMjgyMjNDOC41ODQzMyA4LjI4MjIzIDkuMDk3NTkgOC4wMzM0OSA5LjQ0OTIyIDcuNjQ5NDFMMTAuMDAyIDcuMDQ0OTJMMTAuNTU1NyA3LjY0OTQxQzEwLjkwNzMgOC4wMzM0OSAxMS40MjA2IDguMjgyMjMgMTIgOC4yODIyM0MxMi41NzkyIDguMjgyMSAxMy4wOTE4IDguMDMzMzcgMTMuNDQzNCA3LjY0OTQxTDEzLjk5NzEgNy4wNDQ5MkwxNC41NDk4IDcuNjQ5NDFDMTQuOTAxNCA4LjAzMzQ5IDE1LjQxNDcgOC4yODIyMyAxNS45OTQxIDguMjgyMjNDMTYuMDc5MSA4LjI4MjIyIDE2LjE3MTYgOC4yNzUzMyAxNi4yNjc2IDguMjYzNjdDMTcuMzYzNSA4LjExNTA0IDE3Ljk2MjMgNi44MDA4IDE3LjMyMzIgNS44MDM3MUwxNS41NjQ1IDMuMDYyNUwxNS41NjM1IDMuMDYxNTJDMTUuNTQ4MyAzLjAzNzY5IDE1LjUxMSAzLjAxMTcyIDE1LjQ2MzkgMy4wMTE3MlpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+U3RvcmUgcmVzcG9uc2UgPC9oND5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAgY2xhc3M9XCJiYWRnZSBpbmFjdGl2ZSBtZS0xXCIgKm5nSWY9XCIhaXNBSVF1aWNrRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBhY2l0eToge3thaUZpeHR1cmU/LmZpeHR1cmVDYXBhY2l0eSB8fCAwIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXNBcHByb3ZlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnNbMF0/LnVzZXJBY3Rpb24gPT09ICdhY2NlcHRBaScgfHwgZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnNbMF0/LnVzZXJBY3Rpb24gPT09ICdlZGl0V2l0aEFpJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLWF1dG9cIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeT1cIjguNzQyMjhlLTA3XCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgcng9XCIxMFwiIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0LjI0NjQgNi4xNTgzOUw4LjI3OTY5IDExLjkxNjdMNi42OTYzNSAxMC4yMjUxQzYuNDA0NjkgOS45NTAwNSA1Ljk0NjM1IDkuOTMzMzkgNS42MTMwMiAxMC4xNjY3QzUuMjg4MDIgMTAuNDA4NCA1LjE5NjM1IDEwLjgzMzQgNS4zOTYzNSAxMS4xNzUxTDcuMjcxMzUgMTQuMjI1MUM3LjQ1NDY5IDE0LjUwODQgNy43NzEzNSAxNC42ODM0IDguMTI5NjkgMTQuNjgzNEM4LjQ3MTM1IDE0LjY4MzQgOC43OTYzNSAxNC41MDg0IDguOTc5NjkgMTQuMjI1MUM5LjI3OTY5IDEzLjgzMzQgMTUuMDA0NyA3LjAwODM5IDE1LjAwNDcgNy4wMDgzOUMxNS43NTQ3IDYuMjQxNzIgMTQuODQ2NCA1LjU2NjcyIDE0LjI0NjQgNi4xNTAwNUwxNC4yNDY0IDYuMTU4MzlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzEyQjc2QVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5hbnN3ZXJzWzBdPy51c2VyQWN0aW9uID09PSAncmVkbycgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtYXV0b1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4yNTA2NSAxNS44MzM1QzYuOTAzNDMgMTUuODMzNSA1Ljc0NzA0IDE1LjM5NiA0Ljc4MTQ4IDE0LjUyMUMzLjgxNTkzIDEzLjY0NiAzLjMzMzQzIDEyLjU1NTcgMy4zMzM5OCAxMS4yNTAyQzMuMzMzOTggOS45NDQ2MSAzLjgxNjc2IDguODU0MzMgNC43ODIzMiA3Ljk3OTMzQzUuNzQ3ODcgNy4xMDQzMyA2LjkwMzk4IDYuNjY2ODMgOC4yNTA2NSA2LjY2NjgzSDEzLjUwMDdMMTEuMzM0IDQuNTAwMTZMMTIuNTAwNyAzLjMzMzVMMTYuNjY3MyA3LjUwMDE2TDEyLjUwMDcgMTEuNjY2OEwxMS4zMzQgMTAuNTAwMkwxMy41MDA3IDguMzMzNUg4LjI1MDY1QzcuMzc1NjUgOC4zMzM1IDYuNjE1MSA4LjYxMTI3IDUuOTY4OTggOS4xNjY4M0M1LjMyMjg3IDkuNzIyMzggNS4wMDAxIDEwLjQxNjggNS4wMDA2NSAxMS4yNTAyQzUuMDAwNjUgMTIuMDgzNSA1LjMyMzcxIDEyLjc3NzkgNS45Njk4MiAxMy4zMzM1QzYuNjE1OTMgMTMuODg5MSA3LjM3NjIxIDE0LjE2NjggOC4yNTA2NSAxNC4xNjY4SDE0LjE2NzNWMTUuODMzNUg4LjI1MDY1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImJsYWNrXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInNob3dBY3Rpb24gJiYgIWlzQUlRdWlja0VkaXRcIiBjbGFzcz1cIm1zLWF1dG8gY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFJUXVpY2tFZGl0KClcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgMTUuMDAwMkgxNS43NU0xMi4zNzUgMi42MjUxN0MxMi42NzM0IDIuMzI2OCAxMy4wNzggMi4xNTkxOCAxMy41IDIuMTU5MThDMTMuNzA4OSAyLjE1OTE4IDEzLjkxNTggMi4yMDAzMyAxNC4xMDg4IDIuMjgwMjlDMTQuMzAxOSAyLjM2MDI0IDE0LjQ3NzMgMi40Nzc0MyAxNC42MjUgMi42MjUxN0MxNC43NzI3IDIuNzcyOTEgMTQuODg5OSAyLjk0ODMgMTQuOTY5OSAzLjE0MTMyQzE1LjA0OTggMy4zMzQzNSAxNS4wOTEgMy41NDEyNCAxNS4wOTEgMy43NTAxN0MxNS4wOTEgMy45NTkxIDE1LjA0OTggNC4xNjU5OSAxNC45Njk5IDQuMzU5MDJDMTQuODg5OSA0LjU1MjA0IDE0Ljc3MjcgNC43Mjc0MyAxNC42MjUgNC44NzUxN0w1LjI1IDE0LjI1MDJMMi4yNSAxNS4wMDAyTDMgMTIuMDAwMkwxMi4zNzUgMi42MjUxN1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGVkaXRhYmxlLWZpeHR1cmUgW2ZpeHR1cmVdPVwiYWlGaXh0dXJlXCIgW2VkaXRNb2RlXT1cImlzQUlRdWlja0VkaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2FuY2VsKT1cIm9uQ2FuY2VsQUlRdWlja0VkaXQoKVwiIChvbkRvbmUpPVwib25TYXZlQUlRdWlja0VkaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWRpdFRhYik9XCJvbkVkaXRBSUZlZWRiYWNrKCRldmVudClcIj48L2VkaXRhYmxlLWZpeHR1cmU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtMlwiIFtuZ0NsYXNzXT1cInsnY29sLTQnOnNob3dBY3Rpb24sJ2NvbCc6IXNob3dBY3Rpb259XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzpzaG93QWN0aW9uICYmICFpc0FwcHJvdmVkID8gJzUwcHgnIDogJzEycHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiAgbXktNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PlN0b3JlIEltYWdlIDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihjZG4gJiYgYWlGaXh0dXJlPy5maXh0dXJlSW1hZ2Upe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4dHVyZS1pbWFnZVwiIChjbGljayk9XCJvbkNsaWNrSW1hZ2VQcmV2aWV3KCRldmVudCwgY2RuICsgYWlGaXh0dXJlPy5maXh0dXJlSW1hZ2UpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoaXNJbWFnZUxvYWRpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2tlbGV0b25Mb2FkZXJcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjZG4gKyBhaUZpeHR1cmU/LmZpeHR1cmVJbWFnZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJTdG9yZSByZXNwb25zZSBpbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cImlzSW1hZ2VMb2FkaW5nID8gJ25vbmUnIDogJ2Jsb2NrJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2Fkc3RhcnQpPVwib25JbWFnZUxvYWRTdGFydCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQpPVwib25JbWFnZUxvYWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJvbkltYWdlRXJyb3IoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkZW5kKT1cIm9uSW1hZ2VMb2FkRW5kKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxODZcIiBoZWlnaHQ9XCI4NFwiIHZpZXdCb3g9XCIwIDAgMTg2IDg0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEzMC4yNTYgMTUuMzI4NEMxNDAuMDkyIDE1LjMyODQgMTQ4LjA2NSAyMy4zMDIgMTQ4LjA2NSAzMy4xMzc5QzE0OC4wNjUgMzcuMjE3NiAxNTAuODI2IDQxLjg2ODQgMTU0LjkwNiA0MS44Njg0SDE2Ny45NzJDMTc3LjgwNyA0MS44Njg3IDE4NS43ODEgNDkuODQyMiAxODUuNzgxIDU5LjY3OEMxODUuNzgxIDY5LjUxNDEgMTc3LjgwNyA3Ny40ODg1IDE2Ny45NzEgNzcuNDg4NUg4MS4zNjYyQzY5LjcxODYgNzcuNDg4MyA1OC42MzQ5IDY4LjQwODQgNDYuOTg3MyA2OC40MDg0SDUuOTM2NTJDMi42NTc4MiA2OC40MDg0IDAgNjUuNzUwNiAwIDYyLjQ3MTlDMC4wMDAxMjc4MjMgNTkuMTkzMyAyLjY1NzkgNTYuNTM1NCA1LjkzNjUyIDU2LjUzNTRINjEuODcyOEM2My4wMDY5IDU2LjUzNTQgNjMuOTY2OSA1NS42OTI5IDY0LjI4OTcgNTQuNjA1NkM2NC43OTk0IDUyLjg4OTIgNjMuNjI2NyA1MC45NDg1IDYxLjgzNjEgNTAuOTQ4NUg0My42NTE0QzMzLjgxNTMgNTAuOTQ4NSAyNS44NDE4IDQyLjk3NCAyNS44NDE4IDMzLjEzNzlDMjUuODQyIDIzLjMwMiAzMy44MTU0IDE1LjMyODQgNDMuNjUxNCAxNS4zMjg0SDEzMC4yNTZaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNFQUVDRjBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTI2LjY2NCAyNy4zMzVWNDguNjVMMTIwLjk1OSA0My43NUMxMTguMjI5IDQxLjQwNSAxMTMuODE5IDQxLjQwNSAxMTEuMDg5IDQzLjc1TDk2LjUyOTEgNTYuMjQ1QzkzLjc5OTEgNTguNTkgODkuMzg5MSA1OC41OSA4Ni42NTkxIDU2LjI0NUw4NS40NjkxIDU1LjI2NUM4Mi45ODQxIDUzLjA5NSA3OS4wMjkxIDUyLjg4NSA3Ni4yMjkxIDU0Ljc3NUw1OS4wMDkxIDY2LjMyNUw1OC42MjQxIDY2LjYwNUM1Ny4zMjkxIDYzLjgwNSA1Ni42NjQxIDYwLjQ4IDU2LjY2NDEgNTYuNjY1VjI3LjMzNUM1Ni42NjQxIDE0LjU5NSA2NC4yNTkxIDcgNzYuOTk5MSA3SDEwNi4zMjlDMTE5LjA2OSA3IDEyNi42NjQgMTQuNTk1IDEyNi42NjQgMjcuMzM1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNkJDQUZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTgxLjE2NCAzNi4zMjk5Qzg1Ljc2NDUgMzYuMzI5OSA4OS40OTQgMzIuNjAwNSA4OS40OTQgMjcuOTk5OUM4OS40OTQgMjMuMzk5NCA4NS43NjQ1IDE5LjY2OTkgODEuMTY0IDE5LjY2OTlDNzYuNTYzNSAxOS42Njk5IDcyLjgzNCAyMy4zOTk0IDcyLjgzNCAyNy45OTk5QzcyLjgzNCAzMi42MDA1IDc2LjU2MzUgMzYuMzI5OSA4MS4xNjQgMzYuMzI5OVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwQTNGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMjYuNjY1IDQ4LjY1VjU2LjY2NUMxMjYuNjY1IDY5LjQwNSAxMTkuMDcgNzcgMTA2LjMzIDc3SDc3QzY4LjA3NSA3NyA2MS42MzUgNzMuMjU1IDU4LjYyNSA2Ni42MDVMNTkuMDEgNjYuMzI1TDc2LjIzIDU0Ljc3NUM3OS4wMyA1Mi44ODUgODIuOTg1IDUzLjA5NSA4NS40NyA1NS4yNjVMODYuNjYgNTYuMjQ1Qzg5LjM5IDU4LjU5IDkzLjggNTguNTkgOTYuNTMgNTYuMjQ1TDExMS4wOSA0My43NUMxMTMuODIgNDEuNDA1IDExOC4yMyA0MS40MDUgMTIwLjk2IDQzLjc1TDEyNi42NjUgNDguNjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMwMEEzRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMzguMDY0XCIgY3k9XCIyOC4zMTI4XCIgcj1cIjQuNDAwNDJcIiBmaWxsPVwiIzZCQ0FGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjQ3LjgyNTZcIiBjeT1cIjM5LjI0MDlcIiByPVwiMi40NTI1NVwiIGZpbGw9XCIjNkJDQUZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBjeD1cIjEzOS4xODNcIiBjeT1cIjYxLjAwNzJcIiByeD1cIjQuMjkxOTdcIiByeT1cIjQuNTk4NTRcIiBmaWxsPVwiIzAwQTNGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGlkPVwidm0tY29tcGFyaXNvblwiICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVBSURhdGE/LnZtQ29uZmlnLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0xXCI+VmlzdWFsIE1lcmNoYW5kaXNlIEltYWdlcyBmcm9tIEFJIG91dHB1dDo8L2g1PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTBcIj5cclxuXHJcbiAgICAgICAgICAgICAgICBAZm9yICh2bSBvZiBmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUFJRGF0YT8udm1Db25maWc7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTJcIiBbbmdDbGFzc109XCJ7J2NvbC02JzpzaG93QWN0aW9uLCAnY29sLTEyJzohc2hvd0FjdGlvbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZtLWNvbnRhaW5lclwiIChjbGljayk9XCJvbkNsaWNrSW1hZ2VQcmV2aWV3KCRldmVudCwgY2RuK3ZtPy52bUltYWdlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZtLWltZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjZG4rdm0/LnZtSW1hZ2VcIiBhbHQ9XCJWTSBJbWFnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yIHZtLWRldGFpbHMgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1Pnt7dm0/LnZtVHlwZX19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+e3t2bT8udm1OYW1lfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1AZWxzZSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTZcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjk0XCIgaGVpZ2h0PVwiOTRcIiB2aWV3Qm94PVwiMCAwIDk0IDk0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiN1wiIHk9XCI3XCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgcng9XCI0MFwiIGZpbGw9XCIjREFGMUZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiN1wiIHk9XCI3XCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgcng9XCI0MFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCIxMy4zMzMzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTM1Ljk1MDIgNDguMTk5N0MzNS42NDg5IDQ4LjIzMTUgMzUuMzQyMiA0OC4yNTA1IDM1LjAzMTIgNDguMjUwNUMzNC44NjE3IDQ4LjI1MDUgMzQuNjk0NCA0OC4yNDM2IDM0LjUyOTMgNDguMjMzOVY1OC42MDY5QzM0LjUyOTMgNjAuMDM0OSAzNS43MTIzIDYxLjIyNiAzNy4yMDAyIDYxLjIyNjFINTYuODA0N0M1OC4yOTI3IDYxLjIyNjEgNTkuNDc1NiA2MC4wMzUgNTkuNDc1NiA1OC42MDY5VjQ4LjIzNDlDNTkuMzEzNyA0OC4yNDQxIDU5LjE0OTggNDguMjUwNSA1OC45ODU0IDQ4LjI1MDVDNTguNjcxNCA0OC4yNTA1IDU4LjM2MDggNDguMjMyNSA1OC4wNTQ3IDQ4LjE5OTdWNTUuOTg3OEgzNS45NTAyVjQ4LjE5OTdaTTU3LjkzMTYgMzIuNzczOUgzNi4wNzMyQzM1Ljg5NTkgMzIuNzczOSAzNS43NDA2IDMyLjg2NjcgMzUuNjYzMSAzMi45ODc4TDM1LjY2MTEgMzIuOTg5N0wzMi4xNTE0IDM4LjQ3MzFMMzIuMDU2NiAzOC42MjA2QzMwLjgzMTEgNDAuNzQwNCAzMi4wOTU3IDQzLjQ2NzQgMzQuNDQ3MyA0My43NzY5QzM0LjY0ODIgNDMuODAxMyAzNC44Mzc5IDQzLjgxNTkgMzUuMDI1NCA0My44MTU5QzM2LjI1NTUgNDMuODE1OSAzNy4zNDM0IDQzLjI4NzIgMzguMTAwNiA0Mi40NjUzTDM5LjAyMjUgNDEuNDY0NEwzOS45NDE0IDQyLjQ2ODNDNDAuNjkwMyA0My4yODYzIDQxLjc3NyA0My44MTU5IDQzLjAxNDYgNDMuODE1OUM0NC4yNDY3IDQzLjgxNTggNDUuMzM4NiA0My4yODU2IDQ2LjA4NjkgNDIuNDY4M0w0Ny4wMDg4IDQxLjQ2MTRMNDcuOTMwNyA0Mi40NjgzQzQ4LjY3OSA0My4yODU3IDQ5Ljc3MDcgNDMuODE1OSA1MS4wMDI5IDQzLjgxNTlDNTIuMjM1MSA0My44MTU5IDUzLjMyNjggNDMuMjg1NyA1NC4wNzUyIDQyLjQ2ODNMNTQuOTk3MSA0MS40NjE0TDU1LjkxODkgNDIuNDY4M0M1Ni42NjczIDQzLjI4NTcgNTcuNzYgNDMuODE1OSA1OC45OTIyIDQzLjgxNTlDNTkuMTczNiA0My44MTU5IDU5LjM2ODcgNDMuODAyMSA1OS41Njg0IDQzLjc3NzhINTkuNTY3NEM2MS45NjExIDQzLjQ1NzMgNjMuMjI5MyA0MC42MDc4IDYxLjg2MTMgMzguNDczMUw2MS44NjA0IDM4LjQ3NDFMNTguMzQzOCAzMi45OTA3TDU4LjM0MjggMzIuOTg3OEM1OC4yNjUzIDMyLjg2NjUgNTguMTA5MiAzMi43NzM5IDU3LjkzMTYgMzIuNzczOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1ib2xkIGgzIG10LTJcIj5ObyByZXNwb25zZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5ObyBBSSByZXNwb25zZSBmb3VuZCBmb3IgdGhpcyBmaXh0dXJlLjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1cclxuXHJcblxyXG4gICAgQGlmIChmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vycz8uWzBdPy5jb21tZW50cy5sZW5ndGgpIHtcclxuICAgICAgICA8ZGl2IGlkPVwiZml4dHVyZS1jb21tZW50c1wiPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0yXCI+Q29tbWVudHM8L2g1PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYyBvZiBmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vyc1swXT8uY29tbWVudHM7bGV0IGk9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIFVzZXIgYXZhdGFyIC0tPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgcng9XCIxNlwiIGZpbGw9XCIjRUFGOEZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIyLjY2NzMgMjMuNVYyMS44MzMzQzIyLjY2NzMgMjAuOTQ5MyAyMi4zMTYxIDIwLjEwMTQgMjEuNjkxIDE5LjQ3NjNDMjEuMDY1OSAxOC44NTEyIDIwLjIxOCAxOC41IDE5LjMzNCAxOC41SDEyLjY2NzNDMTEuNzgzMyAxOC41IDEwLjkzNTQgMTguODUxMiAxMC4zMTAzIDE5LjQ3NjNDOS42ODUxNyAyMC4xMDE0IDkuMzMzOTggMjAuOTQ5MyA5LjMzMzk4IDIxLjgzMzNWMjMuNU0xOS4zMzQgMTEuODMzM0MxOS4zMzQgMTMuNjc0MyAxNy44NDE2IDE1LjE2NjcgMTYuMDAwNyAxNS4xNjY3QzE0LjE1OTcgMTUuMTY2NyAxMi42NjczIDEzLjY3NDMgMTIuNjY3MyAxMS44MzMzQzEyLjY2NzMgOS45OTIzOCAxNC4xNTk3IDguNSAxNi4wMDA3IDguNUMxNy44NDE2IDguNSAxOS4zMzQgOS45OTIzOCAxOS4zMzQgMTEuODMzM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIGZsZXgtY29sdW1uXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0Pnt7Yz8udXNlck5hbWV9fTwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPnt7Yz8udGltZVN0YW1wIHwgZGF0ZTonaGg6bW06c3MgYSAtIGRkIE1NTSB5eXl5J319PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoYz8ucmVzcG9uc2V0eXBlID09PSAnY29tbWVudCcpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDU+e3tjPy5jb21tZW50fX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgIH1AZWxzZSBpZihjPy5yZXNwb25zZXR5cGUgPT09ICdhZ3JlZScpe1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1ICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnM/LlswXT8udXNlckFjdGlvbiA9PT0gJ2tlZXBQbGFubydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIktlZXAgUGxhbm9cIi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1ICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnM/LlswXT8udXNlckFjdGlvbiA9PT0gJ2VkaXRXaXRoUGxhbm8nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrZWQgYXMgXCJLZWVwIFBsYW5vIHdpdGggTW9kaWZpY2F0aW9uXCIuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSAqbmdJZj1cImZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5hbnN3ZXJzPy5bMF0/LnVzZXJBY3Rpb24gPT09ICdhY2NlcHRBaSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIkFjY2VwdCBBSVwiLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vycz8uWzBdPy51c2VyQWN0aW9uID09PSAnZWRpdFdpdGhBaSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIkFjY2VwdCBBSSB3aXRoIE1vZGlmaWNhdGlvblwiLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJjPy5jb21tZW50XCI+Tm90ZToge3tjLmNvbW1lbnR9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgfUBlbHNlIGlmKGM/LnJlc3BvbnNldHlwZSA9PT0gJ2Rpc2FncmVlJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIlJlZG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJjPy5jb21tZW50XCI+Tm90ZToge3tjLmNvbW1lbnR9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJpbWctcHJldmlld1wiICpuZ0lmPVwic2VsZWN0ZWRJbWFnZUZvclByZXZpZXdcIiAoY2xpY2spPVwiY2xvc2VJbWFnZVByZXZpZXcoKVwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwcmV2aWV3LWNsb3NlXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgY2xvc2VJbWFnZVByZXZpZXcoKVwiPiYjeDI3MTU7PC9idXR0b24+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctem9vbS1jb250cm9sc1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25QcmV2aWV3Wm9vbU91dCgpXCI+JiN4MjIxMjs8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGNsYXNzPVwiem9vbS1zbGlkZXJcIiBtaW49XCIyNVwiIG1heD1cIjUwMFwiIHN0ZXA9XCIyNVwiXHJcbiAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaW1hZ2VQcmV2aWV3Wm9vbSAqIDEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25QcmV2aWV3Wm9vbVNsaWRlcigkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgPHNwYW4+e3sgKGltYWdlUHJldmlld1pvb20gKiAxMDApLnRvRml4ZWQoMCkgfX0lPC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvblByZXZpZXdab29tSW4oKVwiPiYjeDJCOzwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LWltYWdlLWNvbnRhaW5lclwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblByZXZpZXdQYW5TdGFydCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25QcmV2aWV3UGFuTW92ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChtb3VzZXVwKT1cIm9uUHJldmlld1BhbkVuZCgpXCJcclxuICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uUHJldmlld1BhbkVuZCgpXCJcclxuICAgICAgICAgICAgICh3aGVlbCk9XCJvblByZXZpZXdXaGVlbCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDxpbWcgW3NyY109XCJzZWxlY3RlZEltYWdlRm9yUHJldmlld1wiIGNsYXNzPVwiZnVsbC1pbWdcIlxyXG4gICAgICAgICAgICAgICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwiJ3NjYWxlKCcgKyBpbWFnZVByZXZpZXdab29tICsgJykgdHJhbnNsYXRlKCcgKyBpbWFnZVByZXZpZXdQYW5YIC8gaW1hZ2VQcmV2aWV3Wm9vbSArICdweCwnICsgaW1hZ2VQcmV2aWV3UGFuWSAvIGltYWdlUHJldmlld1pvb20gKyAncHgpJ1wiXHJcbiAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICNza2VsZXRvbkxvYWRlcj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyIHJvdW5kZWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuPC9zZWN0aW9uPiJdfQ==