tango-app-ui-manage-settings 3.7.13 → 3.7.15

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.
@@ -46,6 +46,10 @@ export class FootfallConfigurationComponent {
46
46
  issendTangoDropdownOpen = false;
47
47
  isTicketCountDropdownOpen = false;
48
48
  isStoreDaysDropdownOpen = false;
49
+ daysOptions = [
50
+ { label: 'Month', value: '30' },
51
+ { label: 'Week', value: '7' }
52
+ ];
49
53
  isStoreAccuracyDropdownOpen = false;
50
54
  isAllowTicketCreationDropdownOpen = false;
51
55
  revisionDepsInitialized = false;
@@ -191,7 +195,7 @@ export class FootfallConfigurationComponent {
191
195
  if (data.accuracyBreach) {
192
196
  this.footfallDirConfigurationForm.get('accuracyBreach')?.patchValue({
193
197
  ticketCount: data.accuracyBreach.ticketCount,
194
- days: data.accuracyBreach.days,
198
+ days: data.accuracyBreach.days ?? '30',
195
199
  accuracy: data.accuracyBreach.accuracy
196
200
  });
197
201
  }
@@ -453,17 +457,22 @@ export class FootfallConfigurationComponent {
453
457
  }
454
458
  this.isStoreDaysDropdownOpen = !this.isStoreDaysDropdownOpen;
455
459
  }
456
- selectStoreDays(event, value) {
460
+ selectStoreDays(event, option) {
457
461
  event.stopPropagation();
458
462
  const control = this.footfallDirConfigurationForm.get('accuracyBreach.days');
459
463
  if (!control) {
460
464
  return;
461
465
  }
462
- control.setValue(value);
466
+ control.setValue(option.value);
463
467
  control.markAsDirty();
464
468
  control.markAsTouched();
465
469
  this.isStoreDaysDropdownOpen = false;
466
470
  }
471
+ get selectedDaysLabel() {
472
+ const currentValue = this.footfallDirConfigurationForm.get('accuracyBreach.days')?.value;
473
+ const match = this.daysOptions.find(opt => opt.value === currentValue);
474
+ return match?.label || 'Month';
475
+ }
467
476
  toggleStoreAccuracyDropdown(event) {
468
477
  event.stopPropagation();
469
478
  if (this.isEdit) {
@@ -821,11 +830,11 @@ export class FootfallConfigurationComponent {
821
830
  return match?.label || '';
822
831
  }
823
832
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FootfallConfigurationComponent, deps: [{ token: i1.FormBuilder }, { token: i2.GlobalStateService }, { token: i3.ClientApiService }, { token: i4.NgbModal }, { token: i5.ToastService }], target: i0.ɵɵFactoryTarget.Component });
824
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FootfallConfigurationComponent, selector: "lib-footfall-configuration", host: { listeners: { "document:click": "closeMenus()" } }, viewQueries: [{ propertyName: "categoryModalTpl", first: true, predicate: ["categoryModal"], descendants: true }, { propertyName: "deleteCategoryModalTpl", first: true, predicate: ["deleteCategoryModal"], descendants: true }, { propertyName: "resetConfirmationModalTpl", first: true, predicate: ["resetConfirmationModal"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"footfallDirConfigurationForm\" class=\"container-fluid\">\r\n <ng-container *ngIf=\"(gs.userAccess | async)?.Global_Configuration_isEdit\">\r\n <div *ngIf=\"isEdit\" class=\"col-12 mb-5\">\r\n <!-- *ngIf=\"(gs.userAccess | async)?.userType === 'tango' || footfallDirConfigurationForm.get('footfallDirectoryConfigs')?.value === true\"> -->\r\n <div class=\" d-flex justify-content-end\">\r\n <button (click)=\"toggleForm();\" type=\"button\" class=\"btn btn-outline align-items-end\"><span\r\n class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_2579_25125)\">\r\n <path\r\n d=\"M14.167 2.49993C14.3859 2.28106 14.6457 2.10744 14.9317 1.98899C15.2176 1.87054 15.5241 1.80957 15.8337 1.80957C16.1432 1.80957 16.4497 1.87054 16.7357 1.98899C17.0216 2.10744 17.2815 2.28106 17.5003 2.49993C17.7192 2.7188 17.8928 2.97863 18.0113 3.2646C18.1297 3.55057 18.1907 3.85706 18.1907 4.16659C18.1907 4.47612 18.1297 4.78262 18.0113 5.06859C17.8928 5.35455 17.7192 5.61439 17.5003 5.83326L6.25033 17.0833L1.66699 18.3333L2.91699 13.7499L14.167 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2579_25125\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>Edit Details</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Approver Configuration -->\r\n <!-- <div class=\"row\">\r\n <div class=\"card p-3 mb-3\">\r\n <h5>Approver Configuration</h5>\r\n <ng-container>\r\n <div class=\"sub-text\">Set level of revision required for a store raised tickets</div>\r\n </ng-container>\r\n <div formArrayName=\"revision\" class=\"d-flex gap-4\">\r\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\" class=\"form-check\">\r\n <input type=\"checkbox\" formControlName=\"isChecked\" class=\"form-check-input\" [id]=\"'action-' + i\">\r\n <label class=\"form-check-label\" [for]=\"'action-' + i\">\r\n {{ rev.get('actionType')?.value | titlecase }}\r\n </label>\r\n <ng-container>\r\n <div *ngIf=\"rev.get('actionType')?.value == 'reviewer'\" class=\"sub-text\">The Ticket undergoes a single review to verify footfall</div>\r\n <div *ngIf=\"rev.get('actionType')?.value == 'approver'\" class=\"sub-text\">The Ticket undergoes a final review after the initial check</div>\r\n <div *ngIf=\"rev.get('actionType')?.value == 'tango'\" class=\"sub-text\">Finalize ticket and update footfall count</div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Approver Configuration -->\r\n <div class=\"card p-4 mb-4 approver-section\">\r\n <h5 class=\"mb-1 fw-semibold\">Approver configuration</h5>\r\n <p class=\"mb-4 small\">\r\n Set level of revisions required for a store raised tickets\r\n </p>\r\n\r\n <div formArrayName=\"revision\" class=\"d-flex flex-wrap gap-5\">\r\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"approver-option d-flex flex-column\"\r\n [class.disabled-option]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n\r\n <label class=\"custom-checkbox align-items-start\"\r\n [class.disabled-checkbox]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n <input type=\"checkbox\" formControlName=\"isChecked\" [id]=\"'action-' + i\" />\r\n <span class=\"checkmark\"></span>\r\n <div class=\"label-text\">\r\n <div class=\"title\">\r\n {{ rev.get('actionType')?.value | titlecase }}\r\n </div>\r\n <div class=\"desc text-muted\">\r\n <ng-container [ngSwitch]=\"rev.get('actionType')?.value\">\r\n <span *ngSwitchCase=\"'reviewer'\">The ticket undergoes a single review to verify\r\n footfall.</span>\r\n <span *ngSwitchCase=\"'approver'\">The ticket undergoes a final review after the initial\r\n check.</span>\r\n <span *ngSwitchCase=\"'tango'\">Finalize tickets and update footfall count.</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </label>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <hr class=\"ms-4 me-4\">\r\n\r\n <!-- Store SPOC Ticket Creation -->\r\n <div class=\"row\">\r\n <!-- <div class=\"card p-3 mb-3\">\r\n <h5>Store SPOC Ticket Creation</h5>\r\n <label>Allow Store SPOC to create tickets only for last</label>\r\n <input type=\"number\" min=\"1\" max=\"3\" class=\"form-control w-25 d-inline mx-2\" formControlName=\"allowTicketCreation\"> Days\r\n </div> -->\r\n <div class=\"card p-3 mb-3\">\r\n <h5 class=\"fw-bold mb-3\">Store SPOC Ticket Creation</h5>\r\n\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n\r\n <label class=\"mb-0\">\r\n Allow store SPOC to create tickets only for the last\r\n </label>\r\n\r\n <!-- Number dropdown -->\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\"\r\n [class.open]=\"isAllowTicketCreationDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleAllowTicketCreationDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('allowTicketCreation')?.value ||\r\n spocTicketCreationdays[0] }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAllowTicketCreationDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of spocTicketCreationdays\"\r\n (click)=\"selectAllowTicketCreation($event, day)\">\r\n {{ day }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <span class=\"mb-0\">Days</span>\r\n </div>\r\n </div>\r\n </div>\r\n <hr class=\"ms-4 me-4\">\r\n\r\n <div class=\"row\">\r\n <!-- Ticket Auto-close -->\r\n <!-- <div class=\"card p-3 mb-3\">\r\n <h5>Ticket Auto-close</h5>\r\n <div class=\"form-check form-switch mb-2\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"autoClose\" formControlName=\"isAutoCloseEnable\">\r\n <label class=\"form-check-label\" for=\"autoClose\">Enable Auto-close</label>\r\n </div>\r\n <div>\r\n <label>Auto-close Accuracy</label>\r\n <select formControlName=\"autoCloseAccuracy\" class=\"form-select w-25\">\r\n <option *ngFor=\"let val of ['85%', '90%', '95%', '100%']\" [value]=\"val\">{{ val }}</option>\r\n </select>\r\n </div>\r\n </div> -->\r\n\r\n <div class=\"card p-3 mb-3\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <h5 class=\"fw-bold m-0\">Ticket Auto-close</h5>\r\n\r\n <!-- Toggle Switch -->\r\n <label class=\"switch m-0 ms-3\" [class.disabled]=\"isEdit\">\r\n <input type=\"checkbox\" formControlName=\"isAutoCloseEnable\" [disabled]=\"isEdit\">\r\n <span class=\"slider round\"></span>\r\n </label>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center mt-2\">\r\n <span class=\"mb-0\">\r\n Ticket should be auto-closed, if the created ticket accuracy is greater than or equal to\r\n </span>\r\n\r\n <!-- Accuracy dropdown -->\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\" [class.open]=\"isAutoCloseDropdownOpen\"\r\n [class.disabled]=\"isEdit || !footfallDirConfigurationForm.get('isAutoCloseEnable')?.value\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleAutoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('autoCloseAccuracy')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAutoCloseDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of accuracyPercentageList\"\r\n (click)=\"selectAutoCloseAccuracy($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <hr class=\"ms-4 me-4\">\r\n\r\n <!-- Tagging Limitations -->\r\n <div class=\"row\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n <div class=\"card p-4 mb-4\">\r\n <!-- Footfall directory limitations start -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n <div>\r\n <h5 class=\"fw-semibold m-0\">Footfall directory limitations</h5>\r\n <p class=\"small mb-2\">\r\n Set maximum limitation for stores to tag non-Purchasers from Total Footfall\r\n </p>\r\n </div>\r\n\r\n <button type=\"button\" [disabled]=\"isEdit\" class=\"add-new-btn d-inline-flex align-items-center gap-2\"\r\n (click)=\"openCategoryModal('add')\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3.33334V12.6667M3.33334 8H12.6667\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>Add New</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Footfall directory limitations category part -->\r\n <div formArrayName=\"taggingLimitation\" class=\"category-grid mt-3\">\r\n <div *ngFor=\"let tag of tagLimits.controls; let i = index\" [formGroupName]=\"i\" class=\"category-card\">\r\n <!-- Top Section: Icon and Name -->\r\n <div class=\"category-card-header\">\r\n <!-- <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\"> -->\r\n <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\">\r\n <ng-container [ngSwitch]=\"tag.get('iconName')?.value\">\r\n <!-- Duplicate Tag SVG - Two overlapping squares -->\r\n <svg *ngSwitchCase=\"'duplicateTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1162_24621)\">\r\n <path\r\n d=\"M2.5 7.5H2C1.73478 7.5 1.48043 7.39464 1.29289 7.20711C1.10536 7.01957 1 6.76522 1 6.5V2C1 1.73478 1.10536 1.48043 1.29289 1.29289C1.48043 1.10536 1.73478 1 2 1H6.5C6.76522 1 7.01957 1.10536 7.20711 1.29289C7.39464 1.48043 7.5 1.73478 7.5 2V2.5M5.5 4.5H10C10.5523 4.5 11 4.94772 11 5.5V10C11 10.5523 10.5523 11 10 11H5.5C4.94772 11 4.5 10.5523 4.5 10V5.5C4.5 4.94772 4.94772 4.5 5.5 4.5Z\"\r\n stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24621\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <!-- Employee Tag SVG - Two people, one in front of the other -->\r\n <svg *ngSwitchCase=\"'employeeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\r\n <path\r\n d=\"M11.1667 12.5V11.1667C11.1667 10.4594 10.8857 9.78115 10.3856 9.28105C9.88552 8.78095 9.20724 8.5 8.5 8.5H3.16667C2.45942 8.5 1.78115 8.78095 1.28105 9.28105C0.780952 9.78115 0.5 10.4594 0.5 11.1667V12.5M15.1667 12.5V11.1667C15.1662 10.5758 14.9696 10.0018 14.6076 9.53488C14.2456 9.06791 13.7388 8.73438 13.1667 8.58667M10.5 0.586667C11.0736 0.733534 11.582 1.06713 11.9451 1.53487C12.3082 2.00261 12.5052 2.57789 12.5052 3.17C12.5052 3.76211 12.3082 4.33739 11.9451 4.80513C11.582 5.27287 11.0736 5.60647 10.5 5.75333M8.5 3.16667C8.5 4.63943 7.30609 5.83333 5.83333 5.83333C4.36057 5.83333 3.16667 4.63943 3.16667 3.16667C3.16667 1.69391 4.36057 0.5 5.83333 0.5C7.30609 0.5 8.5 1.69391 8.5 3.16667Z\"\r\n stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <!-- House Keeping Tag SVG - House with broom -->\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"#344054\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <!-- Junk Tag SVG - Trash can -->\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n\r\n <!-- Purple Tag SVG -->\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <!-- Orange Tag SVG -->\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <!-- Blue Tag SVG -->\r\n <!-- <svg *ngSwitchCase=\"'blueTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg> -->\r\n\r\n <!-- Default Tag SVG (fallback) -->\r\n <!-- <svg *ngSwitchDefault xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg> -->\r\n </ng-container>\r\n </div>\r\n <div class=\"category-name\">\r\n {{ tag.get('name')?.value }}\r\n </div>\r\n <!-- Menu Button (only for houseKeepingTag and junkTag) -->\r\n <button\r\n *ngIf=\"(tag.get('iconName')?.value !== 'duplicateTag' && tag.get('iconName')?.value !== 'employeeTag')\"\r\n type=\"button\" class=\"category-menu-btn\" (click)=\"toggleCategoryMenu($event, i)\"\r\n [disabled]=\"isEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\"\r\n viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 21C12.5523 21 13 20.5523 13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20C11 20.5523 11.4477 21 12 21Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n </button>\r\n <div class=\"category-menu\" *ngIf=\"activeMenuIndex === i\">\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'edit', i)\">Edit Name</button>\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'delete', i)\">Delete</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Bottom Section: Percentage Dropdown -->\r\n <div class=\"category-percentage-section\">\r\n <div class=\"position-relative ff-select-wrapper compact\"\r\n [class.open]=\"openLimitDropdownIndex === i\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleLimitDropdown($event, i)\">\r\n <span>{{ tag.get('value')?.value || 0 }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"openLimitDropdownIndex === i\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectLimitValue($event, i, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"mt-3\" *ngIf=\"isCategoryLimitReached\">\r\n <div class=\"alert alert-soft-primary d-flex align-items-center gap-2 mb-0\">\r\n <span class=\"badge-dot\"></span>\r\n <span>Maximum category creation limit reached.</span>\r\n </div>\r\n </div> -->\r\n <!-- Footfall directory limitations end -->\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ms-4 me-4\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n \r\n <div formGroupName=\"accuracyBreach\" class=\"card p-4 mb-3 store-requests-section\">\r\n <!-- store request Header Section -->\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div>\r\n <h5 class=\"fw-semibold mb-2\">Store Requests</h5>\r\n <p class=\"small mb-0 text-muted\">\r\n Below stores have requested to raise a ticket after breaching the configured limit\r\n <span class=\"info-icon\">i</span>\r\n </p>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-primary reset-btn d-inline-flex align-items-center gap-2\"\r\n *ngIf=\"!isEdit\" [disabled]=\"isResetDisabled\" (click)=\"openResetConfirmationModal()\" aria-live=\"polite\">\r\n <span>Reset</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Restriction Criteria Section -->\r\n <div class=\"restriction-criteria mb-4\">\r\n <label class=\"mb-3 d-block\">\r\n Restrict ticket creation for any store that:\r\n </label>\r\n <div class=\"d-flex align-items-center flex-nowrap gap-2\">\r\n <!-- Ticket Count Dropdown -->\r\n <span>Has raised more than</span>\r\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isTicketCountDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleTicketCountDropdown($event)\">\r\n <span>\r\n {{ footfallDirConfigurationForm.get('accuracyBreach.ticketCount')?.value || 1 }}\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isTicketCountDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let c of [1, 2, 3, 4, 5]\"\r\n (click)=\"selectTicketCount($event, c)\">\r\n {{ c }}\r\n </button>\r\n </div>\r\n </div>\r\n <span>tickets in the calender month </span>\r\n <!-- Days Dropdown -->\r\n <!-- <div class=\"position-relative ff-select-wrapper compact store-days-select\"\r\n [class.open]=\"isStoreDaysDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreDaysDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('accuracyBreach.days')?.value ||\r\n storeTicketDays[0] }} Days</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isStoreDaysDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of storeTicketDays\"\r\n (click)=\"selectStoreDays($event, day)\">\r\n {{ day }} Days\r\n </button>\r\n </div>\r\n </div> -->\r\n <span class=\"bold\" style=\"font-weight: 500;\">AND</span>\r\n <span>has footfall accuracy</span>\r\n <!-- Accuracy Dropdown -->\r\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isStoreAccuracyDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreAccuracyDropdown($event)\">\r\n <span>\r\n >={{ footfallDirConfigurationForm.get('accuracyBreach.accuracy')?.value || '95%' }}\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isStoreAccuracyDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of [95, 96, 97, 98, 99]\"\r\n (click)=\"selectStoreAccuracy($event, p)\">\r\n >={{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Requests Table -->\r\n <div class=\"store-requests-table\" [class.disabled]=\"isEdit\"\r\n *ngIf=\"storeList?.length > 0; else emptyStoreRequests\">\r\n <div class=\"table-responsive\" [ngClass]=\"{'store-table-scroll': storeList?.length > 5}\">\r\n <table class=\"table table-hover store-requests-table-content\">\r\n <thead>\r\n <tr>\r\n <th class=\"checkbox-column\"></th>\r\n <th class=\"sortable store-name-column\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input type=\"checkbox\" [checked]=\"isAllSelected\" [disabled]=\"isEdit\"\r\n (change)=\"toggleSelectAll($event)\" />\r\n <span class=\"checkmark-select\"></span>\r\n <span class=\"ms-2\">Select all stores ({{ storeList?.length || 0\r\n }})</span>\r\n </label>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" class=\"ms-2 dropdown-arrow\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th class=\"sortable\">\r\n Raised on\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n Last raised(Approved)\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n No of Time Raised\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let store of storeList\">\r\n <td class=\"checkbox-column\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input #cb type=\"checkbox\" [checked]=\"isStoreSelected(store)\" [disabled]=\"isEdit\"\r\n (change)=\"toggleStoreSelection(store, cb.checked)\" />\r\n <span class=\"checkmark-select\"></span>\r\n </label>\r\n </td>\r\n <td>{{ store.storeName }}</td>\r\n <td>{{ store.raisedOn }}</td>\r\n <td>{{ store.lastApproved || '-' }}</td>\r\n <td>{{ store.totalRaised }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <ng-template #emptyStoreRequests>\r\n <div class=\"empty-store-state text-center\">\r\n <div class=\"empty-store-icon mb-3\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.94629 21.1995C8.645 21.2313 8.33828 21.2502 8.02734 21.2502C7.85782 21.2502 7.69052 21.2434 7.52539 21.2336V31.6067C7.52539 33.0347 8.70837 34.2258 10.1963 34.2258H29.8008C31.2888 34.2258 32.4717 33.0347 32.4717 31.6067V21.2346C32.3098 21.2438 32.1459 21.2502 31.9814 21.2502C31.6675 21.2502 31.3569 21.2323 31.0508 21.1995V28.9875H8.94629V21.1995ZM30.9277 5.77368H9.06934C8.89197 5.77368 8.73671 5.86647 8.65918 5.98755L8.65723 5.9895L5.14746 11.4729L5.05273 11.6204C3.82719 13.7402 5.0918 16.4671 7.44336 16.7766C7.64428 16.8011 7.83403 16.8157 8.02148 16.8157C9.25156 16.8157 10.3395 16.287 11.0967 15.4651L12.0186 14.4641L12.9375 15.468C13.6864 16.2861 14.7731 16.8157 16.0107 16.8157C17.2428 16.8156 18.3347 16.2854 19.083 15.468L20.0049 14.4612L20.9268 15.468C21.6751 16.2855 22.7668 16.8157 23.999 16.8157C25.2312 16.8157 26.3229 16.2854 27.0713 15.468L27.9932 14.4612L28.915 15.468C29.6634 16.2855 30.756 16.8157 31.9883 16.8157C32.1697 16.8157 32.3648 16.8018 32.5645 16.7776H32.5635C34.9572 16.4571 36.2254 13.6075 34.8574 11.4729L34.8564 11.4739L31.3398 5.99048L31.3389 5.98755C31.2614 5.86628 31.1053 5.77368 30.9277 5.77368Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <p class=\"mb-0 fw-semibold text-muted\">No reset request from store</p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <hr class=\"ms-4 me-4\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n <!-- Tango Review -->\r\n <!-- <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-3 mb-3\">\r\n <label>Send Ticket to Tango if accuracy falls below</label>\r\n <input type=\"text\" class=\"form-control w-25\" formControlName=\"tangoReview\">\r\n </div> -->\r\n <div class=\"row\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n <div class=\"card p-4 mb-4 tango-review-card\">\r\n <div class=\"d-flex align-items-center gap-2 mb-1\">\r\n <h5 class=\"fw-bold m-0\">Send Ticket to Tango</h5>\r\n </div>\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"me-2 mb-0 tango-label\">Send ticket to Tango if accuracy falls below</label>\r\n <div class=\"position-relative ff-select-wrapper compact ms-0\" [class.open]=\"issendTangoDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleSendTangoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('tangoReview')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"issendTangoDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of sendTicketTango\"\r\n (click)=\"selectSendTicketTango($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!isEdit\">\r\n <div class=\"mb-5 w-100 footer-seperator\"></div>\r\n <div class=\"d-flex justify-content-end\">\r\n <a type=\"button\" class=\"btn btn-outline mt-1 me-4\" (click)=\"onCancel()\">Cancel</a>\r\n <a type=\"submit\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\"><span>Save Changes</span></a>\r\n </div>\r\n </div>\r\n\r\n <!-- Category Modal -->\r\n <ng-template #categoryModal>\r\n <div class=\"modal-header border-0 pb-0\">\r\n <h5 class=\"modal-title\">\r\n {{ categoryModalMode === 'add' ? 'Add New Category' : 'Edit Category' }}\r\n </h5>\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"closeCategoryModal()\"></button>\r\n </div>\r\n <div class=\"modal-body category-modal-body\">\r\n <form [formGroup]=\"categoryForm\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Icon</label>\r\n <div class=\"ff-select-wrapper icon-select\" [class.open]=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryIconDropdown($event)\">\r\n <span class=\"d-inline-flex align-items-center gap-2\">\r\n <span class=\"category-icon\"\r\n [ngClass]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <ng-container [ngSwitch]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <!-- Blue Tag SVG -->\r\n <!-- <svg *ngSwitchCase=\"'blueTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> -->\r\n <!-- Purple Tag SVG -->\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- Orange Tag SVG -->\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- House Keeping Tag SVG -->\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_icon_housekeeping)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_icon_housekeeping\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <!-- Junk Tag SVG -->\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span class=\"icon-label\">{{ selectedCategoryIconLabel }}</span>\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option d-flex align-items-center gap-2\"\r\n *ngFor=\"let icon of categoryIcons\"\r\n (click)=\"selectCategoryIconFromDropdown($event, icon.value)\">\r\n <span class=\"category-icon\" [ngClass]=\"icon.value\">\r\n <ng-container [ngSwitch]=\"icon.value\">\r\n <!-- Blue Tag SVG -->\r\n <!-- <svg *ngSwitchCase=\"'blueTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> -->\r\n <!-- Purple Tag SVG -->\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- Orange Tag SVG -->\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- House Keeping Tag SVG -->\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"#344054\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <!-- Junk Tag SVG -->\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span>{{ icon.label }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Category Name</label>\r\n <input type=\"text\" class=\"form-control\" \r\n [class.is-invalid]=\"categoryForm.get('name')?.invalid && categoryForm.get('name')?.touched\"\r\n placeholder=\"Enter your new category\"\r\n formControlName=\"name\" />\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('required') && categoryForm.get('name')?.touched\">\r\n Category name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('duplicate') && categoryForm.get('name')?.touched\">\r\n Category name already exists.\r\n </small>\r\n </div>\r\n\r\n <div class=\"mb-2\">\r\n <label class=\"form-label text-muted\">Limitation</label>\r\n <div class=\"ff-select-wrapper\" [class.open]=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryLimitDropdown($event)\">\r\n <span>{{ categoryForm.get('limit')?.value || percentageList[0] }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectCategoryLimitValue($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"modal-footer border-0 pt-0\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeCategoryModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"submitCategoryForm()\">\r\n {{ categoryModalMode === 'add' ? 'Create' : 'Save' }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Delete Confirmation Modal -->\r\n <ng-template #deleteCategoryModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Confirmation</h5>\r\n <p class=\"mb-4 text-muted\">\r\n You're about to delete <span class=\"fw-semibold\">{{ categoryPendingDeleteName }}</span> category.\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeDeleteModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger\" (click)=\"confirmDeleteCategory()\">Delete</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Reset Store Requests Confirmation Modal -->\r\n <ng-template #resetConfirmationModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Reset Store Requests</h5>\r\n <p class=\"mb-4 text-muted\">\r\n Are you sure you want to proceed with resetting the selected <span class=\"fw-semibold\">{{\r\n resetRequest.arrayOfStores.length }}</span> store(s) requests?\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeResetModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"confirmResetStoreRequest()\">Reset</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n</form>", styles: [".tango-review-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 8px 30px #0f172a14}.tango-icon{width:28px;height:28px;border-radius:50%;background:#2e90fa26;display:inline-flex;align-items:center;justify-content:center}.tango-label{font-size:13px;color:#475467;font-weight:500}form{background:#fff;padding:32px 40px;border-radius:16px;box-shadow:0 2px 12px #0000000d;font-family:Inter,Segoe UI,sans-serif}.section-divider{border-bottom:1px solid #e4e7ec;margin:40px 0}.sub-header{font-size:16px;font-weight:600;color:#111827;margin-bottom:6px}.sub-text{font-size:13px;color:#6b7280;margin-bottom:12px}.form-check{display:flex;align-items:center;gap:10px}.form-check-input{width:42px;height:22px;cursor:pointer;accent-color:#2563eb;border:1px solid #d1d5db;transition:all .2s ease-in-out}.form-check-input:checked{background-color:#2563eb;border-color:#2563eb}.form-check-input:disabled{opacity:.6;cursor:not-allowed}.toggle-label{font-size:13px;font-weight:500;color:#374151}input[type=radio].form-check-input{width:16px;height:16px;accent-color:#2563eb}input[type=radio]:checked{border-color:#2563eb}select.form-select{border:1px solid #d1d5db;border-radius:8px;height:38px;font-size:14px;color:#374151;padding:6px 10px;outline:none;transition:.2s}select.form-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.btn-outline{background-color:#fff;border:1px solid #d1d5db;color:#374151;padding:6px 16px;border-radius:8px;transition:all .2s}.btn-outline:hover{background:#f9fafb}.btn-primary{background-color:#2563eb;border:none;color:#fff;border-radius:8px;padding:6px 16px;transition:.2s}.btn-primary:hover{background-color:#1e40af}.col-lg-3,.col-xl-3,.col-xxl-3{margin-bottom:20px}.approver-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.approver-option{display:flex;flex-direction:column;justify-content:flex-start;width:220px}.custom-checkbox{position:relative;display:flex;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.custom-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer}.custom-checkbox .checkmark{height:20px;width:20px;border:2px solid #d0d5dd;border-radius:6px;display:inline-block;transition:all .2s ease}.custom-checkbox input:checked~.checkmark{background-color:#004aad;border-color:#004aad}.custom-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.label-text{display:flex;flex-direction:column}.label-text .title{font-weight:600;color:#101828}.label-text .desc{font-size:13px;color:#667085;margin-top:2px;max-width:190px;line-height:1.4}.custom-checkbox input:not(:checked)~.label-text .desc{opacity:.6}.approver-option.disabled-option{opacity:.6;pointer-events:none}.approver-option.disabled-option .custom-checkbox.disabled-checkbox{cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .checkmark{background-color:#f3f4f6;border-color:#d1d5dd;cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark{background-color:#f3f4f6;border-color:#d1d5dd}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.5}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .title{color:#9ca3af}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .desc{color:#d1d5dd}.day-select{width:70px!important;padding-left:10px!important;padding-right:25px!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='black' class='bi bi-caret-down-fill' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592c.86 0 1.319 1.013.753 1.658l-4.796 5.482a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 8px center!important;background-size:12px!important;border-radius:6px!important}.switch{position:relative;display:inline-block;width:44px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ddd;transition:.3s;border-radius:22px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}input:checked+.slider{background-color:#4c9aff}input:checked+.slider:before{transform:translate(21px)}.switch.disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.switch.disabled .slider{cursor:not-allowed;background-color:#e5e7eb}.switch.disabled input:checked+.slider{background-color:#7dd3fc}.accuracy-select{width:90px!important;border-radius:6px!important;padding-left:10px!important;padding-right:25px!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='black' class='bi bi-caret-down-fill' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592c.86 0 1.319 1.013.753 1.658l-4.796 5.482a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E\")!important;background-position:right 10px center!important;background-repeat:no-repeat!important;background-size:12px!important}.limitation-grid{margin-top:.5rem}.limitation-item{flex:0 0 220px;min-width:180px;background:#fff;border:1px solid #e6e9ef;border-radius:10px;padding:12px;display:flex;flex-direction:column;gap:8px;box-shadow:0 1px 2px #10182808}.limitation-item label{margin:0;font-weight:600;color:#111827}.limitation-select{width:100%;border-radius:8px;padding-left:10px!important;padding-right:25px!important;height:38px;background-color:#fff}.category-grid{display:flex;flex-wrap:wrap;gap:12px}.category-card{min-width:180px;position:relative}.category-card-header{display:flex;align-items:center}.category-icon{width:32px;height:32px;min-width:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.category-name{font-weight:500;color:#101828;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-percentage-section{width:100%}.category-percentage-section .ff-select-wrapper.compact{width:100%;min-width:auto}.category-percentage-section .ff-select-toggle.small{width:100%;min-height:36px;padding:6px 10px;font-size:13px}.category-menu-btn{border:none;background:transparent;padding:4px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px;display:inline-flex;align-items:center;justify-content:center}.category-menu-btn:disabled{cursor:default}.category-menu{position:absolute;top:48px;right:16px;background:#fff;border:1px solid #e4e7ec;border-radius:10px;box-shadow:0 12px 30px #0f172a26;min-width:140px;z-index:5;padding:4px}.category-menu button{width:100%;text-align:left;background:transparent;border:none;padding:8px 10px;border-radius:8px;font-size:13px;color:#101828}.category-menu button:hover{background:#f4f7fb}.limit-label{font-size:12px;text-transform:uppercase;letter-spacing:.04em}.alert-soft-primary{background:#eff4ff;border:1px solid #d6e2ff;border-radius:10px;padding:10px 14px;font-size:13px;color:#004aad}.badge-dot{width:8px;height:8px;border-radius:999px;background:#004aad;display:inline-block}.icon-picker{display:flex;gap:12px;flex-wrap:wrap}.icon-pill{width:56px;height:56px;border-radius:12px;border:1px solid #e4e7ec;background:#fff;display:inline-flex;align-items:center;justify-content:center;transition:all .2s ease}.icon-pill.active{border-color:#004aad;box-shadow:0 0 0 4px #004aad1f}.icon-pill:hover{border-color:#c7d7fd}.tag-blue,.blueTag{color:#004aad}.tag-purple,.purpleTag{color:#7c3aed}.tag-orange,.orangeTag{color:#ea580c}.category-modal-body .form-control,.category-modal-body .form-select{border-radius:10px;min-height:44px}.category-modal-body .form-label{font-size:13px}.category-modal-body .text-danger{font-size:12px}.card .btn-outline.btn-sm{padding:6px 10px;border-radius:8px}.add-new-btn{background:#fff;border:1px solid #d0d5dd;border-radius:10px;padding:5px 13px;font-size:14px;font-weight:600;color:#101828;transition:all .2s ease;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:0 1px 2px #1018280d}.add-new-btn:hover:not(:disabled){background:#f9fafb;border-color:#004aad;color:#004aad;box-shadow:0 2px 4px #10182814}.add-new-btn:active:not(:disabled){background:#f4f7fb;transform:translateY(1px);box-shadow:0 1px 2px #1018280d}.add-new-btn:disabled{opacity:.6;cursor:not-allowed;background:#f9fafb;border-color:#e5e7eb;color:#9ca3af}.add-new-btn svg{transition:transform .2s ease;flex-shrink:0}.add-new-btn:hover:not(:disabled) svg{transform:rotate(90deg)}.info-icon{display:inline-flex;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;border-radius:50%;background:#f3f3f3;color:#555;cursor:pointer;margin-left:6px;border:1.5px solid #8a8a8a}.store-requests-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.reset-btn{border-width:1px;border-color:#d0d5dd;color:#004aad;font-weight:600;padding:6px 18px;background-color:#fff;transition:all .2s ease}.reset-btn svg path{stroke:currentColor}.reset-btn .spinner-border{color:#004aad}.reset-btn:disabled{opacity:.6;cursor:not-allowed}.reset-btn:not(:disabled):hover{background-color:#f4f7fb;border-color:#004aad;box-shadow:0 1px 2px #1018280f}.restriction-criteria{padding:16px 0;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb}.restriction-select{min-width:140px;padding-left:10px!important;padding-right:30px!important;border-radius:6px!important;border:1px solid #d1d5db;font-size:14px;height:36px;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='black' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592c.86 0 1.319 1.013.753 1.658l-4.796 5.482a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:12px!important}.restriction-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.select-all-row{padding:8px 0}.custom-checkbox-select{position:relative;display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-checkbox-select input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:0;height:0}.checkmark-select{height:18px;width:18px;border:2px solid #d0d5dd;border-radius:4px;display:inline-block;transition:all .2s ease;position:relative}.custom-checkbox-select input:checked~.checkmark-select{background-color:#2563eb;border-color:#2563eb}.custom-checkbox-select input:checked~.checkmark-select:after{content:\"\";position:absolute;left:5px;top:2px;width:4px;height:8px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.dropdown-arrow{cursor:pointer;transition:transform .2s}.dropdown-arrow:hover{transform:translateY(2px)}.store-requests-table{margin-top:16px;position:relative}.store-requests-table.disabled{pointer-events:none;opacity:.6;-webkit-user-select:none;user-select:none}.store-requests-table-content{border-collapse:separate;border-spacing:0;width:100%}.store-requests-table-content thead{background-color:#f9fafb}.store-requests-table-content thead th{padding:12px 16px;font-weight:600;font-size:13px;color:#344054;text-align:left;border-bottom:1px solid #e5e7eb;white-space:nowrap;background-color:#f9fafb;vertical-align:top}.store-requests-table-content tbody td{padding:12px 16px;font-size:14px;color:#101828;border-bottom:1px solid #f2f4f7}.store-requests-table-content tbody tr:hover{background-color:#f9fafb}.store-requests-table-content tbody tr:last-child td{border-bottom:none}.store-table-scroll{max-height:360px;overflow-y:auto}.store-table-scroll table{margin-bottom:0}.store-table-scroll .store-requests-table-content thead th{position:sticky;top:0;z-index:2}.checkbox-column{width:110px;padding-left:16px!important}.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.sortable:hover{background-color:#f3f4f6}.sort-icon{opacity:.6;transition:opacity .2s}.sortable:hover .sort-icon{opacity:1}.store-name-column{min-width:260px}.store-name-column .column-header{justify-content:space-between}.store-name-column .select-all-row{padding-top:8px;margin-top:8px;border-top:1px solid #e5e7eb}.empty-store-state{border:1px solid #e5e7eb;border-radius:12px;padding:40px 16px;background:#f9fbff;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-store-icon{display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;background:#2e90fa1f}.store-days-select .ff-select-toggle{min-width:99px}.store-days-select .ff-select-toggle span{white-space:nowrap}.custom-modal{border-radius:16px;padding:10px 20px 20px;background:#fff;box-shadow:0 10px 40px #00000014;width:500px}.field-label{color:#8b8b8b;font-size:14px;margin-bottom:4px;display:block}.input-box{width:100%;height:46px;border:1px solid #e5e7eb;border-radius:10px;padding:0 14px;font-size:15px;background:#f8fafc;display:flex;align-items:center}.input-box:focus-within{border-color:#4daeff;background:#fff;box-shadow:0 0 0 2px #4daeff26}.icon-row{display:flex}.icon-box{width:60px;cursor:pointer;justify-content:space-between}.tag-icon{width:18px;height:18px;background-image:url(\"data:image/svg+xml,<svg ... />\");background-size:contain}.arrow-down{width:12px;height:12px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg)}.clean-select{border:none;width:100%;height:100%;background:transparent;font-size:15px;outline:none}.select-box{padding:0}.button-area{display:flex;justify-content:space-between;gap:15px}.btn-cancel{width:50%;height:46px;border-radius:10px;border:1px solid #dbdbdb;background:#fff;font-weight:500;cursor:pointer}.btn-create{width:50%;height:46px;border-radius:10px;border:none;background:#0094ff;color:#fff;font-weight:600;cursor:pointer}.btn-create:hover{background:#007bdb}.ff-select-wrapper{width:100%;position:relative}.ff-select-wrapper.compact{width:auto;min-width:80px}.ff-select-wrapper.disabled{pointer-events:none;opacity:.7}.ff-select-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid #d0d5dd;border-radius:10px;padding:8px 12px;background:#fff;font-weight:600;color:#101828;min-height:40px}.ff-select-toggle.small{min-height:36px;padding:6px 10px;font-size:13px}.ff-select-toggle svg{transition:transform .2s ease}.ff-select-wrapper.open .ff-select-toggle svg{transform:rotate(180deg)}.ff-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid #e4e7ec;border-radius:12px;box-shadow:0 16px 40px #0f172a26;max-height:220px;overflow-y:auto;z-index:15;padding:4px}.ff-select-option{width:100%;text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:8px;font-size:14px;color:#101828}.ff-select-option:hover{background:#f4f7fb}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TitleCasePipe, name: "titlecase" }] });
833
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FootfallConfigurationComponent, selector: "lib-footfall-configuration", host: { listeners: { "document:click": "closeMenus()" } }, viewQueries: [{ propertyName: "categoryModalTpl", first: true, predicate: ["categoryModal"], descendants: true }, { propertyName: "deleteCategoryModalTpl", first: true, predicate: ["deleteCategoryModal"], descendants: true }, { propertyName: "resetConfirmationModalTpl", first: true, predicate: ["resetConfirmationModal"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"footfallDirConfigurationForm\" class=\"container-fluid\">\r\n <ng-container *ngIf=\"(gs.userAccess | async)?.Global_Configuration_isEdit\">\r\n <div *ngIf=\"isEdit\" class=\"col-12 mb-5\">\r\n <!-- *ngIf=\"(gs.userAccess | async)?.userType === 'tango' || footfallDirConfigurationForm.get('footfallDirectoryConfigs')?.value === true\"> -->\r\n <div class=\" d-flex justify-content-end\">\r\n <button (click)=\"toggleForm();\" type=\"button\" class=\"btn btn-outline align-items-end\"><span\r\n class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_2579_25125)\">\r\n <path\r\n d=\"M14.167 2.49993C14.3859 2.28106 14.6457 2.10744 14.9317 1.98899C15.2176 1.87054 15.5241 1.80957 15.8337 1.80957C16.1432 1.80957 16.4497 1.87054 16.7357 1.98899C17.0216 2.10744 17.2815 2.28106 17.5003 2.49993C17.7192 2.7188 17.8928 2.97863 18.0113 3.2646C18.1297 3.55057 18.1907 3.85706 18.1907 4.16659C18.1907 4.47612 18.1297 4.78262 18.0113 5.06859C17.8928 5.35455 17.7192 5.61439 17.5003 5.83326L6.25033 17.0833L1.66699 18.3333L2.91699 13.7499L14.167 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2579_25125\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>Edit Details</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Approver Configuration -->\r\n <!-- <div class=\"row\">\r\n <div class=\"card p-3 mb-3\">\r\n <h5>Approver Configuration</h5>\r\n <ng-container>\r\n <div class=\"sub-text\">Set level of revision required for a store raised tickets</div>\r\n </ng-container>\r\n <div formArrayName=\"revision\" class=\"d-flex gap-4\">\r\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\" class=\"form-check\">\r\n <input type=\"checkbox\" formControlName=\"isChecked\" class=\"form-check-input\" [id]=\"'action-' + i\">\r\n <label class=\"form-check-label\" [for]=\"'action-' + i\">\r\n {{ rev.get('actionType')?.value | titlecase }}\r\n </label>\r\n <ng-container>\r\n <div *ngIf=\"rev.get('actionType')?.value == 'reviewer'\" class=\"sub-text\">The Ticket undergoes a single review to verify footfall</div>\r\n <div *ngIf=\"rev.get('actionType')?.value == 'approver'\" class=\"sub-text\">The Ticket undergoes a final review after the initial check</div>\r\n <div *ngIf=\"rev.get('actionType')?.value == 'tango'\" class=\"sub-text\">Finalize ticket and update footfall count</div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Approver Configuration -->\r\n <div class=\"card p-4 mb-4 approver-section\">\r\n <h5 class=\"mb-1 fw-semibold\">Approver configuration</h5>\r\n <p class=\"mb-4 small\">\r\n Set level of revisions required for a store raised tickets\r\n </p>\r\n\r\n <div formArrayName=\"revision\" class=\"d-flex flex-wrap gap-5\">\r\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"approver-option d-flex flex-column\"\r\n [class.disabled-option]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n\r\n <label class=\"custom-checkbox align-items-start\"\r\n [class.disabled-checkbox]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n <input type=\"checkbox\" formControlName=\"isChecked\" [id]=\"'action-' + i\" />\r\n <span class=\"checkmark\"></span>\r\n <div class=\"label-text\">\r\n <div class=\"title\">\r\n {{ rev.get('actionType')?.value | titlecase }}\r\n </div>\r\n <div class=\"desc text-muted\">\r\n <ng-container [ngSwitch]=\"rev.get('actionType')?.value\">\r\n <span *ngSwitchCase=\"'reviewer'\">The ticket undergoes a single review to verify\r\n footfall.</span>\r\n <span *ngSwitchCase=\"'approver'\">The ticket undergoes a final review after the initial\r\n check.</span>\r\n <span *ngSwitchCase=\"'tango'\">Finalize tickets and update footfall count.</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </label>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <hr class=\"ms-4 me-4\">\r\n\r\n <!-- Store SPOC Ticket Creation -->\r\n <div class=\"row\">\r\n <!-- <div class=\"card p-3 mb-3\">\r\n <h5>Store SPOC Ticket Creation</h5>\r\n <label>Allow Store SPOC to create tickets only for last</label>\r\n <input type=\"number\" min=\"1\" max=\"3\" class=\"form-control w-25 d-inline mx-2\" formControlName=\"allowTicketCreation\"> Days\r\n </div> -->\r\n <div class=\"card p-3 mb-3\">\r\n <h5 class=\"fw-bold mb-3\">Store SPOC Ticket Creation</h5>\r\n\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n\r\n <label class=\"mb-0\">\r\n Allow store SPOC to create tickets only for the last\r\n </label>\r\n\r\n <!-- Number dropdown -->\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\"\r\n [class.open]=\"isAllowTicketCreationDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleAllowTicketCreationDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('allowTicketCreation')?.value ||\r\n spocTicketCreationdays[0] }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAllowTicketCreationDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of spocTicketCreationdays\"\r\n (click)=\"selectAllowTicketCreation($event, day)\">\r\n {{ day }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <span class=\"mb-0\">Days</span>\r\n </div>\r\n </div>\r\n </div>\r\n <hr class=\"ms-4 me-4\">\r\n\r\n <div class=\"row\">\r\n <!-- Ticket Auto-close -->\r\n <!-- <div class=\"card p-3 mb-3\">\r\n <h5>Ticket Auto-close</h5>\r\n <div class=\"form-check form-switch mb-2\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"autoClose\" formControlName=\"isAutoCloseEnable\">\r\n <label class=\"form-check-label\" for=\"autoClose\">Enable Auto-close</label>\r\n </div>\r\n <div>\r\n <label>Auto-close Accuracy</label>\r\n <select formControlName=\"autoCloseAccuracy\" class=\"form-select w-25\">\r\n <option *ngFor=\"let val of ['85%', '90%', '95%', '100%']\" [value]=\"val\">{{ val }}</option>\r\n </select>\r\n </div>\r\n </div> -->\r\n\r\n <div class=\"card p-3 mb-3\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <h5 class=\"fw-bold m-0\">Ticket Auto-close</h5>\r\n\r\n <!-- Toggle Switch -->\r\n <label class=\"switch m-0 ms-3\" [class.disabled]=\"isEdit\">\r\n <input type=\"checkbox\" formControlName=\"isAutoCloseEnable\" [disabled]=\"isEdit\">\r\n <span class=\"slider round\"></span>\r\n </label>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center mt-2\">\r\n <span class=\"mb-0\">\r\n Ticket should be auto-closed, if the created ticket accuracy is greater than or equal to\r\n </span>\r\n\r\n <!-- Accuracy dropdown -->\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\" [class.open]=\"isAutoCloseDropdownOpen\"\r\n [class.disabled]=\"isEdit || !footfallDirConfigurationForm.get('isAutoCloseEnable')?.value\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleAutoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('autoCloseAccuracy')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAutoCloseDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of accuracyPercentageList\"\r\n (click)=\"selectAutoCloseAccuracy($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <hr class=\"ms-4 me-4\">\r\n\r\n <!-- Tagging Limitations -->\r\n <div class=\"row\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n <div class=\"card p-4 mb-4\">\r\n <!-- Footfall directory limitations start -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n <div>\r\n <h5 class=\"fw-semibold m-0\">Footfall directory limitations</h5>\r\n <p class=\"small mb-2\">\r\n Set maximum limitation for stores to tag non-Purchasers from Total Footfall\r\n </p>\r\n </div>\r\n\r\n <button type=\"button\" [disabled]=\"isEdit\" class=\"add-new-btn d-inline-flex align-items-center gap-2\"\r\n (click)=\"openCategoryModal('add')\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3.33334V12.6667M3.33334 8H12.6667\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>Add New</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Footfall directory limitations category part -->\r\n <div formArrayName=\"taggingLimitation\" class=\"category-grid mt-3\">\r\n <div *ngFor=\"let tag of tagLimits.controls; let i = index\" [formGroupName]=\"i\" class=\"category-card\">\r\n <!-- Top Section: Icon and Name -->\r\n <div class=\"category-card-header\">\r\n <!-- <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\"> -->\r\n <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\">\r\n <ng-container [ngSwitch]=\"tag.get('iconName')?.value\">\r\n <!-- Duplicate Tag SVG - Two overlapping squares -->\r\n <svg *ngSwitchCase=\"'duplicateTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1162_24621)\">\r\n <path\r\n d=\"M2.5 7.5H2C1.73478 7.5 1.48043 7.39464 1.29289 7.20711C1.10536 7.01957 1 6.76522 1 6.5V2C1 1.73478 1.10536 1.48043 1.29289 1.29289C1.48043 1.10536 1.73478 1 2 1H6.5C6.76522 1 7.01957 1.10536 7.20711 1.29289C7.39464 1.48043 7.5 1.73478 7.5 2V2.5M5.5 4.5H10C10.5523 4.5 11 4.94772 11 5.5V10C11 10.5523 10.5523 11 10 11H5.5C4.94772 11 4.5 10.5523 4.5 10V5.5C4.5 4.94772 4.94772 4.5 5.5 4.5Z\"\r\n stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24621\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <!-- Employee Tag SVG - Two people, one in front of the other -->\r\n <svg *ngSwitchCase=\"'employeeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\r\n <path\r\n d=\"M11.1667 12.5V11.1667C11.1667 10.4594 10.8857 9.78115 10.3856 9.28105C9.88552 8.78095 9.20724 8.5 8.5 8.5H3.16667C2.45942 8.5 1.78115 8.78095 1.28105 9.28105C0.780952 9.78115 0.5 10.4594 0.5 11.1667V12.5M15.1667 12.5V11.1667C15.1662 10.5758 14.9696 10.0018 14.6076 9.53488C14.2456 9.06791 13.7388 8.73438 13.1667 8.58667M10.5 0.586667C11.0736 0.733534 11.582 1.06713 11.9451 1.53487C12.3082 2.00261 12.5052 2.57789 12.5052 3.17C12.5052 3.76211 12.3082 4.33739 11.9451 4.80513C11.582 5.27287 11.0736 5.60647 10.5 5.75333M8.5 3.16667C8.5 4.63943 7.30609 5.83333 5.83333 5.83333C4.36057 5.83333 3.16667 4.63943 3.16667 3.16667C3.16667 1.69391 4.36057 0.5 5.83333 0.5C7.30609 0.5 8.5 1.69391 8.5 3.16667Z\"\r\n stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <!-- House Keeping Tag SVG - House with broom -->\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"#344054\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <!-- Junk Tag SVG - Trash can -->\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n\r\n <!-- Purple Tag SVG -->\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <!-- Orange Tag SVG -->\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <!-- Blue Tag SVG -->\r\n <!-- <svg *ngSwitchCase=\"'blueTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg> -->\r\n\r\n <!-- Default Tag SVG (fallback) -->\r\n <!-- <svg *ngSwitchDefault xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg> -->\r\n </ng-container>\r\n </div>\r\n <div class=\"category-name\">\r\n {{ tag.get('name')?.value }}\r\n </div>\r\n <!-- Menu Button (only for houseKeepingTag and junkTag) -->\r\n <button\r\n *ngIf=\"(tag.get('iconName')?.value !== 'duplicateTag' && tag.get('iconName')?.value !== 'employeeTag')\"\r\n type=\"button\" class=\"category-menu-btn\" (click)=\"toggleCategoryMenu($event, i)\"\r\n [disabled]=\"isEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\"\r\n viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 21C12.5523 21 13 20.5523 13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20C11 20.5523 11.4477 21 12 21Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n </button>\r\n <div class=\"category-menu\" *ngIf=\"activeMenuIndex === i\">\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'edit', i)\">Edit Name</button>\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'delete', i)\">Delete</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Bottom Section: Percentage Dropdown -->\r\n <div class=\"category-percentage-section\">\r\n <div class=\"position-relative ff-select-wrapper compact\"\r\n [class.open]=\"openLimitDropdownIndex === i\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleLimitDropdown($event, i)\">\r\n <span>{{ tag.get('value')?.value || 0 }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"openLimitDropdownIndex === i\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectLimitValue($event, i, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"mt-3\" *ngIf=\"isCategoryLimitReached\">\r\n <div class=\"alert alert-soft-primary d-flex align-items-center gap-2 mb-0\">\r\n <span class=\"badge-dot\"></span>\r\n <span>Maximum category creation limit reached.</span>\r\n </div>\r\n </div> -->\r\n <!-- Footfall directory limitations end -->\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ms-4 me-4\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n \r\n <div formGroupName=\"accuracyBreach\" class=\"card p-4 mb-3 store-requests-section\">\r\n <!-- store request Header Section -->\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div>\r\n <h5 class=\"fw-semibold mb-2\">Store Requests</h5>\r\n <p class=\"small mb-0 text-muted\">\r\n Below stores have requested to raise a ticket after breaching the configured limit\r\n <span class=\"info-icon\">i</span>\r\n </p>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-primary reset-btn d-inline-flex align-items-center gap-2\"\r\n *ngIf=\"!isEdit\" [disabled]=\"isResetDisabled\" (click)=\"openResetConfirmationModal()\" aria-live=\"polite\">\r\n <span>Reset</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Restriction Criteria Section -->\r\n <div class=\"restriction-criteria mb-4\">\r\n <label class=\"mb-3 d-block\">\r\n Restrict ticket creation for any store that:\r\n </label>\r\n <div class=\"d-flex align-items-center flex-nowrap gap-2\">\r\n <!-- Ticket Count Dropdown -->\r\n <span>Has raised more than</span>\r\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isTicketCountDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleTicketCountDropdown($event)\">\r\n <span>\r\n {{ footfallDirConfigurationForm.get('accuracyBreach.ticketCount')?.value || 1 }}\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isTicketCountDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let c of [1, 2, 3, 4, 5]\"\r\n (click)=\"selectTicketCount($event, c)\">\r\n {{ c }}\r\n </button>\r\n </div>\r\n </div>\r\n <span>tickets in the calender</span>\r\n <!-- Days Dropdown (Month=30, Week=7) -->\r\n <div class=\"position-relative ff-select-wrapper compact store-days-select\"\r\n [class.open]=\"isStoreDaysDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreDaysDropdown($event)\">\r\n <span>{{ selectedDaysLabel }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isStoreDaysDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let opt of daysOptions\"\r\n (click)=\"selectStoreDays($event, opt)\">\r\n {{ opt.label }}\r\n </button>\r\n </div>\r\n </div>\r\n <span class=\"bold\" style=\"font-weight: 500;\">AND</span>\r\n <span>has footfall accuracy</span>\r\n <!-- Accuracy Dropdown -->\r\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isStoreAccuracyDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreAccuracyDropdown($event)\">\r\n <span>\r\n >={{ footfallDirConfigurationForm.get('accuracyBreach.accuracy')?.value || '95%' }}\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isStoreAccuracyDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of [95, 96, 97, 98, 99]\"\r\n (click)=\"selectStoreAccuracy($event, p)\">\r\n >={{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Requests Table -->\r\n <div class=\"store-requests-table\" [class.disabled]=\"isEdit\"\r\n *ngIf=\"storeList?.length > 0; else emptyStoreRequests\">\r\n <div class=\"table-responsive\" [ngClass]=\"{'store-table-scroll': storeList?.length > 5}\">\r\n <table class=\"table table-hover store-requests-table-content\">\r\n <thead>\r\n <tr>\r\n <th class=\"checkbox-column\"></th>\r\n <th class=\"sortable store-name-column\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input type=\"checkbox\" [checked]=\"isAllSelected\" [disabled]=\"isEdit\"\r\n (change)=\"toggleSelectAll($event)\" />\r\n <span class=\"checkmark-select\"></span>\r\n <span class=\"ms-2\">Select all stores ({{ storeList?.length || 0\r\n }})</span>\r\n </label>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" class=\"ms-2 dropdown-arrow\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th class=\"sortable\">\r\n Raised on\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n Last raised(Approved)\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n No of Time Raised\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let store of storeList\">\r\n <td class=\"checkbox-column\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input #cb type=\"checkbox\" [checked]=\"isStoreSelected(store)\" [disabled]=\"isEdit\"\r\n (change)=\"toggleStoreSelection(store, cb.checked)\" />\r\n <span class=\"checkmark-select\"></span>\r\n </label>\r\n </td>\r\n <td>{{ store.storeName }}</td>\r\n <td>{{ store.raisedOn }}</td>\r\n <td>{{ store.lastApproved || '-' }}</td>\r\n <td>{{ store.totalRaised }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <ng-template #emptyStoreRequests>\r\n <div class=\"empty-store-state text-center\">\r\n <div class=\"empty-store-icon mb-3\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.94629 21.1995C8.645 21.2313 8.33828 21.2502 8.02734 21.2502C7.85782 21.2502 7.69052 21.2434 7.52539 21.2336V31.6067C7.52539 33.0347 8.70837 34.2258 10.1963 34.2258H29.8008C31.2888 34.2258 32.4717 33.0347 32.4717 31.6067V21.2346C32.3098 21.2438 32.1459 21.2502 31.9814 21.2502C31.6675 21.2502 31.3569 21.2323 31.0508 21.1995V28.9875H8.94629V21.1995ZM30.9277 5.77368H9.06934C8.89197 5.77368 8.73671 5.86647 8.65918 5.98755L8.65723 5.9895L5.14746 11.4729L5.05273 11.6204C3.82719 13.7402 5.0918 16.4671 7.44336 16.7766C7.64428 16.8011 7.83403 16.8157 8.02148 16.8157C9.25156 16.8157 10.3395 16.287 11.0967 15.4651L12.0186 14.4641L12.9375 15.468C13.6864 16.2861 14.7731 16.8157 16.0107 16.8157C17.2428 16.8156 18.3347 16.2854 19.083 15.468L20.0049 14.4612L20.9268 15.468C21.6751 16.2855 22.7668 16.8157 23.999 16.8157C25.2312 16.8157 26.3229 16.2854 27.0713 15.468L27.9932 14.4612L28.915 15.468C29.6634 16.2855 30.756 16.8157 31.9883 16.8157C32.1697 16.8157 32.3648 16.8018 32.5645 16.7776H32.5635C34.9572 16.4571 36.2254 13.6075 34.8574 11.4729L34.8564 11.4739L31.3398 5.99048L31.3389 5.98755C31.2614 5.86628 31.1053 5.77368 30.9277 5.77368Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <p class=\"mb-0 fw-semibold text-muted\">No reset request from store</p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <hr class=\"ms-4 me-4\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n <!-- Tango Review -->\r\n <!-- <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-3 mb-3\">\r\n <label>Send Ticket to Tango if accuracy falls below</label>\r\n <input type=\"text\" class=\"form-control w-25\" formControlName=\"tangoReview\">\r\n </div> -->\r\n <div class=\"row\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n <div class=\"card p-4 mb-4 tango-review-card\">\r\n <div class=\"d-flex align-items-center gap-2 mb-1\">\r\n <h5 class=\"fw-bold m-0\">Send Ticket to Tango</h5>\r\n </div>\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"me-2 mb-0 tango-label\">Send ticket to Tango if accuracy falls below</label>\r\n <div class=\"position-relative ff-select-wrapper compact ms-0\" [class.open]=\"issendTangoDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleSendTangoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('tangoReview')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"issendTangoDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of sendTicketTango\"\r\n (click)=\"selectSendTicketTango($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!isEdit\">\r\n <div class=\"mb-5 w-100 footer-seperator\"></div>\r\n <div class=\"d-flex justify-content-end\">\r\n <a type=\"button\" class=\"btn btn-outline mt-1 me-4\" (click)=\"onCancel()\">Cancel</a>\r\n <a type=\"submit\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\"><span>Save Changes</span></a>\r\n </div>\r\n </div>\r\n\r\n <!-- Category Modal -->\r\n <ng-template #categoryModal>\r\n <div class=\"modal-header border-0 pb-0\">\r\n <h5 class=\"modal-title\">\r\n {{ categoryModalMode === 'add' ? 'Add New Category' : 'Edit Category' }}\r\n </h5>\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"closeCategoryModal()\"></button>\r\n </div>\r\n <div class=\"modal-body category-modal-body\">\r\n <form [formGroup]=\"categoryForm\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Icon</label>\r\n <div class=\"ff-select-wrapper icon-select\" [class.open]=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryIconDropdown($event)\">\r\n <span class=\"d-inline-flex align-items-center gap-2\">\r\n <span class=\"category-icon\"\r\n [ngClass]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <ng-container [ngSwitch]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <!-- Blue Tag SVG -->\r\n <!-- <svg *ngSwitchCase=\"'blueTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> -->\r\n <!-- Purple Tag SVG -->\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- Orange Tag SVG -->\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- House Keeping Tag SVG -->\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_icon_housekeeping)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_icon_housekeeping\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <!-- Junk Tag SVG -->\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span class=\"icon-label\">{{ selectedCategoryIconLabel }}</span>\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option d-flex align-items-center gap-2\"\r\n *ngFor=\"let icon of categoryIcons\"\r\n (click)=\"selectCategoryIconFromDropdown($event, icon.value)\">\r\n <span class=\"category-icon\" [ngClass]=\"icon.value\">\r\n <ng-container [ngSwitch]=\"icon.value\">\r\n <!-- Blue Tag SVG -->\r\n <!-- <svg *ngSwitchCase=\"'blueTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> -->\r\n <!-- Purple Tag SVG -->\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- Orange Tag SVG -->\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- House Keeping Tag SVG -->\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"#344054\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <!-- Junk Tag SVG -->\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span>{{ icon.label }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Category Name</label>\r\n <input type=\"text\" class=\"form-control\" \r\n [class.is-invalid]=\"categoryForm.get('name')?.invalid && categoryForm.get('name')?.touched\"\r\n placeholder=\"Enter your new category\"\r\n formControlName=\"name\" />\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('required') && categoryForm.get('name')?.touched\">\r\n Category name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('duplicate') && categoryForm.get('name')?.touched\">\r\n Category name already exists.\r\n </small>\r\n </div>\r\n\r\n <div class=\"mb-2\">\r\n <label class=\"form-label text-muted\">Limitation</label>\r\n <div class=\"ff-select-wrapper\" [class.open]=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryLimitDropdown($event)\">\r\n <span>{{ categoryForm.get('limit')?.value || percentageList[0] }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectCategoryLimitValue($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"modal-footer border-0 pt-0\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeCategoryModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"submitCategoryForm()\">\r\n {{ categoryModalMode === 'add' ? 'Create' : 'Save' }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Delete Confirmation Modal -->\r\n <ng-template #deleteCategoryModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Confirmation</h5>\r\n <p class=\"mb-4 text-muted\">\r\n You're about to delete <span class=\"fw-semibold\">{{ categoryPendingDeleteName }}</span> category.\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeDeleteModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger\" (click)=\"confirmDeleteCategory()\">Delete</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Reset Store Requests Confirmation Modal -->\r\n <ng-template #resetConfirmationModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Reset Store Requests</h5>\r\n <p class=\"mb-4 text-muted\">\r\n Are you sure you want to proceed with resetting the selected <span class=\"fw-semibold\">{{\r\n resetRequest.arrayOfStores.length }}</span> store(s) requests?\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeResetModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"confirmResetStoreRequest()\">Reset</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n</form>", styles: [".tango-review-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 8px 30px #0f172a14}.tango-icon{width:28px;height:28px;border-radius:50%;background:#2e90fa26;display:inline-flex;align-items:center;justify-content:center}.tango-label{font-size:13px;color:#475467;font-weight:500}form{background:#fff;padding:32px 40px;border-radius:16px;box-shadow:0 2px 12px #0000000d;font-family:Inter,Segoe UI,sans-serif}.section-divider{border-bottom:1px solid #e4e7ec;margin:40px 0}.sub-header{font-size:16px;font-weight:600;color:#111827;margin-bottom:6px}.sub-text{font-size:13px;color:#6b7280;margin-bottom:12px}.form-check{display:flex;align-items:center;gap:10px}.form-check-input{width:42px;height:22px;cursor:pointer;accent-color:#2563eb;border:1px solid #d1d5db;transition:all .2s ease-in-out}.form-check-input:checked{background-color:#2563eb;border-color:#2563eb}.form-check-input:disabled{opacity:.6;cursor:not-allowed}.toggle-label{font-size:13px;font-weight:500;color:#374151}input[type=radio].form-check-input{width:16px;height:16px;accent-color:#2563eb}input[type=radio]:checked{border-color:#2563eb}select.form-select{border:1px solid #d1d5db;border-radius:8px;height:38px;font-size:14px;color:#374151;padding:6px 10px;outline:none;transition:.2s}select.form-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.btn-outline{background-color:#fff;border:1px solid #d1d5db;color:#374151;padding:6px 16px;border-radius:8px;transition:all .2s}.btn-outline:hover{background:#f9fafb}.btn-primary{background-color:#2563eb;border:none;color:#fff;border-radius:8px;padding:6px 16px;transition:.2s}.btn-primary:hover{background-color:#1e40af}.col-lg-3,.col-xl-3,.col-xxl-3{margin-bottom:20px}.approver-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.approver-option{display:flex;flex-direction:column;justify-content:flex-start;width:220px}.custom-checkbox{position:relative;display:flex;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.custom-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer}.custom-checkbox .checkmark{height:20px;width:20px;border:2px solid #d0d5dd;border-radius:6px;display:inline-block;transition:all .2s ease}.custom-checkbox input:checked~.checkmark{background-color:#004aad;border-color:#004aad}.custom-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.label-text{display:flex;flex-direction:column}.label-text .title{font-weight:600;color:#101828}.label-text .desc{font-size:13px;color:#667085;margin-top:2px;max-width:190px;line-height:1.4}.custom-checkbox input:not(:checked)~.label-text .desc{opacity:.6}.approver-option.disabled-option{opacity:.6;pointer-events:none}.approver-option.disabled-option .custom-checkbox.disabled-checkbox{cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .checkmark{background-color:#f3f4f6;border-color:#d1d5dd;cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark{background-color:#f3f4f6;border-color:#d1d5dd}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.5}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .title{color:#9ca3af}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .desc{color:#d1d5dd}.day-select{width:70px!important;padding-left:10px!important;padding-right:25px!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='black' class='bi bi-caret-down-fill' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592c.86 0 1.319 1.013.753 1.658l-4.796 5.482a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 8px center!important;background-size:12px!important;border-radius:6px!important}.switch{position:relative;display:inline-block;width:44px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ddd;transition:.3s;border-radius:22px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}input:checked+.slider{background-color:#4c9aff}input:checked+.slider:before{transform:translate(21px)}.switch.disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.switch.disabled .slider{cursor:not-allowed;background-color:#e5e7eb}.switch.disabled input:checked+.slider{background-color:#7dd3fc}.accuracy-select{width:90px!important;border-radius:6px!important;padding-left:10px!important;padding-right:25px!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='black' class='bi bi-caret-down-fill' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592c.86 0 1.319 1.013.753 1.658l-4.796 5.482a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E\")!important;background-position:right 10px center!important;background-repeat:no-repeat!important;background-size:12px!important}.limitation-grid{margin-top:.5rem}.limitation-item{flex:0 0 220px;min-width:180px;background:#fff;border:1px solid #e6e9ef;border-radius:10px;padding:12px;display:flex;flex-direction:column;gap:8px;box-shadow:0 1px 2px #10182808}.limitation-item label{margin:0;font-weight:600;color:#111827}.limitation-select{width:100%;border-radius:8px;padding-left:10px!important;padding-right:25px!important;height:38px;background-color:#fff}.category-grid{display:flex;flex-wrap:wrap;gap:12px}.category-card{min-width:180px;position:relative}.category-card-header{display:flex;align-items:center}.category-icon{width:32px;height:32px;min-width:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.category-name{font-weight:500;color:#101828;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-percentage-section{width:100%}.category-percentage-section .ff-select-wrapper.compact{width:100%;min-width:auto}.category-percentage-section .ff-select-toggle.small{width:100%;min-height:36px;padding:6px 10px;font-size:13px}.category-menu-btn{border:none;background:transparent;padding:4px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px;display:inline-flex;align-items:center;justify-content:center}.category-menu-btn:disabled{cursor:default}.category-menu{position:absolute;top:48px;right:16px;background:#fff;border:1px solid #e4e7ec;border-radius:10px;box-shadow:0 12px 30px #0f172a26;min-width:140px;z-index:5;padding:4px}.category-menu button{width:100%;text-align:left;background:transparent;border:none;padding:8px 10px;border-radius:8px;font-size:13px;color:#101828}.category-menu button:hover{background:#f4f7fb}.limit-label{font-size:12px;text-transform:uppercase;letter-spacing:.04em}.alert-soft-primary{background:#eff4ff;border:1px solid #d6e2ff;border-radius:10px;padding:10px 14px;font-size:13px;color:#004aad}.badge-dot{width:8px;height:8px;border-radius:999px;background:#004aad;display:inline-block}.icon-picker{display:flex;gap:12px;flex-wrap:wrap}.icon-pill{width:56px;height:56px;border-radius:12px;border:1px solid #e4e7ec;background:#fff;display:inline-flex;align-items:center;justify-content:center;transition:all .2s ease}.icon-pill.active{border-color:#004aad;box-shadow:0 0 0 4px #004aad1f}.icon-pill:hover{border-color:#c7d7fd}.tag-blue,.blueTag{color:#004aad}.tag-purple,.purpleTag{color:#7c3aed}.tag-orange,.orangeTag{color:#ea580c}.category-modal-body .form-control,.category-modal-body .form-select{border-radius:10px;min-height:44px}.category-modal-body .form-label{font-size:13px}.category-modal-body .text-danger{font-size:12px}.card .btn-outline.btn-sm{padding:6px 10px;border-radius:8px}.add-new-btn{background:#fff;border:1px solid #d0d5dd;border-radius:10px;padding:5px 13px;font-size:14px;font-weight:600;color:#101828;transition:all .2s ease;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:0 1px 2px #1018280d}.add-new-btn:hover:not(:disabled){background:#f9fafb;border-color:#004aad;color:#004aad;box-shadow:0 2px 4px #10182814}.add-new-btn:active:not(:disabled){background:#f4f7fb;transform:translateY(1px);box-shadow:0 1px 2px #1018280d}.add-new-btn:disabled{opacity:.6;cursor:not-allowed;background:#f9fafb;border-color:#e5e7eb;color:#9ca3af}.add-new-btn svg{transition:transform .2s ease;flex-shrink:0}.add-new-btn:hover:not(:disabled) svg{transform:rotate(90deg)}.info-icon{display:inline-flex;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;border-radius:50%;background:#f3f3f3;color:#555;cursor:pointer;margin-left:6px;border:1.5px solid #8a8a8a}.store-requests-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.reset-btn{border-width:1px;border-color:#d0d5dd;color:#004aad;font-weight:600;padding:6px 18px;background-color:#fff;transition:all .2s ease}.reset-btn svg path{stroke:currentColor}.reset-btn .spinner-border{color:#004aad}.reset-btn:disabled{opacity:.6;cursor:not-allowed}.reset-btn:not(:disabled):hover{background-color:#f4f7fb;border-color:#004aad;box-shadow:0 1px 2px #1018280f}.restriction-criteria{padding:16px 0;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb}.restriction-select{min-width:140px;padding-left:10px!important;padding-right:30px!important;border-radius:6px!important;border:1px solid #d1d5db;font-size:14px;height:36px;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='black' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592c.86 0 1.319 1.013.753 1.658l-4.796 5.482a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:12px!important}.restriction-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.select-all-row{padding:8px 0}.custom-checkbox-select{position:relative;display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-checkbox-select input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:0;height:0}.checkmark-select{height:18px;width:18px;border:2px solid #d0d5dd;border-radius:4px;display:inline-block;transition:all .2s ease;position:relative}.custom-checkbox-select input:checked~.checkmark-select{background-color:#2563eb;border-color:#2563eb}.custom-checkbox-select input:checked~.checkmark-select:after{content:\"\";position:absolute;left:5px;top:2px;width:4px;height:8px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.dropdown-arrow{cursor:pointer;transition:transform .2s}.dropdown-arrow:hover{transform:translateY(2px)}.store-requests-table{margin-top:16px;position:relative}.store-requests-table.disabled{pointer-events:none;opacity:.6;-webkit-user-select:none;user-select:none}.store-requests-table-content{border-collapse:separate;border-spacing:0;width:100%}.store-requests-table-content thead{background-color:#f9fafb}.store-requests-table-content thead th{padding:12px 16px;font-weight:600;font-size:13px;color:#344054;text-align:left;border-bottom:1px solid #e5e7eb;white-space:nowrap;background-color:#f9fafb;vertical-align:top}.store-requests-table-content tbody td{padding:12px 16px;font-size:14px;color:#101828;border-bottom:1px solid #f2f4f7}.store-requests-table-content tbody tr:hover{background-color:#f9fafb}.store-requests-table-content tbody tr:last-child td{border-bottom:none}.store-table-scroll{max-height:360px;overflow-y:auto}.store-table-scroll table{margin-bottom:0}.store-table-scroll .store-requests-table-content thead th{position:sticky;top:0;z-index:2}.checkbox-column{width:110px;padding-left:16px!important}.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.sortable:hover{background-color:#f3f4f6}.sort-icon{opacity:.6;transition:opacity .2s}.sortable:hover .sort-icon{opacity:1}.store-name-column{min-width:260px}.store-name-column .column-header{justify-content:space-between}.store-name-column .select-all-row{padding-top:8px;margin-top:8px;border-top:1px solid #e5e7eb}.empty-store-state{border:1px solid #e5e7eb;border-radius:12px;padding:40px 16px;background:#f9fbff;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-store-icon{display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;background:#2e90fa1f}.store-days-select .ff-select-toggle{min-width:99px}.store-days-select .ff-select-toggle span{white-space:nowrap}.custom-modal{border-radius:16px;padding:10px 20px 20px;background:#fff;box-shadow:0 10px 40px #00000014;width:500px}.field-label{color:#8b8b8b;font-size:14px;margin-bottom:4px;display:block}.input-box{width:100%;height:46px;border:1px solid #e5e7eb;border-radius:10px;padding:0 14px;font-size:15px;background:#f8fafc;display:flex;align-items:center}.input-box:focus-within{border-color:#4daeff;background:#fff;box-shadow:0 0 0 2px #4daeff26}.icon-row{display:flex}.icon-box{width:60px;cursor:pointer;justify-content:space-between}.tag-icon{width:18px;height:18px;background-image:url(\"data:image/svg+xml,<svg ... />\");background-size:contain}.arrow-down{width:12px;height:12px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg)}.clean-select{border:none;width:100%;height:100%;background:transparent;font-size:15px;outline:none}.select-box{padding:0}.button-area{display:flex;justify-content:space-between;gap:15px}.btn-cancel{width:50%;height:46px;border-radius:10px;border:1px solid #dbdbdb;background:#fff;font-weight:500;cursor:pointer}.btn-create{width:50%;height:46px;border-radius:10px;border:none;background:#0094ff;color:#fff;font-weight:600;cursor:pointer}.btn-create:hover{background:#007bdb}.ff-select-wrapper{width:100%;position:relative}.ff-select-wrapper.compact{width:auto;min-width:80px}.ff-select-wrapper.disabled{pointer-events:none;opacity:.7}.ff-select-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid #d0d5dd;border-radius:10px;padding:8px 12px;background:#fff;font-weight:600;color:#101828;min-height:40px}.ff-select-toggle.small{min-height:36px;padding:6px 10px;font-size:13px}.ff-select-toggle svg{transition:transform .2s ease}.ff-select-wrapper.open .ff-select-toggle svg{transform:rotate(180deg)}.ff-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid #e4e7ec;border-radius:12px;box-shadow:0 16px 40px #0f172a26;max-height:220px;overflow-y:auto;z-index:15;padding:4px}.ff-select-option{width:100%;text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:8px;font-size:14px;color:#101828}.ff-select-option:hover{background:#f4f7fb}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TitleCasePipe, name: "titlecase" }] });
825
834
  }
826
835
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FootfallConfigurationComponent, decorators: [{
827
836
  type: Component,
828
- args: [{ selector: 'lib-footfall-configuration', template: "<form [formGroup]=\"footfallDirConfigurationForm\" class=\"container-fluid\">\r\n <ng-container *ngIf=\"(gs.userAccess | async)?.Global_Configuration_isEdit\">\r\n <div *ngIf=\"isEdit\" class=\"col-12 mb-5\">\r\n <!-- *ngIf=\"(gs.userAccess | async)?.userType === 'tango' || footfallDirConfigurationForm.get('footfallDirectoryConfigs')?.value === true\"> -->\r\n <div class=\" d-flex justify-content-end\">\r\n <button (click)=\"toggleForm();\" type=\"button\" class=\"btn btn-outline align-items-end\"><span\r\n class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_2579_25125)\">\r\n <path\r\n d=\"M14.167 2.49993C14.3859 2.28106 14.6457 2.10744 14.9317 1.98899C15.2176 1.87054 15.5241 1.80957 15.8337 1.80957C16.1432 1.80957 16.4497 1.87054 16.7357 1.98899C17.0216 2.10744 17.2815 2.28106 17.5003 2.49993C17.7192 2.7188 17.8928 2.97863 18.0113 3.2646C18.1297 3.55057 18.1907 3.85706 18.1907 4.16659C18.1907 4.47612 18.1297 4.78262 18.0113 5.06859C17.8928 5.35455 17.7192 5.61439 17.5003 5.83326L6.25033 17.0833L1.66699 18.3333L2.91699 13.7499L14.167 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2579_25125\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>Edit Details</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Approver Configuration -->\r\n <!-- <div class=\"row\">\r\n <div class=\"card p-3 mb-3\">\r\n <h5>Approver Configuration</h5>\r\n <ng-container>\r\n <div class=\"sub-text\">Set level of revision required for a store raised tickets</div>\r\n </ng-container>\r\n <div formArrayName=\"revision\" class=\"d-flex gap-4\">\r\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\" class=\"form-check\">\r\n <input type=\"checkbox\" formControlName=\"isChecked\" class=\"form-check-input\" [id]=\"'action-' + i\">\r\n <label class=\"form-check-label\" [for]=\"'action-' + i\">\r\n {{ rev.get('actionType')?.value | titlecase }}\r\n </label>\r\n <ng-container>\r\n <div *ngIf=\"rev.get('actionType')?.value == 'reviewer'\" class=\"sub-text\">The Ticket undergoes a single review to verify footfall</div>\r\n <div *ngIf=\"rev.get('actionType')?.value == 'approver'\" class=\"sub-text\">The Ticket undergoes a final review after the initial check</div>\r\n <div *ngIf=\"rev.get('actionType')?.value == 'tango'\" class=\"sub-text\">Finalize ticket and update footfall count</div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Approver Configuration -->\r\n <div class=\"card p-4 mb-4 approver-section\">\r\n <h5 class=\"mb-1 fw-semibold\">Approver configuration</h5>\r\n <p class=\"mb-4 small\">\r\n Set level of revisions required for a store raised tickets\r\n </p>\r\n\r\n <div formArrayName=\"revision\" class=\"d-flex flex-wrap gap-5\">\r\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"approver-option d-flex flex-column\"\r\n [class.disabled-option]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n\r\n <label class=\"custom-checkbox align-items-start\"\r\n [class.disabled-checkbox]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n <input type=\"checkbox\" formControlName=\"isChecked\" [id]=\"'action-' + i\" />\r\n <span class=\"checkmark\"></span>\r\n <div class=\"label-text\">\r\n <div class=\"title\">\r\n {{ rev.get('actionType')?.value | titlecase }}\r\n </div>\r\n <div class=\"desc text-muted\">\r\n <ng-container [ngSwitch]=\"rev.get('actionType')?.value\">\r\n <span *ngSwitchCase=\"'reviewer'\">The ticket undergoes a single review to verify\r\n footfall.</span>\r\n <span *ngSwitchCase=\"'approver'\">The ticket undergoes a final review after the initial\r\n check.</span>\r\n <span *ngSwitchCase=\"'tango'\">Finalize tickets and update footfall count.</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </label>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <hr class=\"ms-4 me-4\">\r\n\r\n <!-- Store SPOC Ticket Creation -->\r\n <div class=\"row\">\r\n <!-- <div class=\"card p-3 mb-3\">\r\n <h5>Store SPOC Ticket Creation</h5>\r\n <label>Allow Store SPOC to create tickets only for last</label>\r\n <input type=\"number\" min=\"1\" max=\"3\" class=\"form-control w-25 d-inline mx-2\" formControlName=\"allowTicketCreation\"> Days\r\n </div> -->\r\n <div class=\"card p-3 mb-3\">\r\n <h5 class=\"fw-bold mb-3\">Store SPOC Ticket Creation</h5>\r\n\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n\r\n <label class=\"mb-0\">\r\n Allow store SPOC to create tickets only for the last\r\n </label>\r\n\r\n <!-- Number dropdown -->\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\"\r\n [class.open]=\"isAllowTicketCreationDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleAllowTicketCreationDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('allowTicketCreation')?.value ||\r\n spocTicketCreationdays[0] }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAllowTicketCreationDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of spocTicketCreationdays\"\r\n (click)=\"selectAllowTicketCreation($event, day)\">\r\n {{ day }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <span class=\"mb-0\">Days</span>\r\n </div>\r\n </div>\r\n </div>\r\n <hr class=\"ms-4 me-4\">\r\n\r\n <div class=\"row\">\r\n <!-- Ticket Auto-close -->\r\n <!-- <div class=\"card p-3 mb-3\">\r\n <h5>Ticket Auto-close</h5>\r\n <div class=\"form-check form-switch mb-2\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"autoClose\" formControlName=\"isAutoCloseEnable\">\r\n <label class=\"form-check-label\" for=\"autoClose\">Enable Auto-close</label>\r\n </div>\r\n <div>\r\n <label>Auto-close Accuracy</label>\r\n <select formControlName=\"autoCloseAccuracy\" class=\"form-select w-25\">\r\n <option *ngFor=\"let val of ['85%', '90%', '95%', '100%']\" [value]=\"val\">{{ val }}</option>\r\n </select>\r\n </div>\r\n </div> -->\r\n\r\n <div class=\"card p-3 mb-3\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <h5 class=\"fw-bold m-0\">Ticket Auto-close</h5>\r\n\r\n <!-- Toggle Switch -->\r\n <label class=\"switch m-0 ms-3\" [class.disabled]=\"isEdit\">\r\n <input type=\"checkbox\" formControlName=\"isAutoCloseEnable\" [disabled]=\"isEdit\">\r\n <span class=\"slider round\"></span>\r\n </label>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center mt-2\">\r\n <span class=\"mb-0\">\r\n Ticket should be auto-closed, if the created ticket accuracy is greater than or equal to\r\n </span>\r\n\r\n <!-- Accuracy dropdown -->\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\" [class.open]=\"isAutoCloseDropdownOpen\"\r\n [class.disabled]=\"isEdit || !footfallDirConfigurationForm.get('isAutoCloseEnable')?.value\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleAutoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('autoCloseAccuracy')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAutoCloseDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of accuracyPercentageList\"\r\n (click)=\"selectAutoCloseAccuracy($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <hr class=\"ms-4 me-4\">\r\n\r\n <!-- Tagging Limitations -->\r\n <div class=\"row\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n <div class=\"card p-4 mb-4\">\r\n <!-- Footfall directory limitations start -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n <div>\r\n <h5 class=\"fw-semibold m-0\">Footfall directory limitations</h5>\r\n <p class=\"small mb-2\">\r\n Set maximum limitation for stores to tag non-Purchasers from Total Footfall\r\n </p>\r\n </div>\r\n\r\n <button type=\"button\" [disabled]=\"isEdit\" class=\"add-new-btn d-inline-flex align-items-center gap-2\"\r\n (click)=\"openCategoryModal('add')\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3.33334V12.6667M3.33334 8H12.6667\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>Add New</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Footfall directory limitations category part -->\r\n <div formArrayName=\"taggingLimitation\" class=\"category-grid mt-3\">\r\n <div *ngFor=\"let tag of tagLimits.controls; let i = index\" [formGroupName]=\"i\" class=\"category-card\">\r\n <!-- Top Section: Icon and Name -->\r\n <div class=\"category-card-header\">\r\n <!-- <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\"> -->\r\n <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\">\r\n <ng-container [ngSwitch]=\"tag.get('iconName')?.value\">\r\n <!-- Duplicate Tag SVG - Two overlapping squares -->\r\n <svg *ngSwitchCase=\"'duplicateTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1162_24621)\">\r\n <path\r\n d=\"M2.5 7.5H2C1.73478 7.5 1.48043 7.39464 1.29289 7.20711C1.10536 7.01957 1 6.76522 1 6.5V2C1 1.73478 1.10536 1.48043 1.29289 1.29289C1.48043 1.10536 1.73478 1 2 1H6.5C6.76522 1 7.01957 1.10536 7.20711 1.29289C7.39464 1.48043 7.5 1.73478 7.5 2V2.5M5.5 4.5H10C10.5523 4.5 11 4.94772 11 5.5V10C11 10.5523 10.5523 11 10 11H5.5C4.94772 11 4.5 10.5523 4.5 10V5.5C4.5 4.94772 4.94772 4.5 5.5 4.5Z\"\r\n stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24621\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <!-- Employee Tag SVG - Two people, one in front of the other -->\r\n <svg *ngSwitchCase=\"'employeeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\r\n <path\r\n d=\"M11.1667 12.5V11.1667C11.1667 10.4594 10.8857 9.78115 10.3856 9.28105C9.88552 8.78095 9.20724 8.5 8.5 8.5H3.16667C2.45942 8.5 1.78115 8.78095 1.28105 9.28105C0.780952 9.78115 0.5 10.4594 0.5 11.1667V12.5M15.1667 12.5V11.1667C15.1662 10.5758 14.9696 10.0018 14.6076 9.53488C14.2456 9.06791 13.7388 8.73438 13.1667 8.58667M10.5 0.586667C11.0736 0.733534 11.582 1.06713 11.9451 1.53487C12.3082 2.00261 12.5052 2.57789 12.5052 3.17C12.5052 3.76211 12.3082 4.33739 11.9451 4.80513C11.582 5.27287 11.0736 5.60647 10.5 5.75333M8.5 3.16667C8.5 4.63943 7.30609 5.83333 5.83333 5.83333C4.36057 5.83333 3.16667 4.63943 3.16667 3.16667C3.16667 1.69391 4.36057 0.5 5.83333 0.5C7.30609 0.5 8.5 1.69391 8.5 3.16667Z\"\r\n stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <!-- House Keeping Tag SVG - House with broom -->\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"#344054\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <!-- Junk Tag SVG - Trash can -->\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n\r\n <!-- Purple Tag SVG -->\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <!-- Orange Tag SVG -->\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <!-- Blue Tag SVG -->\r\n <!-- <svg *ngSwitchCase=\"'blueTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg> -->\r\n\r\n <!-- Default Tag SVG (fallback) -->\r\n <!-- <svg *ngSwitchDefault xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg> -->\r\n </ng-container>\r\n </div>\r\n <div class=\"category-name\">\r\n {{ tag.get('name')?.value }}\r\n </div>\r\n <!-- Menu Button (only for houseKeepingTag and junkTag) -->\r\n <button\r\n *ngIf=\"(tag.get('iconName')?.value !== 'duplicateTag' && tag.get('iconName')?.value !== 'employeeTag')\"\r\n type=\"button\" class=\"category-menu-btn\" (click)=\"toggleCategoryMenu($event, i)\"\r\n [disabled]=\"isEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\"\r\n viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 21C12.5523 21 13 20.5523 13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20C11 20.5523 11.4477 21 12 21Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n </button>\r\n <div class=\"category-menu\" *ngIf=\"activeMenuIndex === i\">\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'edit', i)\">Edit Name</button>\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'delete', i)\">Delete</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Bottom Section: Percentage Dropdown -->\r\n <div class=\"category-percentage-section\">\r\n <div class=\"position-relative ff-select-wrapper compact\"\r\n [class.open]=\"openLimitDropdownIndex === i\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleLimitDropdown($event, i)\">\r\n <span>{{ tag.get('value')?.value || 0 }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"openLimitDropdownIndex === i\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectLimitValue($event, i, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"mt-3\" *ngIf=\"isCategoryLimitReached\">\r\n <div class=\"alert alert-soft-primary d-flex align-items-center gap-2 mb-0\">\r\n <span class=\"badge-dot\"></span>\r\n <span>Maximum category creation limit reached.</span>\r\n </div>\r\n </div> -->\r\n <!-- Footfall directory limitations end -->\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ms-4 me-4\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n \r\n <div formGroupName=\"accuracyBreach\" class=\"card p-4 mb-3 store-requests-section\">\r\n <!-- store request Header Section -->\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div>\r\n <h5 class=\"fw-semibold mb-2\">Store Requests</h5>\r\n <p class=\"small mb-0 text-muted\">\r\n Below stores have requested to raise a ticket after breaching the configured limit\r\n <span class=\"info-icon\">i</span>\r\n </p>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-primary reset-btn d-inline-flex align-items-center gap-2\"\r\n *ngIf=\"!isEdit\" [disabled]=\"isResetDisabled\" (click)=\"openResetConfirmationModal()\" aria-live=\"polite\">\r\n <span>Reset</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Restriction Criteria Section -->\r\n <div class=\"restriction-criteria mb-4\">\r\n <label class=\"mb-3 d-block\">\r\n Restrict ticket creation for any store that:\r\n </label>\r\n <div class=\"d-flex align-items-center flex-nowrap gap-2\">\r\n <!-- Ticket Count Dropdown -->\r\n <span>Has raised more than</span>\r\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isTicketCountDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleTicketCountDropdown($event)\">\r\n <span>\r\n {{ footfallDirConfigurationForm.get('accuracyBreach.ticketCount')?.value || 1 }}\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isTicketCountDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let c of [1, 2, 3, 4, 5]\"\r\n (click)=\"selectTicketCount($event, c)\">\r\n {{ c }}\r\n </button>\r\n </div>\r\n </div>\r\n <span>tickets in the calender month </span>\r\n <!-- Days Dropdown -->\r\n <!-- <div class=\"position-relative ff-select-wrapper compact store-days-select\"\r\n [class.open]=\"isStoreDaysDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreDaysDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('accuracyBreach.days')?.value ||\r\n storeTicketDays[0] }} Days</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isStoreDaysDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of storeTicketDays\"\r\n (click)=\"selectStoreDays($event, day)\">\r\n {{ day }} Days\r\n </button>\r\n </div>\r\n </div> -->\r\n <span class=\"bold\" style=\"font-weight: 500;\">AND</span>\r\n <span>has footfall accuracy</span>\r\n <!-- Accuracy Dropdown -->\r\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isStoreAccuracyDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreAccuracyDropdown($event)\">\r\n <span>\r\n >={{ footfallDirConfigurationForm.get('accuracyBreach.accuracy')?.value || '95%' }}\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isStoreAccuracyDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of [95, 96, 97, 98, 99]\"\r\n (click)=\"selectStoreAccuracy($event, p)\">\r\n >={{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Requests Table -->\r\n <div class=\"store-requests-table\" [class.disabled]=\"isEdit\"\r\n *ngIf=\"storeList?.length > 0; else emptyStoreRequests\">\r\n <div class=\"table-responsive\" [ngClass]=\"{'store-table-scroll': storeList?.length > 5}\">\r\n <table class=\"table table-hover store-requests-table-content\">\r\n <thead>\r\n <tr>\r\n <th class=\"checkbox-column\"></th>\r\n <th class=\"sortable store-name-column\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input type=\"checkbox\" [checked]=\"isAllSelected\" [disabled]=\"isEdit\"\r\n (change)=\"toggleSelectAll($event)\" />\r\n <span class=\"checkmark-select\"></span>\r\n <span class=\"ms-2\">Select all stores ({{ storeList?.length || 0\r\n }})</span>\r\n </label>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" class=\"ms-2 dropdown-arrow\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th class=\"sortable\">\r\n Raised on\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n Last raised(Approved)\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n No of Time Raised\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let store of storeList\">\r\n <td class=\"checkbox-column\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input #cb type=\"checkbox\" [checked]=\"isStoreSelected(store)\" [disabled]=\"isEdit\"\r\n (change)=\"toggleStoreSelection(store, cb.checked)\" />\r\n <span class=\"checkmark-select\"></span>\r\n </label>\r\n </td>\r\n <td>{{ store.storeName }}</td>\r\n <td>{{ store.raisedOn }}</td>\r\n <td>{{ store.lastApproved || '-' }}</td>\r\n <td>{{ store.totalRaised }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <ng-template #emptyStoreRequests>\r\n <div class=\"empty-store-state text-center\">\r\n <div class=\"empty-store-icon mb-3\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.94629 21.1995C8.645 21.2313 8.33828 21.2502 8.02734 21.2502C7.85782 21.2502 7.69052 21.2434 7.52539 21.2336V31.6067C7.52539 33.0347 8.70837 34.2258 10.1963 34.2258H29.8008C31.2888 34.2258 32.4717 33.0347 32.4717 31.6067V21.2346C32.3098 21.2438 32.1459 21.2502 31.9814 21.2502C31.6675 21.2502 31.3569 21.2323 31.0508 21.1995V28.9875H8.94629V21.1995ZM30.9277 5.77368H9.06934C8.89197 5.77368 8.73671 5.86647 8.65918 5.98755L8.65723 5.9895L5.14746 11.4729L5.05273 11.6204C3.82719 13.7402 5.0918 16.4671 7.44336 16.7766C7.64428 16.8011 7.83403 16.8157 8.02148 16.8157C9.25156 16.8157 10.3395 16.287 11.0967 15.4651L12.0186 14.4641L12.9375 15.468C13.6864 16.2861 14.7731 16.8157 16.0107 16.8157C17.2428 16.8156 18.3347 16.2854 19.083 15.468L20.0049 14.4612L20.9268 15.468C21.6751 16.2855 22.7668 16.8157 23.999 16.8157C25.2312 16.8157 26.3229 16.2854 27.0713 15.468L27.9932 14.4612L28.915 15.468C29.6634 16.2855 30.756 16.8157 31.9883 16.8157C32.1697 16.8157 32.3648 16.8018 32.5645 16.7776H32.5635C34.9572 16.4571 36.2254 13.6075 34.8574 11.4729L34.8564 11.4739L31.3398 5.99048L31.3389 5.98755C31.2614 5.86628 31.1053 5.77368 30.9277 5.77368Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <p class=\"mb-0 fw-semibold text-muted\">No reset request from store</p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <hr class=\"ms-4 me-4\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n <!-- Tango Review -->\r\n <!-- <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-3 mb-3\">\r\n <label>Send Ticket to Tango if accuracy falls below</label>\r\n <input type=\"text\" class=\"form-control w-25\" formControlName=\"tangoReview\">\r\n </div> -->\r\n <div class=\"row\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n <div class=\"card p-4 mb-4 tango-review-card\">\r\n <div class=\"d-flex align-items-center gap-2 mb-1\">\r\n <h5 class=\"fw-bold m-0\">Send Ticket to Tango</h5>\r\n </div>\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"me-2 mb-0 tango-label\">Send ticket to Tango if accuracy falls below</label>\r\n <div class=\"position-relative ff-select-wrapper compact ms-0\" [class.open]=\"issendTangoDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleSendTangoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('tangoReview')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"issendTangoDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of sendTicketTango\"\r\n (click)=\"selectSendTicketTango($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!isEdit\">\r\n <div class=\"mb-5 w-100 footer-seperator\"></div>\r\n <div class=\"d-flex justify-content-end\">\r\n <a type=\"button\" class=\"btn btn-outline mt-1 me-4\" (click)=\"onCancel()\">Cancel</a>\r\n <a type=\"submit\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\"><span>Save Changes</span></a>\r\n </div>\r\n </div>\r\n\r\n <!-- Category Modal -->\r\n <ng-template #categoryModal>\r\n <div class=\"modal-header border-0 pb-0\">\r\n <h5 class=\"modal-title\">\r\n {{ categoryModalMode === 'add' ? 'Add New Category' : 'Edit Category' }}\r\n </h5>\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"closeCategoryModal()\"></button>\r\n </div>\r\n <div class=\"modal-body category-modal-body\">\r\n <form [formGroup]=\"categoryForm\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Icon</label>\r\n <div class=\"ff-select-wrapper icon-select\" [class.open]=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryIconDropdown($event)\">\r\n <span class=\"d-inline-flex align-items-center gap-2\">\r\n <span class=\"category-icon\"\r\n [ngClass]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <ng-container [ngSwitch]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <!-- Blue Tag SVG -->\r\n <!-- <svg *ngSwitchCase=\"'blueTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> -->\r\n <!-- Purple Tag SVG -->\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- Orange Tag SVG -->\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- House Keeping Tag SVG -->\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_icon_housekeeping)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_icon_housekeeping\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <!-- Junk Tag SVG -->\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span class=\"icon-label\">{{ selectedCategoryIconLabel }}</span>\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option d-flex align-items-center gap-2\"\r\n *ngFor=\"let icon of categoryIcons\"\r\n (click)=\"selectCategoryIconFromDropdown($event, icon.value)\">\r\n <span class=\"category-icon\" [ngClass]=\"icon.value\">\r\n <ng-container [ngSwitch]=\"icon.value\">\r\n <!-- Blue Tag SVG -->\r\n <!-- <svg *ngSwitchCase=\"'blueTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> -->\r\n <!-- Purple Tag SVG -->\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- Orange Tag SVG -->\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- House Keeping Tag SVG -->\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"#344054\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <!-- Junk Tag SVG -->\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span>{{ icon.label }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Category Name</label>\r\n <input type=\"text\" class=\"form-control\" \r\n [class.is-invalid]=\"categoryForm.get('name')?.invalid && categoryForm.get('name')?.touched\"\r\n placeholder=\"Enter your new category\"\r\n formControlName=\"name\" />\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('required') && categoryForm.get('name')?.touched\">\r\n Category name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('duplicate') && categoryForm.get('name')?.touched\">\r\n Category name already exists.\r\n </small>\r\n </div>\r\n\r\n <div class=\"mb-2\">\r\n <label class=\"form-label text-muted\">Limitation</label>\r\n <div class=\"ff-select-wrapper\" [class.open]=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryLimitDropdown($event)\">\r\n <span>{{ categoryForm.get('limit')?.value || percentageList[0] }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectCategoryLimitValue($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"modal-footer border-0 pt-0\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeCategoryModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"submitCategoryForm()\">\r\n {{ categoryModalMode === 'add' ? 'Create' : 'Save' }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Delete Confirmation Modal -->\r\n <ng-template #deleteCategoryModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Confirmation</h5>\r\n <p class=\"mb-4 text-muted\">\r\n You're about to delete <span class=\"fw-semibold\">{{ categoryPendingDeleteName }}</span> category.\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeDeleteModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger\" (click)=\"confirmDeleteCategory()\">Delete</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Reset Store Requests Confirmation Modal -->\r\n <ng-template #resetConfirmationModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Reset Store Requests</h5>\r\n <p class=\"mb-4 text-muted\">\r\n Are you sure you want to proceed with resetting the selected <span class=\"fw-semibold\">{{\r\n resetRequest.arrayOfStores.length }}</span> store(s) requests?\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeResetModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"confirmResetStoreRequest()\">Reset</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n</form>", styles: [".tango-review-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 8px 30px #0f172a14}.tango-icon{width:28px;height:28px;border-radius:50%;background:#2e90fa26;display:inline-flex;align-items:center;justify-content:center}.tango-label{font-size:13px;color:#475467;font-weight:500}form{background:#fff;padding:32px 40px;border-radius:16px;box-shadow:0 2px 12px #0000000d;font-family:Inter,Segoe UI,sans-serif}.section-divider{border-bottom:1px solid #e4e7ec;margin:40px 0}.sub-header{font-size:16px;font-weight:600;color:#111827;margin-bottom:6px}.sub-text{font-size:13px;color:#6b7280;margin-bottom:12px}.form-check{display:flex;align-items:center;gap:10px}.form-check-input{width:42px;height:22px;cursor:pointer;accent-color:#2563eb;border:1px solid #d1d5db;transition:all .2s ease-in-out}.form-check-input:checked{background-color:#2563eb;border-color:#2563eb}.form-check-input:disabled{opacity:.6;cursor:not-allowed}.toggle-label{font-size:13px;font-weight:500;color:#374151}input[type=radio].form-check-input{width:16px;height:16px;accent-color:#2563eb}input[type=radio]:checked{border-color:#2563eb}select.form-select{border:1px solid #d1d5db;border-radius:8px;height:38px;font-size:14px;color:#374151;padding:6px 10px;outline:none;transition:.2s}select.form-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.btn-outline{background-color:#fff;border:1px solid #d1d5db;color:#374151;padding:6px 16px;border-radius:8px;transition:all .2s}.btn-outline:hover{background:#f9fafb}.btn-primary{background-color:#2563eb;border:none;color:#fff;border-radius:8px;padding:6px 16px;transition:.2s}.btn-primary:hover{background-color:#1e40af}.col-lg-3,.col-xl-3,.col-xxl-3{margin-bottom:20px}.approver-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.approver-option{display:flex;flex-direction:column;justify-content:flex-start;width:220px}.custom-checkbox{position:relative;display:flex;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.custom-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer}.custom-checkbox .checkmark{height:20px;width:20px;border:2px solid #d0d5dd;border-radius:6px;display:inline-block;transition:all .2s ease}.custom-checkbox input:checked~.checkmark{background-color:#004aad;border-color:#004aad}.custom-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.label-text{display:flex;flex-direction:column}.label-text .title{font-weight:600;color:#101828}.label-text .desc{font-size:13px;color:#667085;margin-top:2px;max-width:190px;line-height:1.4}.custom-checkbox input:not(:checked)~.label-text .desc{opacity:.6}.approver-option.disabled-option{opacity:.6;pointer-events:none}.approver-option.disabled-option .custom-checkbox.disabled-checkbox{cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .checkmark{background-color:#f3f4f6;border-color:#d1d5dd;cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark{background-color:#f3f4f6;border-color:#d1d5dd}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.5}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .title{color:#9ca3af}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .desc{color:#d1d5dd}.day-select{width:70px!important;padding-left:10px!important;padding-right:25px!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='black' class='bi bi-caret-down-fill' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592c.86 0 1.319 1.013.753 1.658l-4.796 5.482a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 8px center!important;background-size:12px!important;border-radius:6px!important}.switch{position:relative;display:inline-block;width:44px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ddd;transition:.3s;border-radius:22px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}input:checked+.slider{background-color:#4c9aff}input:checked+.slider:before{transform:translate(21px)}.switch.disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.switch.disabled .slider{cursor:not-allowed;background-color:#e5e7eb}.switch.disabled input:checked+.slider{background-color:#7dd3fc}.accuracy-select{width:90px!important;border-radius:6px!important;padding-left:10px!important;padding-right:25px!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='black' class='bi bi-caret-down-fill' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592c.86 0 1.319 1.013.753 1.658l-4.796 5.482a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E\")!important;background-position:right 10px center!important;background-repeat:no-repeat!important;background-size:12px!important}.limitation-grid{margin-top:.5rem}.limitation-item{flex:0 0 220px;min-width:180px;background:#fff;border:1px solid #e6e9ef;border-radius:10px;padding:12px;display:flex;flex-direction:column;gap:8px;box-shadow:0 1px 2px #10182808}.limitation-item label{margin:0;font-weight:600;color:#111827}.limitation-select{width:100%;border-radius:8px;padding-left:10px!important;padding-right:25px!important;height:38px;background-color:#fff}.category-grid{display:flex;flex-wrap:wrap;gap:12px}.category-card{min-width:180px;position:relative}.category-card-header{display:flex;align-items:center}.category-icon{width:32px;height:32px;min-width:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.category-name{font-weight:500;color:#101828;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-percentage-section{width:100%}.category-percentage-section .ff-select-wrapper.compact{width:100%;min-width:auto}.category-percentage-section .ff-select-toggle.small{width:100%;min-height:36px;padding:6px 10px;font-size:13px}.category-menu-btn{border:none;background:transparent;padding:4px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px;display:inline-flex;align-items:center;justify-content:center}.category-menu-btn:disabled{cursor:default}.category-menu{position:absolute;top:48px;right:16px;background:#fff;border:1px solid #e4e7ec;border-radius:10px;box-shadow:0 12px 30px #0f172a26;min-width:140px;z-index:5;padding:4px}.category-menu button{width:100%;text-align:left;background:transparent;border:none;padding:8px 10px;border-radius:8px;font-size:13px;color:#101828}.category-menu button:hover{background:#f4f7fb}.limit-label{font-size:12px;text-transform:uppercase;letter-spacing:.04em}.alert-soft-primary{background:#eff4ff;border:1px solid #d6e2ff;border-radius:10px;padding:10px 14px;font-size:13px;color:#004aad}.badge-dot{width:8px;height:8px;border-radius:999px;background:#004aad;display:inline-block}.icon-picker{display:flex;gap:12px;flex-wrap:wrap}.icon-pill{width:56px;height:56px;border-radius:12px;border:1px solid #e4e7ec;background:#fff;display:inline-flex;align-items:center;justify-content:center;transition:all .2s ease}.icon-pill.active{border-color:#004aad;box-shadow:0 0 0 4px #004aad1f}.icon-pill:hover{border-color:#c7d7fd}.tag-blue,.blueTag{color:#004aad}.tag-purple,.purpleTag{color:#7c3aed}.tag-orange,.orangeTag{color:#ea580c}.category-modal-body .form-control,.category-modal-body .form-select{border-radius:10px;min-height:44px}.category-modal-body .form-label{font-size:13px}.category-modal-body .text-danger{font-size:12px}.card .btn-outline.btn-sm{padding:6px 10px;border-radius:8px}.add-new-btn{background:#fff;border:1px solid #d0d5dd;border-radius:10px;padding:5px 13px;font-size:14px;font-weight:600;color:#101828;transition:all .2s ease;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:0 1px 2px #1018280d}.add-new-btn:hover:not(:disabled){background:#f9fafb;border-color:#004aad;color:#004aad;box-shadow:0 2px 4px #10182814}.add-new-btn:active:not(:disabled){background:#f4f7fb;transform:translateY(1px);box-shadow:0 1px 2px #1018280d}.add-new-btn:disabled{opacity:.6;cursor:not-allowed;background:#f9fafb;border-color:#e5e7eb;color:#9ca3af}.add-new-btn svg{transition:transform .2s ease;flex-shrink:0}.add-new-btn:hover:not(:disabled) svg{transform:rotate(90deg)}.info-icon{display:inline-flex;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;border-radius:50%;background:#f3f3f3;color:#555;cursor:pointer;margin-left:6px;border:1.5px solid #8a8a8a}.store-requests-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.reset-btn{border-width:1px;border-color:#d0d5dd;color:#004aad;font-weight:600;padding:6px 18px;background-color:#fff;transition:all .2s ease}.reset-btn svg path{stroke:currentColor}.reset-btn .spinner-border{color:#004aad}.reset-btn:disabled{opacity:.6;cursor:not-allowed}.reset-btn:not(:disabled):hover{background-color:#f4f7fb;border-color:#004aad;box-shadow:0 1px 2px #1018280f}.restriction-criteria{padding:16px 0;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb}.restriction-select{min-width:140px;padding-left:10px!important;padding-right:30px!important;border-radius:6px!important;border:1px solid #d1d5db;font-size:14px;height:36px;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='black' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592c.86 0 1.319 1.013.753 1.658l-4.796 5.482a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:12px!important}.restriction-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.select-all-row{padding:8px 0}.custom-checkbox-select{position:relative;display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-checkbox-select input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:0;height:0}.checkmark-select{height:18px;width:18px;border:2px solid #d0d5dd;border-radius:4px;display:inline-block;transition:all .2s ease;position:relative}.custom-checkbox-select input:checked~.checkmark-select{background-color:#2563eb;border-color:#2563eb}.custom-checkbox-select input:checked~.checkmark-select:after{content:\"\";position:absolute;left:5px;top:2px;width:4px;height:8px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.dropdown-arrow{cursor:pointer;transition:transform .2s}.dropdown-arrow:hover{transform:translateY(2px)}.store-requests-table{margin-top:16px;position:relative}.store-requests-table.disabled{pointer-events:none;opacity:.6;-webkit-user-select:none;user-select:none}.store-requests-table-content{border-collapse:separate;border-spacing:0;width:100%}.store-requests-table-content thead{background-color:#f9fafb}.store-requests-table-content thead th{padding:12px 16px;font-weight:600;font-size:13px;color:#344054;text-align:left;border-bottom:1px solid #e5e7eb;white-space:nowrap;background-color:#f9fafb;vertical-align:top}.store-requests-table-content tbody td{padding:12px 16px;font-size:14px;color:#101828;border-bottom:1px solid #f2f4f7}.store-requests-table-content tbody tr:hover{background-color:#f9fafb}.store-requests-table-content tbody tr:last-child td{border-bottom:none}.store-table-scroll{max-height:360px;overflow-y:auto}.store-table-scroll table{margin-bottom:0}.store-table-scroll .store-requests-table-content thead th{position:sticky;top:0;z-index:2}.checkbox-column{width:110px;padding-left:16px!important}.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.sortable:hover{background-color:#f3f4f6}.sort-icon{opacity:.6;transition:opacity .2s}.sortable:hover .sort-icon{opacity:1}.store-name-column{min-width:260px}.store-name-column .column-header{justify-content:space-between}.store-name-column .select-all-row{padding-top:8px;margin-top:8px;border-top:1px solid #e5e7eb}.empty-store-state{border:1px solid #e5e7eb;border-radius:12px;padding:40px 16px;background:#f9fbff;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-store-icon{display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;background:#2e90fa1f}.store-days-select .ff-select-toggle{min-width:99px}.store-days-select .ff-select-toggle span{white-space:nowrap}.custom-modal{border-radius:16px;padding:10px 20px 20px;background:#fff;box-shadow:0 10px 40px #00000014;width:500px}.field-label{color:#8b8b8b;font-size:14px;margin-bottom:4px;display:block}.input-box{width:100%;height:46px;border:1px solid #e5e7eb;border-radius:10px;padding:0 14px;font-size:15px;background:#f8fafc;display:flex;align-items:center}.input-box:focus-within{border-color:#4daeff;background:#fff;box-shadow:0 0 0 2px #4daeff26}.icon-row{display:flex}.icon-box{width:60px;cursor:pointer;justify-content:space-between}.tag-icon{width:18px;height:18px;background-image:url(\"data:image/svg+xml,<svg ... />\");background-size:contain}.arrow-down{width:12px;height:12px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg)}.clean-select{border:none;width:100%;height:100%;background:transparent;font-size:15px;outline:none}.select-box{padding:0}.button-area{display:flex;justify-content:space-between;gap:15px}.btn-cancel{width:50%;height:46px;border-radius:10px;border:1px solid #dbdbdb;background:#fff;font-weight:500;cursor:pointer}.btn-create{width:50%;height:46px;border-radius:10px;border:none;background:#0094ff;color:#fff;font-weight:600;cursor:pointer}.btn-create:hover{background:#007bdb}.ff-select-wrapper{width:100%;position:relative}.ff-select-wrapper.compact{width:auto;min-width:80px}.ff-select-wrapper.disabled{pointer-events:none;opacity:.7}.ff-select-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid #d0d5dd;border-radius:10px;padding:8px 12px;background:#fff;font-weight:600;color:#101828;min-height:40px}.ff-select-toggle.small{min-height:36px;padding:6px 10px;font-size:13px}.ff-select-toggle svg{transition:transform .2s ease}.ff-select-wrapper.open .ff-select-toggle svg{transform:rotate(180deg)}.ff-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid #e4e7ec;border-radius:12px;box-shadow:0 16px 40px #0f172a26;max-height:220px;overflow-y:auto;z-index:15;padding:4px}.ff-select-option{width:100%;text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:8px;font-size:14px;color:#101828}.ff-select-option:hover{background:#f4f7fb}\n"] }]
837
+ args: [{ selector: 'lib-footfall-configuration', template: "<form [formGroup]=\"footfallDirConfigurationForm\" class=\"container-fluid\">\r\n <ng-container *ngIf=\"(gs.userAccess | async)?.Global_Configuration_isEdit\">\r\n <div *ngIf=\"isEdit\" class=\"col-12 mb-5\">\r\n <!-- *ngIf=\"(gs.userAccess | async)?.userType === 'tango' || footfallDirConfigurationForm.get('footfallDirectoryConfigs')?.value === true\"> -->\r\n <div class=\" d-flex justify-content-end\">\r\n <button (click)=\"toggleForm();\" type=\"button\" class=\"btn btn-outline align-items-end\"><span\r\n class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_2579_25125)\">\r\n <path\r\n d=\"M14.167 2.49993C14.3859 2.28106 14.6457 2.10744 14.9317 1.98899C15.2176 1.87054 15.5241 1.80957 15.8337 1.80957C16.1432 1.80957 16.4497 1.87054 16.7357 1.98899C17.0216 2.10744 17.2815 2.28106 17.5003 2.49993C17.7192 2.7188 17.8928 2.97863 18.0113 3.2646C18.1297 3.55057 18.1907 3.85706 18.1907 4.16659C18.1907 4.47612 18.1297 4.78262 18.0113 5.06859C17.8928 5.35455 17.7192 5.61439 17.5003 5.83326L6.25033 17.0833L1.66699 18.3333L2.91699 13.7499L14.167 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2579_25125\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>Edit Details</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Approver Configuration -->\r\n <!-- <div class=\"row\">\r\n <div class=\"card p-3 mb-3\">\r\n <h5>Approver Configuration</h5>\r\n <ng-container>\r\n <div class=\"sub-text\">Set level of revision required for a store raised tickets</div>\r\n </ng-container>\r\n <div formArrayName=\"revision\" class=\"d-flex gap-4\">\r\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\" class=\"form-check\">\r\n <input type=\"checkbox\" formControlName=\"isChecked\" class=\"form-check-input\" [id]=\"'action-' + i\">\r\n <label class=\"form-check-label\" [for]=\"'action-' + i\">\r\n {{ rev.get('actionType')?.value | titlecase }}\r\n </label>\r\n <ng-container>\r\n <div *ngIf=\"rev.get('actionType')?.value == 'reviewer'\" class=\"sub-text\">The Ticket undergoes a single review to verify footfall</div>\r\n <div *ngIf=\"rev.get('actionType')?.value == 'approver'\" class=\"sub-text\">The Ticket undergoes a final review after the initial check</div>\r\n <div *ngIf=\"rev.get('actionType')?.value == 'tango'\" class=\"sub-text\">Finalize ticket and update footfall count</div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Approver Configuration -->\r\n <div class=\"card p-4 mb-4 approver-section\">\r\n <h5 class=\"mb-1 fw-semibold\">Approver configuration</h5>\r\n <p class=\"mb-4 small\">\r\n Set level of revisions required for a store raised tickets\r\n </p>\r\n\r\n <div formArrayName=\"revision\" class=\"d-flex flex-wrap gap-5\">\r\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"approver-option d-flex flex-column\"\r\n [class.disabled-option]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n\r\n <label class=\"custom-checkbox align-items-start\"\r\n [class.disabled-checkbox]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n <input type=\"checkbox\" formControlName=\"isChecked\" [id]=\"'action-' + i\" />\r\n <span class=\"checkmark\"></span>\r\n <div class=\"label-text\">\r\n <div class=\"title\">\r\n {{ rev.get('actionType')?.value | titlecase }}\r\n </div>\r\n <div class=\"desc text-muted\">\r\n <ng-container [ngSwitch]=\"rev.get('actionType')?.value\">\r\n <span *ngSwitchCase=\"'reviewer'\">The ticket undergoes a single review to verify\r\n footfall.</span>\r\n <span *ngSwitchCase=\"'approver'\">The ticket undergoes a final review after the initial\r\n check.</span>\r\n <span *ngSwitchCase=\"'tango'\">Finalize tickets and update footfall count.</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </label>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <hr class=\"ms-4 me-4\">\r\n\r\n <!-- Store SPOC Ticket Creation -->\r\n <div class=\"row\">\r\n <!-- <div class=\"card p-3 mb-3\">\r\n <h5>Store SPOC Ticket Creation</h5>\r\n <label>Allow Store SPOC to create tickets only for last</label>\r\n <input type=\"number\" min=\"1\" max=\"3\" class=\"form-control w-25 d-inline mx-2\" formControlName=\"allowTicketCreation\"> Days\r\n </div> -->\r\n <div class=\"card p-3 mb-3\">\r\n <h5 class=\"fw-bold mb-3\">Store SPOC Ticket Creation</h5>\r\n\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n\r\n <label class=\"mb-0\">\r\n Allow store SPOC to create tickets only for the last\r\n </label>\r\n\r\n <!-- Number dropdown -->\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\"\r\n [class.open]=\"isAllowTicketCreationDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleAllowTicketCreationDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('allowTicketCreation')?.value ||\r\n spocTicketCreationdays[0] }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAllowTicketCreationDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of spocTicketCreationdays\"\r\n (click)=\"selectAllowTicketCreation($event, day)\">\r\n {{ day }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <span class=\"mb-0\">Days</span>\r\n </div>\r\n </div>\r\n </div>\r\n <hr class=\"ms-4 me-4\">\r\n\r\n <div class=\"row\">\r\n <!-- Ticket Auto-close -->\r\n <!-- <div class=\"card p-3 mb-3\">\r\n <h5>Ticket Auto-close</h5>\r\n <div class=\"form-check form-switch mb-2\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"autoClose\" formControlName=\"isAutoCloseEnable\">\r\n <label class=\"form-check-label\" for=\"autoClose\">Enable Auto-close</label>\r\n </div>\r\n <div>\r\n <label>Auto-close Accuracy</label>\r\n <select formControlName=\"autoCloseAccuracy\" class=\"form-select w-25\">\r\n <option *ngFor=\"let val of ['85%', '90%', '95%', '100%']\" [value]=\"val\">{{ val }}</option>\r\n </select>\r\n </div>\r\n </div> -->\r\n\r\n <div class=\"card p-3 mb-3\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <h5 class=\"fw-bold m-0\">Ticket Auto-close</h5>\r\n\r\n <!-- Toggle Switch -->\r\n <label class=\"switch m-0 ms-3\" [class.disabled]=\"isEdit\">\r\n <input type=\"checkbox\" formControlName=\"isAutoCloseEnable\" [disabled]=\"isEdit\">\r\n <span class=\"slider round\"></span>\r\n </label>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center mt-2\">\r\n <span class=\"mb-0\">\r\n Ticket should be auto-closed, if the created ticket accuracy is greater than or equal to\r\n </span>\r\n\r\n <!-- Accuracy dropdown -->\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\" [class.open]=\"isAutoCloseDropdownOpen\"\r\n [class.disabled]=\"isEdit || !footfallDirConfigurationForm.get('isAutoCloseEnable')?.value\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleAutoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('autoCloseAccuracy')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAutoCloseDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of accuracyPercentageList\"\r\n (click)=\"selectAutoCloseAccuracy($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <hr class=\"ms-4 me-4\">\r\n\r\n <!-- Tagging Limitations -->\r\n <div class=\"row\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n <div class=\"card p-4 mb-4\">\r\n <!-- Footfall directory limitations start -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n <div>\r\n <h5 class=\"fw-semibold m-0\">Footfall directory limitations</h5>\r\n <p class=\"small mb-2\">\r\n Set maximum limitation for stores to tag non-Purchasers from Total Footfall\r\n </p>\r\n </div>\r\n\r\n <button type=\"button\" [disabled]=\"isEdit\" class=\"add-new-btn d-inline-flex align-items-center gap-2\"\r\n (click)=\"openCategoryModal('add')\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3.33334V12.6667M3.33334 8H12.6667\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>Add New</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Footfall directory limitations category part -->\r\n <div formArrayName=\"taggingLimitation\" class=\"category-grid mt-3\">\r\n <div *ngFor=\"let tag of tagLimits.controls; let i = index\" [formGroupName]=\"i\" class=\"category-card\">\r\n <!-- Top Section: Icon and Name -->\r\n <div class=\"category-card-header\">\r\n <!-- <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\"> -->\r\n <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\">\r\n <ng-container [ngSwitch]=\"tag.get('iconName')?.value\">\r\n <!-- Duplicate Tag SVG - Two overlapping squares -->\r\n <svg *ngSwitchCase=\"'duplicateTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1162_24621)\">\r\n <path\r\n d=\"M2.5 7.5H2C1.73478 7.5 1.48043 7.39464 1.29289 7.20711C1.10536 7.01957 1 6.76522 1 6.5V2C1 1.73478 1.10536 1.48043 1.29289 1.29289C1.48043 1.10536 1.73478 1 2 1H6.5C6.76522 1 7.01957 1.10536 7.20711 1.29289C7.39464 1.48043 7.5 1.73478 7.5 2V2.5M5.5 4.5H10C10.5523 4.5 11 4.94772 11 5.5V10C11 10.5523 10.5523 11 10 11H5.5C4.94772 11 4.5 10.5523 4.5 10V5.5C4.5 4.94772 4.94772 4.5 5.5 4.5Z\"\r\n stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24621\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <!-- Employee Tag SVG - Two people, one in front of the other -->\r\n <svg *ngSwitchCase=\"'employeeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\r\n <path\r\n d=\"M11.1667 12.5V11.1667C11.1667 10.4594 10.8857 9.78115 10.3856 9.28105C9.88552 8.78095 9.20724 8.5 8.5 8.5H3.16667C2.45942 8.5 1.78115 8.78095 1.28105 9.28105C0.780952 9.78115 0.5 10.4594 0.5 11.1667V12.5M15.1667 12.5V11.1667C15.1662 10.5758 14.9696 10.0018 14.6076 9.53488C14.2456 9.06791 13.7388 8.73438 13.1667 8.58667M10.5 0.586667C11.0736 0.733534 11.582 1.06713 11.9451 1.53487C12.3082 2.00261 12.5052 2.57789 12.5052 3.17C12.5052 3.76211 12.3082 4.33739 11.9451 4.80513C11.582 5.27287 11.0736 5.60647 10.5 5.75333M8.5 3.16667C8.5 4.63943 7.30609 5.83333 5.83333 5.83333C4.36057 5.83333 3.16667 4.63943 3.16667 3.16667C3.16667 1.69391 4.36057 0.5 5.83333 0.5C7.30609 0.5 8.5 1.69391 8.5 3.16667Z\"\r\n stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <!-- House Keeping Tag SVG - House with broom -->\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"#344054\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <!-- Junk Tag SVG - Trash can -->\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n\r\n <!-- Purple Tag SVG -->\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <!-- Orange Tag SVG -->\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <!-- Blue Tag SVG -->\r\n <!-- <svg *ngSwitchCase=\"'blueTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg> -->\r\n\r\n <!-- Default Tag SVG (fallback) -->\r\n <!-- <svg *ngSwitchDefault xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg> -->\r\n </ng-container>\r\n </div>\r\n <div class=\"category-name\">\r\n {{ tag.get('name')?.value }}\r\n </div>\r\n <!-- Menu Button (only for houseKeepingTag and junkTag) -->\r\n <button\r\n *ngIf=\"(tag.get('iconName')?.value !== 'duplicateTag' && tag.get('iconName')?.value !== 'employeeTag')\"\r\n type=\"button\" class=\"category-menu-btn\" (click)=\"toggleCategoryMenu($event, i)\"\r\n [disabled]=\"isEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\"\r\n viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 21C12.5523 21 13 20.5523 13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20C11 20.5523 11.4477 21 12 21Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n </button>\r\n <div class=\"category-menu\" *ngIf=\"activeMenuIndex === i\">\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'edit', i)\">Edit Name</button>\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'delete', i)\">Delete</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Bottom Section: Percentage Dropdown -->\r\n <div class=\"category-percentage-section\">\r\n <div class=\"position-relative ff-select-wrapper compact\"\r\n [class.open]=\"openLimitDropdownIndex === i\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleLimitDropdown($event, i)\">\r\n <span>{{ tag.get('value')?.value || 0 }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"openLimitDropdownIndex === i\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectLimitValue($event, i, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"mt-3\" *ngIf=\"isCategoryLimitReached\">\r\n <div class=\"alert alert-soft-primary d-flex align-items-center gap-2 mb-0\">\r\n <span class=\"badge-dot\"></span>\r\n <span>Maximum category creation limit reached.</span>\r\n </div>\r\n </div> -->\r\n <!-- Footfall directory limitations end -->\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ms-4 me-4\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n \r\n <div formGroupName=\"accuracyBreach\" class=\"card p-4 mb-3 store-requests-section\">\r\n <!-- store request Header Section -->\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div>\r\n <h5 class=\"fw-semibold mb-2\">Store Requests</h5>\r\n <p class=\"small mb-0 text-muted\">\r\n Below stores have requested to raise a ticket after breaching the configured limit\r\n <span class=\"info-icon\">i</span>\r\n </p>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-primary reset-btn d-inline-flex align-items-center gap-2\"\r\n *ngIf=\"!isEdit\" [disabled]=\"isResetDisabled\" (click)=\"openResetConfirmationModal()\" aria-live=\"polite\">\r\n <span>Reset</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Restriction Criteria Section -->\r\n <div class=\"restriction-criteria mb-4\">\r\n <label class=\"mb-3 d-block\">\r\n Restrict ticket creation for any store that:\r\n </label>\r\n <div class=\"d-flex align-items-center flex-nowrap gap-2\">\r\n <!-- Ticket Count Dropdown -->\r\n <span>Has raised more than</span>\r\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isTicketCountDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleTicketCountDropdown($event)\">\r\n <span>\r\n {{ footfallDirConfigurationForm.get('accuracyBreach.ticketCount')?.value || 1 }}\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isTicketCountDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let c of [1, 2, 3, 4, 5]\"\r\n (click)=\"selectTicketCount($event, c)\">\r\n {{ c }}\r\n </button>\r\n </div>\r\n </div>\r\n <span>tickets in the calender</span>\r\n <!-- Days Dropdown (Month=30, Week=7) -->\r\n <div class=\"position-relative ff-select-wrapper compact store-days-select\"\r\n [class.open]=\"isStoreDaysDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreDaysDropdown($event)\">\r\n <span>{{ selectedDaysLabel }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isStoreDaysDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let opt of daysOptions\"\r\n (click)=\"selectStoreDays($event, opt)\">\r\n {{ opt.label }}\r\n </button>\r\n </div>\r\n </div>\r\n <span class=\"bold\" style=\"font-weight: 500;\">AND</span>\r\n <span>has footfall accuracy</span>\r\n <!-- Accuracy Dropdown -->\r\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isStoreAccuracyDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreAccuracyDropdown($event)\">\r\n <span>\r\n >={{ footfallDirConfigurationForm.get('accuracyBreach.accuracy')?.value || '95%' }}\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isStoreAccuracyDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of [95, 96, 97, 98, 99]\"\r\n (click)=\"selectStoreAccuracy($event, p)\">\r\n >={{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Requests Table -->\r\n <div class=\"store-requests-table\" [class.disabled]=\"isEdit\"\r\n *ngIf=\"storeList?.length > 0; else emptyStoreRequests\">\r\n <div class=\"table-responsive\" [ngClass]=\"{'store-table-scroll': storeList?.length > 5}\">\r\n <table class=\"table table-hover store-requests-table-content\">\r\n <thead>\r\n <tr>\r\n <th class=\"checkbox-column\"></th>\r\n <th class=\"sortable store-name-column\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input type=\"checkbox\" [checked]=\"isAllSelected\" [disabled]=\"isEdit\"\r\n (change)=\"toggleSelectAll($event)\" />\r\n <span class=\"checkmark-select\"></span>\r\n <span class=\"ms-2\">Select all stores ({{ storeList?.length || 0\r\n }})</span>\r\n </label>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" class=\"ms-2 dropdown-arrow\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th class=\"sortable\">\r\n Raised on\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n Last raised(Approved)\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n No of Time Raised\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let store of storeList\">\r\n <td class=\"checkbox-column\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input #cb type=\"checkbox\" [checked]=\"isStoreSelected(store)\" [disabled]=\"isEdit\"\r\n (change)=\"toggleStoreSelection(store, cb.checked)\" />\r\n <span class=\"checkmark-select\"></span>\r\n </label>\r\n </td>\r\n <td>{{ store.storeName }}</td>\r\n <td>{{ store.raisedOn }}</td>\r\n <td>{{ store.lastApproved || '-' }}</td>\r\n <td>{{ store.totalRaised }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <ng-template #emptyStoreRequests>\r\n <div class=\"empty-store-state text-center\">\r\n <div class=\"empty-store-icon mb-3\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.94629 21.1995C8.645 21.2313 8.33828 21.2502 8.02734 21.2502C7.85782 21.2502 7.69052 21.2434 7.52539 21.2336V31.6067C7.52539 33.0347 8.70837 34.2258 10.1963 34.2258H29.8008C31.2888 34.2258 32.4717 33.0347 32.4717 31.6067V21.2346C32.3098 21.2438 32.1459 21.2502 31.9814 21.2502C31.6675 21.2502 31.3569 21.2323 31.0508 21.1995V28.9875H8.94629V21.1995ZM30.9277 5.77368H9.06934C8.89197 5.77368 8.73671 5.86647 8.65918 5.98755L8.65723 5.9895L5.14746 11.4729L5.05273 11.6204C3.82719 13.7402 5.0918 16.4671 7.44336 16.7766C7.64428 16.8011 7.83403 16.8157 8.02148 16.8157C9.25156 16.8157 10.3395 16.287 11.0967 15.4651L12.0186 14.4641L12.9375 15.468C13.6864 16.2861 14.7731 16.8157 16.0107 16.8157C17.2428 16.8156 18.3347 16.2854 19.083 15.468L20.0049 14.4612L20.9268 15.468C21.6751 16.2855 22.7668 16.8157 23.999 16.8157C25.2312 16.8157 26.3229 16.2854 27.0713 15.468L27.9932 14.4612L28.915 15.468C29.6634 16.2855 30.756 16.8157 31.9883 16.8157C32.1697 16.8157 32.3648 16.8018 32.5645 16.7776H32.5635C34.9572 16.4571 36.2254 13.6075 34.8574 11.4729L34.8564 11.4739L31.3398 5.99048L31.3389 5.98755C31.2614 5.86628 31.1053 5.77368 30.9277 5.77368Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <p class=\"mb-0 fw-semibold text-muted\">No reset request from store</p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <hr class=\"ms-4 me-4\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n <!-- Tango Review -->\r\n <!-- <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-3 mb-3\">\r\n <label>Send Ticket to Tango if accuracy falls below</label>\r\n <input type=\"text\" class=\"form-control w-25\" formControlName=\"tangoReview\">\r\n </div> -->\r\n <div class=\"row\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n <div class=\"card p-4 mb-4 tango-review-card\">\r\n <div class=\"d-flex align-items-center gap-2 mb-1\">\r\n <h5 class=\"fw-bold m-0\">Send Ticket to Tango</h5>\r\n </div>\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"me-2 mb-0 tango-label\">Send ticket to Tango if accuracy falls below</label>\r\n <div class=\"position-relative ff-select-wrapper compact ms-0\" [class.open]=\"issendTangoDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleSendTangoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('tangoReview')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"issendTangoDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of sendTicketTango\"\r\n (click)=\"selectSendTicketTango($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!isEdit\">\r\n <div class=\"mb-5 w-100 footer-seperator\"></div>\r\n <div class=\"d-flex justify-content-end\">\r\n <a type=\"button\" class=\"btn btn-outline mt-1 me-4\" (click)=\"onCancel()\">Cancel</a>\r\n <a type=\"submit\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\"><span>Save Changes</span></a>\r\n </div>\r\n </div>\r\n\r\n <!-- Category Modal -->\r\n <ng-template #categoryModal>\r\n <div class=\"modal-header border-0 pb-0\">\r\n <h5 class=\"modal-title\">\r\n {{ categoryModalMode === 'add' ? 'Add New Category' : 'Edit Category' }}\r\n </h5>\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"closeCategoryModal()\"></button>\r\n </div>\r\n <div class=\"modal-body category-modal-body\">\r\n <form [formGroup]=\"categoryForm\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Icon</label>\r\n <div class=\"ff-select-wrapper icon-select\" [class.open]=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryIconDropdown($event)\">\r\n <span class=\"d-inline-flex align-items-center gap-2\">\r\n <span class=\"category-icon\"\r\n [ngClass]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <ng-container [ngSwitch]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <!-- Blue Tag SVG -->\r\n <!-- <svg *ngSwitchCase=\"'blueTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> -->\r\n <!-- Purple Tag SVG -->\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- Orange Tag SVG -->\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- House Keeping Tag SVG -->\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_icon_housekeeping)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_icon_housekeeping\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <!-- Junk Tag SVG -->\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span class=\"icon-label\">{{ selectedCategoryIconLabel }}</span>\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option d-flex align-items-center gap-2\"\r\n *ngFor=\"let icon of categoryIcons\"\r\n (click)=\"selectCategoryIconFromDropdown($event, icon.value)\">\r\n <span class=\"category-icon\" [ngClass]=\"icon.value\">\r\n <ng-container [ngSwitch]=\"icon.value\">\r\n <!-- Blue Tag SVG -->\r\n <!-- <svg *ngSwitchCase=\"'blueTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> -->\r\n <!-- Purple Tag SVG -->\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- Orange Tag SVG -->\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <!-- House Keeping Tag SVG -->\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"#344054\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <!-- Junk Tag SVG -->\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span>{{ icon.label }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Category Name</label>\r\n <input type=\"text\" class=\"form-control\" \r\n [class.is-invalid]=\"categoryForm.get('name')?.invalid && categoryForm.get('name')?.touched\"\r\n placeholder=\"Enter your new category\"\r\n formControlName=\"name\" />\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('required') && categoryForm.get('name')?.touched\">\r\n Category name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('duplicate') && categoryForm.get('name')?.touched\">\r\n Category name already exists.\r\n </small>\r\n </div>\r\n\r\n <div class=\"mb-2\">\r\n <label class=\"form-label text-muted\">Limitation</label>\r\n <div class=\"ff-select-wrapper\" [class.open]=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryLimitDropdown($event)\">\r\n <span>{{ categoryForm.get('limit')?.value || percentageList[0] }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectCategoryLimitValue($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"modal-footer border-0 pt-0\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeCategoryModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"submitCategoryForm()\">\r\n {{ categoryModalMode === 'add' ? 'Create' : 'Save' }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Delete Confirmation Modal -->\r\n <ng-template #deleteCategoryModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Confirmation</h5>\r\n <p class=\"mb-4 text-muted\">\r\n You're about to delete <span class=\"fw-semibold\">{{ categoryPendingDeleteName }}</span> category.\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeDeleteModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger\" (click)=\"confirmDeleteCategory()\">Delete</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Reset Store Requests Confirmation Modal -->\r\n <ng-template #resetConfirmationModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Reset Store Requests</h5>\r\n <p class=\"mb-4 text-muted\">\r\n Are you sure you want to proceed with resetting the selected <span class=\"fw-semibold\">{{\r\n resetRequest.arrayOfStores.length }}</span> store(s) requests?\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeResetModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"confirmResetStoreRequest()\">Reset</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n</form>", styles: [".tango-review-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 8px 30px #0f172a14}.tango-icon{width:28px;height:28px;border-radius:50%;background:#2e90fa26;display:inline-flex;align-items:center;justify-content:center}.tango-label{font-size:13px;color:#475467;font-weight:500}form{background:#fff;padding:32px 40px;border-radius:16px;box-shadow:0 2px 12px #0000000d;font-family:Inter,Segoe UI,sans-serif}.section-divider{border-bottom:1px solid #e4e7ec;margin:40px 0}.sub-header{font-size:16px;font-weight:600;color:#111827;margin-bottom:6px}.sub-text{font-size:13px;color:#6b7280;margin-bottom:12px}.form-check{display:flex;align-items:center;gap:10px}.form-check-input{width:42px;height:22px;cursor:pointer;accent-color:#2563eb;border:1px solid #d1d5db;transition:all .2s ease-in-out}.form-check-input:checked{background-color:#2563eb;border-color:#2563eb}.form-check-input:disabled{opacity:.6;cursor:not-allowed}.toggle-label{font-size:13px;font-weight:500;color:#374151}input[type=radio].form-check-input{width:16px;height:16px;accent-color:#2563eb}input[type=radio]:checked{border-color:#2563eb}select.form-select{border:1px solid #d1d5db;border-radius:8px;height:38px;font-size:14px;color:#374151;padding:6px 10px;outline:none;transition:.2s}select.form-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.btn-outline{background-color:#fff;border:1px solid #d1d5db;color:#374151;padding:6px 16px;border-radius:8px;transition:all .2s}.btn-outline:hover{background:#f9fafb}.btn-primary{background-color:#2563eb;border:none;color:#fff;border-radius:8px;padding:6px 16px;transition:.2s}.btn-primary:hover{background-color:#1e40af}.col-lg-3,.col-xl-3,.col-xxl-3{margin-bottom:20px}.approver-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.approver-option{display:flex;flex-direction:column;justify-content:flex-start;width:220px}.custom-checkbox{position:relative;display:flex;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.custom-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer}.custom-checkbox .checkmark{height:20px;width:20px;border:2px solid #d0d5dd;border-radius:6px;display:inline-block;transition:all .2s ease}.custom-checkbox input:checked~.checkmark{background-color:#004aad;border-color:#004aad}.custom-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.label-text{display:flex;flex-direction:column}.label-text .title{font-weight:600;color:#101828}.label-text .desc{font-size:13px;color:#667085;margin-top:2px;max-width:190px;line-height:1.4}.custom-checkbox input:not(:checked)~.label-text .desc{opacity:.6}.approver-option.disabled-option{opacity:.6;pointer-events:none}.approver-option.disabled-option .custom-checkbox.disabled-checkbox{cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .checkmark{background-color:#f3f4f6;border-color:#d1d5dd;cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark{background-color:#f3f4f6;border-color:#d1d5dd}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.5}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .title{color:#9ca3af}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .desc{color:#d1d5dd}.day-select{width:70px!important;padding-left:10px!important;padding-right:25px!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='black' class='bi bi-caret-down-fill' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592c.86 0 1.319 1.013.753 1.658l-4.796 5.482a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 8px center!important;background-size:12px!important;border-radius:6px!important}.switch{position:relative;display:inline-block;width:44px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ddd;transition:.3s;border-radius:22px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}input:checked+.slider{background-color:#4c9aff}input:checked+.slider:before{transform:translate(21px)}.switch.disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.switch.disabled .slider{cursor:not-allowed;background-color:#e5e7eb}.switch.disabled input:checked+.slider{background-color:#7dd3fc}.accuracy-select{width:90px!important;border-radius:6px!important;padding-left:10px!important;padding-right:25px!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='black' class='bi bi-caret-down-fill' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592c.86 0 1.319 1.013.753 1.658l-4.796 5.482a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E\")!important;background-position:right 10px center!important;background-repeat:no-repeat!important;background-size:12px!important}.limitation-grid{margin-top:.5rem}.limitation-item{flex:0 0 220px;min-width:180px;background:#fff;border:1px solid #e6e9ef;border-radius:10px;padding:12px;display:flex;flex-direction:column;gap:8px;box-shadow:0 1px 2px #10182808}.limitation-item label{margin:0;font-weight:600;color:#111827}.limitation-select{width:100%;border-radius:8px;padding-left:10px!important;padding-right:25px!important;height:38px;background-color:#fff}.category-grid{display:flex;flex-wrap:wrap;gap:12px}.category-card{min-width:180px;position:relative}.category-card-header{display:flex;align-items:center}.category-icon{width:32px;height:32px;min-width:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.category-name{font-weight:500;color:#101828;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-percentage-section{width:100%}.category-percentage-section .ff-select-wrapper.compact{width:100%;min-width:auto}.category-percentage-section .ff-select-toggle.small{width:100%;min-height:36px;padding:6px 10px;font-size:13px}.category-menu-btn{border:none;background:transparent;padding:4px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px;display:inline-flex;align-items:center;justify-content:center}.category-menu-btn:disabled{cursor:default}.category-menu{position:absolute;top:48px;right:16px;background:#fff;border:1px solid #e4e7ec;border-radius:10px;box-shadow:0 12px 30px #0f172a26;min-width:140px;z-index:5;padding:4px}.category-menu button{width:100%;text-align:left;background:transparent;border:none;padding:8px 10px;border-radius:8px;font-size:13px;color:#101828}.category-menu button:hover{background:#f4f7fb}.limit-label{font-size:12px;text-transform:uppercase;letter-spacing:.04em}.alert-soft-primary{background:#eff4ff;border:1px solid #d6e2ff;border-radius:10px;padding:10px 14px;font-size:13px;color:#004aad}.badge-dot{width:8px;height:8px;border-radius:999px;background:#004aad;display:inline-block}.icon-picker{display:flex;gap:12px;flex-wrap:wrap}.icon-pill{width:56px;height:56px;border-radius:12px;border:1px solid #e4e7ec;background:#fff;display:inline-flex;align-items:center;justify-content:center;transition:all .2s ease}.icon-pill.active{border-color:#004aad;box-shadow:0 0 0 4px #004aad1f}.icon-pill:hover{border-color:#c7d7fd}.tag-blue,.blueTag{color:#004aad}.tag-purple,.purpleTag{color:#7c3aed}.tag-orange,.orangeTag{color:#ea580c}.category-modal-body .form-control,.category-modal-body .form-select{border-radius:10px;min-height:44px}.category-modal-body .form-label{font-size:13px}.category-modal-body .text-danger{font-size:12px}.card .btn-outline.btn-sm{padding:6px 10px;border-radius:8px}.add-new-btn{background:#fff;border:1px solid #d0d5dd;border-radius:10px;padding:5px 13px;font-size:14px;font-weight:600;color:#101828;transition:all .2s ease;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:0 1px 2px #1018280d}.add-new-btn:hover:not(:disabled){background:#f9fafb;border-color:#004aad;color:#004aad;box-shadow:0 2px 4px #10182814}.add-new-btn:active:not(:disabled){background:#f4f7fb;transform:translateY(1px);box-shadow:0 1px 2px #1018280d}.add-new-btn:disabled{opacity:.6;cursor:not-allowed;background:#f9fafb;border-color:#e5e7eb;color:#9ca3af}.add-new-btn svg{transition:transform .2s ease;flex-shrink:0}.add-new-btn:hover:not(:disabled) svg{transform:rotate(90deg)}.info-icon{display:inline-flex;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;border-radius:50%;background:#f3f3f3;color:#555;cursor:pointer;margin-left:6px;border:1.5px solid #8a8a8a}.store-requests-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.reset-btn{border-width:1px;border-color:#d0d5dd;color:#004aad;font-weight:600;padding:6px 18px;background-color:#fff;transition:all .2s ease}.reset-btn svg path{stroke:currentColor}.reset-btn .spinner-border{color:#004aad}.reset-btn:disabled{opacity:.6;cursor:not-allowed}.reset-btn:not(:disabled):hover{background-color:#f4f7fb;border-color:#004aad;box-shadow:0 1px 2px #1018280f}.restriction-criteria{padding:16px 0;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb}.restriction-select{min-width:140px;padding-left:10px!important;padding-right:30px!important;border-radius:6px!important;border:1px solid #d1d5db;font-size:14px;height:36px;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='black' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592c.86 0 1.319 1.013.753 1.658l-4.796 5.482a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:12px!important}.restriction-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.select-all-row{padding:8px 0}.custom-checkbox-select{position:relative;display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-checkbox-select input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:0;height:0}.checkmark-select{height:18px;width:18px;border:2px solid #d0d5dd;border-radius:4px;display:inline-block;transition:all .2s ease;position:relative}.custom-checkbox-select input:checked~.checkmark-select{background-color:#2563eb;border-color:#2563eb}.custom-checkbox-select input:checked~.checkmark-select:after{content:\"\";position:absolute;left:5px;top:2px;width:4px;height:8px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.dropdown-arrow{cursor:pointer;transition:transform .2s}.dropdown-arrow:hover{transform:translateY(2px)}.store-requests-table{margin-top:16px;position:relative}.store-requests-table.disabled{pointer-events:none;opacity:.6;-webkit-user-select:none;user-select:none}.store-requests-table-content{border-collapse:separate;border-spacing:0;width:100%}.store-requests-table-content thead{background-color:#f9fafb}.store-requests-table-content thead th{padding:12px 16px;font-weight:600;font-size:13px;color:#344054;text-align:left;border-bottom:1px solid #e5e7eb;white-space:nowrap;background-color:#f9fafb;vertical-align:top}.store-requests-table-content tbody td{padding:12px 16px;font-size:14px;color:#101828;border-bottom:1px solid #f2f4f7}.store-requests-table-content tbody tr:hover{background-color:#f9fafb}.store-requests-table-content tbody tr:last-child td{border-bottom:none}.store-table-scroll{max-height:360px;overflow-y:auto}.store-table-scroll table{margin-bottom:0}.store-table-scroll .store-requests-table-content thead th{position:sticky;top:0;z-index:2}.checkbox-column{width:110px;padding-left:16px!important}.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.sortable:hover{background-color:#f3f4f6}.sort-icon{opacity:.6;transition:opacity .2s}.sortable:hover .sort-icon{opacity:1}.store-name-column{min-width:260px}.store-name-column .column-header{justify-content:space-between}.store-name-column .select-all-row{padding-top:8px;margin-top:8px;border-top:1px solid #e5e7eb}.empty-store-state{border:1px solid #e5e7eb;border-radius:12px;padding:40px 16px;background:#f9fbff;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-store-icon{display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;background:#2e90fa1f}.store-days-select .ff-select-toggle{min-width:99px}.store-days-select .ff-select-toggle span{white-space:nowrap}.custom-modal{border-radius:16px;padding:10px 20px 20px;background:#fff;box-shadow:0 10px 40px #00000014;width:500px}.field-label{color:#8b8b8b;font-size:14px;margin-bottom:4px;display:block}.input-box{width:100%;height:46px;border:1px solid #e5e7eb;border-radius:10px;padding:0 14px;font-size:15px;background:#f8fafc;display:flex;align-items:center}.input-box:focus-within{border-color:#4daeff;background:#fff;box-shadow:0 0 0 2px #4daeff26}.icon-row{display:flex}.icon-box{width:60px;cursor:pointer;justify-content:space-between}.tag-icon{width:18px;height:18px;background-image:url(\"data:image/svg+xml,<svg ... />\");background-size:contain}.arrow-down{width:12px;height:12px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg)}.clean-select{border:none;width:100%;height:100%;background:transparent;font-size:15px;outline:none}.select-box{padding:0}.button-area{display:flex;justify-content:space-between;gap:15px}.btn-cancel{width:50%;height:46px;border-radius:10px;border:1px solid #dbdbdb;background:#fff;font-weight:500;cursor:pointer}.btn-create{width:50%;height:46px;border-radius:10px;border:none;background:#0094ff;color:#fff;font-weight:600;cursor:pointer}.btn-create:hover{background:#007bdb}.ff-select-wrapper{width:100%;position:relative}.ff-select-wrapper.compact{width:auto;min-width:80px}.ff-select-wrapper.disabled{pointer-events:none;opacity:.7}.ff-select-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid #d0d5dd;border-radius:10px;padding:8px 12px;background:#fff;font-weight:600;color:#101828;min-height:40px}.ff-select-toggle.small{min-height:36px;padding:6px 10px;font-size:13px}.ff-select-toggle svg{transition:transform .2s ease}.ff-select-wrapper.open .ff-select-toggle svg{transform:rotate(180deg)}.ff-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid #e4e7ec;border-radius:12px;box-shadow:0 16px 40px #0f172a26;max-height:220px;overflow-y:auto;z-index:15;padding:4px}.ff-select-option{width:100%;text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:8px;font-size:14px;color:#101828}.ff-select-option:hover{background:#f4f7fb}\n"] }]
829
838
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.GlobalStateService }, { type: i3.ClientApiService }, { type: i4.NgbModal }, { type: i5.ToastService }], propDecorators: { categoryModalTpl: [{
830
839
  type: ViewChild,
831
840
  args: ['categoryModal']
@@ -839,4 +848,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
839
848
  type: HostListener,
840
849
  args: ['document:click']
841
850
  }] } });
842
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBdUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQVcxQyxNQUFNLE9BQU8sOEJBQThCO0lBb0RyQjtJQUNYO0lBQ0M7SUFDQTtJQUNBO0lBdkRWLDRCQUE0QixDQUFhO0lBQ3hCLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzFDLFlBQVksR0FBbUY7UUFDN0YsUUFBUSxFQUFFLEVBQUU7UUFDWixhQUFhLEVBQUUsRUFBRTtLQUNsQixDQUFDO0lBQ0Ysc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25DLGNBQWMsR0FBYSxFQUFFLENBQUM7SUFDOUIsc0JBQXNCLEdBQWEsRUFBRSxDQUFDO0lBQ3RD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Q0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzNDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDM0I7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLHlCQUF5QjtRQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUM5RixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDdEUsT0FBTyxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO3dHQXQ0QlUsOEJBQThCOzRGQUE5Qiw4QkFBOEIsc2RDakIzQywweDNEQTR3Qk87OzRGRDN2Qk0sOEJBQThCO2tCQVAxQyxTQUFTOytCQUNFLDRCQUE0QjtrTUFzRFYsZ0JBQWdCO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ1Esc0JBQXNCO3NCQUF2RCxTQUFTO3VCQUFDLHFCQUFxQjtnQkFDSyx5QkFBeUI7c0JBQTdELFNBQVM7dUJBQUMsd0JBQXdCO2dCQThnQm5DLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdiTW9kYWwsIE5nYk1vZGFsUmVmIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgQ2xpZW50QXBpU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NsaWVudC1hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZm9vdGZhbGwtY29uZmlndXJhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBGb290ZmFsbENvbmZpZ3VyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcmVzZXRSZXF1ZXN0OiB7IGNsaWVudElkOiBzdHJpbmc7IGFycmF5T2ZTdG9yZXM6IHsgc3RvcmVJZDogc3RyaW5nOyBkYXRlU3RyaW5nOiBzdHJpbmcgfVtdIH0gPSB7XHJcbiAgICBjbGllbnRJZDogJycsXHJcbiAgICBhcnJheU9mU3RvcmVzOiBbXVxyXG4gIH07XHJcbiAgc3BvY1RpY2tldENyZWF0aW9uZGF5cyA9IFsxLCAyLCAzXTtcclxuICBwZXJjZW50YWdlTGlzdDogbnVtYmVyW10gPSBbXTtcclxuICBhY2N1cmFjeVBlcmNlbnRhZ2VMaXN0OiBudW1iZXJbXSA9IFtdO1xyXG4gIHN0b3JlVGlja2V0RGF5czogbnVtYmVyW10gPSBbXTtcclxuICBzZW5kVGlja2V0VGFuZ286IG51bWJlcltdID0gW107XHJcbiAgaXNFZGl0OiBib29sZWFuID0gdHJ1ZTtcclxuICBjbGllbklkOiBzdHJpbmc7XHJcbiAgc3RvcmVMaXN0OiBhbnkgPSBbXTtcclxuICBpc1Jlc2V0dGluZyA9IGZhbHNlO1xyXG4gIGNhdGVnb3J5Rm9ybSE6IEZvcm1Hcm91cDtcclxuICBjYXRlZ29yeU1vZGFsTW9kZTogJ2FkZCcgfCAnZWRpdCcgPSAnYWRkJztcclxuICBlZGl0aW5nQ2F0ZWdvcnlJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgY2F0ZWdvcnlNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcclxuICBkZWxldGVNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcclxuICByZXNldE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xyXG4gIGNhdGVnb3J5VG9EZWxldGVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgY2F0ZWdvcnlQZW5kaW5nRGVsZXRlTmFtZSA9ICcnO1xyXG4gIGFjdGl2ZU1lbnVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgb3BlbkxpbWl0RHJvcGRvd25JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICBpc0F1dG9DbG9zZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzU3RvcmVEYXlzRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSByZXZpc2lvbkRlcHNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHJlYWRvbmx5IG1heENhdGVnb3J5Q291bnQgPSA1O1xyXG4gIHJlYWRvbmx5IGJhc2VDYXRlZ29yeUljb25zOmFueSA9IFtcclxuICAgIC8vIHsgbGFiZWw6ICdCbHVlIFRhZycsIHZhbHVlOiAnYmx1ZVRhZycgfSxcclxuICAgIHsgbGFiZWw6ICdQdXJwbGUgVGFnJywgdmFsdWU6ICdwdXJwbGVUYWcnIH0sXHJcbiAgICB7IGxhYmVsOiAnT3JhbmdlIFRhZycsIHZhbHVlOiAnb3JhbmdlVGFnJyB9XHJcbiAgXTtcclxuXHJcbiAgcmVhZG9ubHkgYWRkaXRpb25hbENhdGVnb3J5SWNvbnMgPSBbXHJcbiAgICB7IGxhYmVsOiAnSG91c2UgS2VlcGluZycsIHZhbHVlOiAnaG91c2VLZWVwaW5nVGFnJyB9LFxyXG4gICAgeyBsYWJlbDogJ0p1bmsnLCB2YWx1ZTogJ2p1bmtUYWcnIH1cclxuICBdO1xyXG5cclxuICBmb290ZmFsbENvbmZpZ0RhdGE6IGFueSA9IFtdO1xyXG4gIEBWaWV3Q2hpbGQoJ2NhdGVnb3J5TW9kYWwnKSBjYXRlZ29yeU1vZGFsVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdkZWxldGVDYXRlZ29yeU1vZGFsJykgZGVsZXRlQ2F0ZWdvcnlNb2RhbFRwbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgncmVzZXRDb25maXJtYXRpb25Nb2RhbCcpIHJlc2V0Q29uZmlybWF0aW9uTW9kYWxUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHB1YmxpYyBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBDbGllbnRBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlKSB7XHJcbiAgICAgIHRoaXMuYXBpU2VydmljZS5jbGllbnRJZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChlKSA9PiB7XHJcbiAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgdGhpcy5jbGllbklkID0gZVxyXG4gICAgICAgIHRoaXMucmVzZXRSZXF1ZXN0LmNsaWVudElkID0gZTtcclxuICAgICAgICB0aGlzLmdldENsaWVudE1hcHBlZFN0b3Jlc0RldGFpbHMoZSk7XHJcbiAgICAgICAgLy8gTG9hZCBmb290ZmFsbCBkZXRhaWxzIHdoZW4gY2xpZW50SWQgaXMgYXZhaWxhYmxlXHJcbiAgICAgICAgLy8gdGhpcy5sb2FkRm9vdGZhbGxDb25maWdEZXRhaWxzKGUpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRDYXRlZ29yeUZvcm0oKTtcclxuICAgIHRoaXMubG9hZEZvcm0oKTtcclxuICAgIHRoaXMuZ2VuZXJhdGVEYXlPcHRpb25zKDQ1KTtcclxuICAgIHRoaXMuZ2VuZXJhdGVEaXJMaW1pdGF0aW9uKDEwMCk7XHJcbiAgICB0aGlzLmdlbmVyYXRlQWNjdXJhY3lPcHRpb25zKDk1KTtcclxuICAgIHRoaXMuc2VuZFRpY2tldFRvVGFuZ28oMTAwKTtcclxuICAgIHRoaXMuYXBpU2VydmljZS5jbGllbnRGb3JtRGF0YS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChyZXMpID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIGlmIChyZXMudHlwZSA9PT0gJ2lucHV0JyAmJiByZXMuZm9ybSA9PT0gJ2Zvb3RmYWxsRGlyZWN0b3J5Q29uZmlncycpIHtcclxuICAgICAgICAgIHRoaXMucGF0Y2hGb3JtKHJlcy52YWx1ZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBmb290ZmFsbCBkZXRhaWxzIGZyb20gQVBJIHdoZW4gY2xpZW50SWQgaXMgYXZhaWxhYmxlXHJcbiAgICogVGhpcyBlbnN1cmVzIGNsaWVuSWQgaXMgc2V0IGJlZm9yZSBtYWtpbmcgdGhlIEFQSSBjYWxsXHJcbiAgICovXHJcbiAgLy8gcHJpdmF0ZSBsb2FkRm9vdGZhbGxDb25maWdEZXRhaWxzKGNsaWVudElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAvLyAgIGlmICghY2xpZW50SWQpIHtcclxuICAvLyAgICAgcmV0dXJuO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy5hcGlTZXJ2aWNlLmdldEZvb3RmYWxsRGV0YWlscyhjbGllbnRJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAvLyAgICAgICBpZiAocmVzKSB7XHJcbiAgLy8gICAgICAgICBjb25zb2xlLmxvZygnRm9vdGZhbGwgRGlyZWN0b3J5IENvbmZpZ3MgZGF0YSA6OicsIHJlcyk7XHJcbiAgLy8gICAgICAgICBpZiAocmVzPy5kYXRhICYmIHJlcz8uZGF0YT8uZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzKSB7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuZm9vdGZhbGxDb25maWdEYXRhID0gcmVzPy5kYXRhPy5mb290ZmFsbERpcmVjdG9yeUNvbmZpZ3M7XHJcbiAgLy8gICAgICAgICAgIHRoaXMucGF0Y2hGb3JtKHRoaXMuZm9vdGZhbGxDb25maWdEYXRhKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgLy8gICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBmb290ZmFsbCBkZXRhaWxzOicsIGVycik7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgZ2VuZXJhdGVEYXlPcHRpb25zKGNvdW50OiBudW1iZXIpIHtcclxuICB0aGlzLnN0b3JlVGlja2V0RGF5cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiBpICsgMSk7XHJcbiB9XHJcblxyXG4gIGdlbmVyYXRlRGlyTGltaXRhdGlvbihjb3VudDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnBlcmNlbnRhZ2VMaXN0ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKF8sIGkpID0+IGkgKyAxKTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlQWNjdXJhY3lPcHRpb25zKG1heDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFjY3VyYWN5UGVyY2VudGFnZUxpc3QgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBtYXggfSwgKF8sIGkpID0+IGkgKyAxKTtcclxuICB9XHJcblxyXG4gIHNlbmRUaWNrZXRUb1RhbmdvKG1heDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnNlbmRUaWNrZXRUYW5nbyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IG1heCB9LCAoXywgaSkgPT4gaSArIDEpO1xyXG4gIH1cclxuXHJcbiAgbG9hZEZvcm0oKSB7XHJcbiAgICAvLyBpbml0aWFsaXplIGZvcm1cclxuICAgIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICByZXZpc2lvbjogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICAgIGFsbG93VGlja2V0Q3JlYXRpb246IFtudWxsXSxcclxuICAgICAgaXNBdXRvQ2xvc2VFbmFibGU6IFtmYWxzZV0sXHJcbiAgICAgIGF1dG9DbG9zZUFjY3VyYWN5OiBbJyddLFxyXG4gICAgICB0YWdnaW5nTGltaXRhdGlvbjogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICAgIGFjY3VyYWN5QnJlYWNoOiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICB0aWNrZXRDb3VudDogWycnXSxcclxuICAgICAgICBkYXlzOiBbXSxcclxuICAgICAgICBhY2N1cmFjeTogWycnXVxyXG4gICAgICB9KSxcclxuICAgICAgdGFuZ29SZXZpZXc6IFsnJ11cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcGF0Y2hGb3JtKGRhdGE6IGFueSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm47XHJcbiAgICAvLyBwYXRjaCByZXZpc2lvblxyXG4gICAgY29uc3QgcmV2aXNpb25BcnJheSA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3JldmlzaW9uJykgYXMgRm9ybUFycmF5O1xyXG4gICAgcmV2aXNpb25BcnJheS5jbGVhcigpO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS5yZXZpc2lvbikpIHtcclxuICAgICAgZGF0YS5yZXZpc2lvbi5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICByZXZpc2lvbkFycmF5LnB1c2godGhpcy5jcmVhdGVSZXZpc2lvbihpdGVtLmFjdGlvblR5cGUsIGl0ZW0uaXNDaGVja2VkKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHBhdGNoIHRhZ2dpbmdMaW1pdGF0aW9uIC0tIGJhc2VkIG9uIG5ldyBrZXkgZm9ybWF0IFwiZWZmZWN0aXZlRnJvbVwiXHJcbiAgICBjb25zdCB0YWdBcnJheSA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3RhZ2dpbmdMaW1pdGF0aW9uJykgYXMgRm9ybUFycmF5O1xyXG4gICAgdGFnQXJyYXkuY2xlYXIoKTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGE/LnRhZ2dpbmdMaW1pdGF0aW9uKSAmJiBkYXRhPy50YWdnaW5nTGltaXRhdGlvbj8ubGVuZ3RoID4gMCAmJiBcclxuICAgIGRhdGE/LnRhZ2dpbmdMaW1pdGF0aW9uPy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgLy8gT25seSBvbmUgY29uZmlnIHByZXNlbnQg4oCTIHVzZSBpdHMgdmFsdWVzIGRpcmVjdGx5XHJcbiAgICAgIGRhdGE/LnRhZ2dpbmdMaW1pdGF0aW9uWzBdPy52YWx1ZXM/LmZvckVhY2goKHRhZzogYW55KSA9PiB7XHJcbiAgICAgICAgdGFnQXJyYXkucHVzaCh0aGlzLmNyZWF0ZVRhZ0xpbWl0KHRhZz8udHlwZSwgdGFnPy52YWx1ZSwgdGFnPy5pY29uTmFtZSwgdGFnPy5uYW1lLCB0YWc/LmtleSkpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhPy50YWdnaW5nTGltaXRhdGlvbikgJiYgZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24/Lmxlbmd0aCA+IDAgJiYgXHJcbiAgICBkYXRhPy50YWdnaW5nTGltaXRhdGlvbj8ubGVuZ3RoID4gMSkge1xyXG4gICAgICAvLyBNdWx0aXBsZSBjb25maWdzIHByZXNlbnQg4oCTIHBpY2sgdGhlIG9uZSB3aXRoIGxhdGVzdCBlZmZlY3RpdmVGcm9tIGRhdGVcclxuICAgICAgY29uc3QgbGF0ZXN0RW50cnkgPSBkYXRhLnRhZ2dpbmdMaW1pdGF0aW9uLnJlZHVjZSgobGF0ZXN0OiBhbnksIGN1cnJlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghY3VycmVudCB8fCAhY3VycmVudC5lZmZlY3RpdmVGcm9tKSB7XHJcbiAgICAgICAgICByZXR1cm4gbGF0ZXN0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWxhdGVzdCB8fCAhbGF0ZXN0LmVmZmVjdGl2ZUZyb20pIHtcclxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnQuZWZmZWN0aXZlRnJvbSk7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0RGF0ZSA9IG5ldyBEYXRlKGxhdGVzdC5lZmZlY3RpdmVGcm9tKTtcclxuICAgICAgICByZXR1cm4gY3VycmVudERhdGUgPiBsYXRlc3REYXRlID8gY3VycmVudCA6IGxhdGVzdDtcclxuICAgICAgfSwgbnVsbCk7XHJcblxyXG4gICAgICBpZiAobGF0ZXN0RW50cnkgJiYgQXJyYXkuaXNBcnJheShsYXRlc3RFbnRyeS52YWx1ZXMpKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2VmZmVjdGl2ZUZyb206JywgbGF0ZXN0RW50cnkuZWZmZWN0aXZlRnJvbSk7XHJcbiAgICAgICAgbGF0ZXN0RW50cnkudmFsdWVzLmZvckVhY2goKHRhZzogYW55KSA9PiB7XHJcbiAgICAgICAgICB0YWdBcnJheS5wdXNoKHRoaXMuY3JlYXRlVGFnTGltaXQodGFnPy50eXBlLCB0YWc/LnZhbHVlLCB0YWc/Lmljb25OYW1lLCB0YWc/Lm5hbWUsIHRhZz8ua2V5KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwYXRjaCBhY2N1cmFjeUJyZWFjaCBncm91cFxyXG4gICAgaWYgKGRhdGEuYWNjdXJhY3lCcmVhY2gpIHtcclxuICAgICAgdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYWNjdXJhY3lCcmVhY2gnKT8ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgdGlja2V0Q291bnQ6IGRhdGEuYWNjdXJhY3lCcmVhY2gudGlja2V0Q291bnQsXHJcbiAgICAgICAgZGF5czogZGF0YS5hY2N1cmFjeUJyZWFjaC5kYXlzLFxyXG4gICAgICAgIGFjY3VyYWN5OiBkYXRhLmFjY3VyYWN5QnJlYWNoLmFjY3VyYWN5XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHBhdGNoIHNpbXBsZSBmaWVsZHNcclxuICAgIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgYWxsb3dUaWNrZXRDcmVhdGlvbjogZGF0YS5hbGxvd1RpY2tldENyZWF0aW9uID8/IDMsXHJcbiAgICAgIGlzQXV0b0Nsb3NlRW5hYmxlOiBkYXRhLmlzQXV0b0Nsb3NlRW5hYmxlID8/IGZhbHNlLFxyXG4gICAgICBhdXRvQ2xvc2VBY2N1cmFjeTogZGF0YS5hdXRvQ2xvc2VBY2N1cmFjeSA/PyAnOTUlJyxcclxuICAgICAgdGFuZ29SZXZpZXc6IGRhdGEudGFuZ29SZXZpZXcgPz8gJzg1JSdcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmRpc2FibGUoKTtcclxuICAgIC8vIEFwcGx5IGRlcGVuZGVuY3kgbG9naWNcclxuICAgIHRoaXMuaGFuZGxlUmV2aXNpb25EZXBlbmRlbmNpZXMoKTtcclxuICB9XHJcblxyXG4gIG9wZW5DYXRlZ29yeU1vZGFsKG1vZGU6ICdhZGQnIHwgJ2VkaXQnLCBpbmRleD86IG51bWJlcikge1xyXG4gICAgaWYgKG1vZGUgPT09ICdhZGQnICYmIHRoaXMuaXNDYXRlZ29yeUxpbWl0UmVhY2hlZCkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnTWF4aW11bSBDYXRlZ29yeSBjcmVhdGlvbiBsaW1pdCByZWFjaGVkJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9IG1vZGU7XHJcbiAgICB0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4ID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IGluZGV4IDogbnVsbDtcclxuXHJcbiAgICBpZiAobW9kZSA9PT0gJ2VkaXQnICYmIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgY2F0ZWdvcnlHcm91cCA9IHRoaXMudGFnTGltaXRzLmF0KHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgdGhpcy5jYXRlZ29yeUZvcm0uc2V0VmFsdWUoe1xyXG4gICAgICAgIGljb25OYW1lOiBjYXRlZ29yeUdyb3VwLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgfHwgdGhpcy5iYXNlQ2F0ZWdvcnlJY29uc1swXS52YWx1ZSxcclxuICAgICAgICBuYW1lOiBjYXRlZ29yeUdyb3VwLmdldCgnbmFtZScpPy52YWx1ZSB8fCBjYXRlZ29yeUdyb3VwLmdldCgndHlwZScpPy52YWx1ZSB8fCAnJyxcclxuICAgICAgICBsaW1pdDogY2F0ZWdvcnlHcm91cC5nZXQoJ3ZhbHVlJyk/LnZhbHVlIHx8IHRoaXMucGVyY2VudGFnZUxpc3RbMF1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhdGVnb3J5Rm9ybS5yZXNldCh7XHJcbiAgICAgICAgaWNvbk5hbWU6IHRoaXMuYmFzZUNhdGVnb3J5SWNvbnNbMF0udmFsdWUsXHJcbiAgICAgICAgbmFtZTogJycsXHJcbiAgICAgICAgbGltaXQ6IHRoaXMucGVyY2VudGFnZUxpc3RbMF1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYXRlZ29yeU1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmNhdGVnb3J5TW9kYWxUcGwsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIHNpemU6ICdtZCcsXHJcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcclxuICAgICAga2V5Ym9hcmQ6IHRydWVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0Q2F0ZWdvcnlGb3JtKCkge1xyXG4gICAgaWYgKHRoaXMuY2F0ZWdvcnlGb3JtLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5jYXRlZ29yeUZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgeyBpY29uTmFtZSwgbmFtZSwgbGltaXQgfSA9IHRoaXMuY2F0ZWdvcnlGb3JtLnZhbHVlO1xyXG4gICAgY29uc3QgdHJpbW1lZE5hbWUgPSAobmFtZSB8fCAnJykudHJpbSgpO1xyXG5cclxuICAgIGlmICghdHJpbW1lZE5hbWUpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdDYXRlZ29yeSBuYW1lIGlzIHJlcXVpcmVkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZHVwbGljYXRlSW5kZXggPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5maW5kSW5kZXgoKGN0cmwsIGlkeCkgPT5cclxuICAgICAgKGN0cmwuZ2V0KCduYW1lJyk/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSB0cmltbWVkTmFtZS50b0xvd2VyQ2FzZSgpIHx8IFxyXG4gICAgICAgY3RybC5nZXQoJ3R5cGUnKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09IHRyaW1tZWROYW1lLnRvTG93ZXJDYXNlKCkpICYmXHJcbiAgICAgIGlkeCAhPT0gKHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggPz8gLTEpXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChkdXBsaWNhdGVJbmRleCAhPT0gLTEpIHtcclxuICAgICAgY29uc3QgbmFtZUNvbnRyb2wgPSB0aGlzLmNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKTtcclxuICAgICAgbmFtZUNvbnRyb2w/LnNldEVycm9ycyh7IGR1cGxpY2F0ZTogdHJ1ZSB9KTtcclxuICAgICAgbmFtZUNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIGljb25OYW1lIGFscmVhZHkgZXhpc3RzXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmdJY29uID0gdGhpcy50YWdMaW1pdHMuY29udHJvbHMuZmluZCgoY3RybCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uTmFtZVxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKGV4aXN0aW5nSWNvbikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVGhpcyBpY29uIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnZWRpdCcgJiYgdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBJbiBlZGl0IG1vZGUsIGNoZWNrIGlmIGljb24gaXMgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5IChleGNsdWRpbmcgY3VycmVudCBvbmUpXHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nSWNvbiA9IHRoaXMudGFnTGltaXRzLmNvbnRyb2xzLmZpbmQoKGN0cmwsIGlkeCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uTmFtZSAmJiBpZHggIT09IHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXhcclxuICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChleGlzdGluZ0ljb24pIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1RoaXMgaWNvbiBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciBjYXRlZ29yeS4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgLy8gR2VuZXJhdGUgdHlwZSBmcm9tIG5hbWUgKGxvd2VyY2FzZSwgcmVtb3ZlIHNwYWNlcylcclxuICAgICAgY29uc3QgdHlwZSA9IHRyaW1tZWROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnJyk7XHJcbiAgICAgIGNvbnN0IGtleSA9IHR5cGUuY2hhckF0KDApO1xyXG4gICAgICB0aGlzLnRhZ0xpbWl0cy5wdXNoKHRoaXMuY3JlYXRlVGFnTGltaXQodHlwZSwgTnVtYmVyKGxpbWl0KSwgaWNvbk5hbWUsIHRyaW1tZWROYW1lLCBrZXkpKTtcclxuICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ0NhdGVnb3J5IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3J5R3JvdXAgPSB0aGlzLnRhZ0xpbWl0cy5hdCh0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4KSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgIGNhdGVnb3J5R3JvdXAucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgbmFtZTogdHJpbW1lZE5hbWUsXHJcbiAgICAgICAgdmFsdWU6IE51bWJlcihsaW1pdCksXHJcbiAgICAgICAgaWNvbk5hbWU6IGljb25OYW1lXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnQ2F0ZWdvcnkgdXBkYXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbG9zZUNhdGVnb3J5TW9kYWwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlQ2F0ZWdvcnlNb2RhbCgpIHtcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxSZWYpIHtcclxuICAgICAgdGhpcy5jYXRlZ29yeU1vZGFsUmVmLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMuY2F0ZWdvcnlNb2RhbFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb3BlbkRlbGV0ZUNhdGVnb3J5TW9kYWwoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXggPSBpbmRleDtcclxuICAgIGNvbnN0IGNhdGVnb3J5R3JvdXAgPSB0aGlzLnRhZ0xpbWl0cy5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgdGhpcy5jYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gY2F0ZWdvcnlHcm91cC5nZXQoJ25hbWUnKT8udmFsdWUgfHwgJ3RoaXMgY2F0ZWdvcnknO1xyXG4gICAgdGhpcy5kZWxldGVNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5kZWxldGVDYXRlZ29yeU1vZGFsVHBsLCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICBzaXplOiAnc20nLFxyXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXHJcbiAgICAgIGtleWJvYXJkOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25maXJtRGVsZXRlQ2F0ZWdvcnkoKSB7XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXggPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWdMaW1pdHMucmVtb3ZlQXQodGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXgpO1xyXG4gICAgdGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXggPSBudWxsO1xyXG4gICAgdGhpcy5jYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gJyc7XHJcbiAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnQ2F0ZWdvcnkgZGVsZXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICB0aGlzLmNsb3NlRGVsZXRlTW9kYWwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlRGVsZXRlTW9kYWwoKSB7XHJcbiAgICBpZiAodGhpcy5kZWxldGVNb2RhbFJlZikge1xyXG4gICAgICB0aGlzLmRlbGV0ZU1vZGFsUmVmLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMuZGVsZXRlTW9kYWxSZWYgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gJyc7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RDYXRlZ29yeUljb24oaWNvblZhbHVlOiBzdHJpbmcpIHtcclxuICAgIC8vIENoZWNrIGlmIGljb25OYW1lIGFscmVhZHkgZXhpc3RzXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmdJY29uID0gdGhpcy50YWdMaW1pdHMuY29udHJvbHMuZmluZCgoY3RybCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uVmFsdWVcclxuICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChleGlzdGluZ0ljb24pIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1RoaXMgaWNvbiBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciBjYXRlZ29yeS4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2VkaXQnICYmIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgLy8gSW4gZWRpdCBtb2RlLCBjaGVjayBpZiBpY29uIGlzIHVzZWQgYnkgYW5vdGhlciBjYXRlZ29yeSAoZXhjbHVkaW5nIGN1cnJlbnQgb25lKVxyXG4gICAgICBjb25zdCBleGlzdGluZ0ljb24gPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5maW5kKChjdHJsLCBpZHgpID0+IFxyXG4gICAgICAgIGN0cmwuZ2V0KCdpY29uTmFtZScpPy52YWx1ZSA9PT0gaWNvblZhbHVlICYmIGlkeCAhPT0gdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleFxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKGV4aXN0aW5nSWNvbikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVGhpcyBpY29uIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLmNhdGVnb3J5Rm9ybS5nZXQoJ2ljb25OYW1lJyk/LnNldFZhbHVlKGljb25WYWx1ZSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDYXRlZ29yeU1lbnUoZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuYWN0aXZlTWVudUluZGV4ID0gdGhpcy5hY3RpdmVNZW51SW5kZXggPT09IGluZGV4ID8gbnVsbCA6IGluZGV4O1xyXG4gIH1cclxuXHJcbiAgb25DYXRlZ29yeU1lbnVBY3Rpb24oZXZlbnQ6IEV2ZW50LCBhY3Rpb246ICdlZGl0JyB8ICdkZWxldGUnLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuYWN0aXZlTWVudUluZGV4ID0gbnVsbDtcclxuICAgIGlmIChhY3Rpb24gPT09ICdlZGl0Jykge1xyXG4gICAgICB0aGlzLm9wZW5DYXRlZ29yeU1vZGFsKCdlZGl0JywgaW5kZXgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcGVuRGVsZXRlQ2F0ZWdvcnlNb2RhbChpbmRleCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVMaW1pdERyb3Bkb3duKGV2ZW50OiBFdmVudCwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vcGVuTGltaXREcm9wZG93bkluZGV4ID0gdGhpcy5vcGVuTGltaXREcm9wZG93bkluZGV4ID09PSBpbmRleCA/IG51bGwgOiBpbmRleDtcclxuICB9XHJcblxyXG4gIHNlbGVjdExpbWl0VmFsdWUoZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSAodGhpcy50YWdMaW1pdHMuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ2F0ZWdvcnlMaW1pdERyb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9ICF0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHNlbGVjdENhdGVnb3J5TGltaXRWYWx1ZShldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuY2F0ZWdvcnlGb3JtLmdldCgnbGltaXQnKTtcclxuICAgIGNvbnRyb2w/LnNldFZhbHVlKHZhbHVlKTtcclxuICAgIGNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQXV0b0Nsb3NlRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpc0F1dG9DbG9zZUVuYWJsZWQgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdpc0F1dG9DbG9zZUVuYWJsZScpPy52YWx1ZTtcclxuICAgIGlmICghaXNBdXRvQ2xvc2VFbmFibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0F1dG9DbG9zZURyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbmRUYW5nb0Nsb3NlRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gIXRoaXMuaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RBdXRvQ2xvc2VBY2N1cmFjeShldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2F1dG9DbG9zZUFjY3VyYWN5Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShgJHt2YWx1ZX0lYCk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFNlbmRUaWNrZXRUYW5nbyhldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3RhbmdvUmV2aWV3Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShgJHt2YWx1ZX0lYCk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVRpY2tldENvdW50RHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzVGlja2V0Q291bnREcm9wZG93bk9wZW4gPSAhdGhpcy5pc1RpY2tldENvdW50RHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0VGlja2V0Q291bnQoZXZlbnQ6IEV2ZW50LCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC50aWNrZXRDb3VudCcpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzVGlja2V0Q291bnREcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVN0b3JlRGF5c0Ryb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc1N0b3JlRGF5c0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmlzU3RvcmVEYXlzRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U3RvcmVEYXlzKGV2ZW50OiBFdmVudCwgdmFsdWU6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYWNjdXJhY3lCcmVhY2guZGF5cycpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzU3RvcmVEYXlzRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTdG9yZUFjY3VyYWN5RHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzU3RvcmVBY2N1cmFjeURyb3Bkb3duT3BlbiA9ICF0aGlzLmlzU3RvcmVBY2N1cmFjeURyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHNlbGVjdFN0b3JlQWNjdXJhY3koZXZlbnQ6IEV2ZW50LCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC5hY2N1cmFjeScpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUoYCR7dmFsdWV9JWApO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzU3RvcmVBY2N1cmFjeURyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc0FsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bk9wZW4gPSAhdGhpcy5pc0FsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RBbGxvd1RpY2tldENyZWF0aW9uKGV2ZW50OiBFdmVudCwgdmFsdWU6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYWxsb3dUaWNrZXRDcmVhdGlvbicpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQ2F0ZWdvcnlMaW1pdFJlYWNoZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50YWdMaW1pdHMubGVuZ3RoID49IHRoaXMubWF4Q2F0ZWdvcnlDb3VudDtcclxuICB9XHJcblxyXG4gIGdldCBpc0FwcHJvdmVyRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByZXZpc2lvbnMgPSB0aGlzLnJldmlzaW9uQXJyYXkuY29udHJvbHM7XHJcbiAgICBjb25zdCByZXZpZXdlciA9IHJldmlzaW9ucy5maW5kKChyKSA9PiByLmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ3Jldmlld2VyJyk7XHJcbiAgICBjb25zdCBhcHByb3ZlciA9IHJldmlzaW9ucy5maW5kKChyKSA9PiByLmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ2FwcHJvdmVyJyk7XHJcbiAgICBcclxuICAgIGlmIChyZXZpZXdlciAmJiBhcHByb3Zlcikge1xyXG4gICAgICBjb25zdCByZXZpZXdlckNoZWNrZWQgPSByZXZpZXdlci5nZXQoJ2lzQ2hlY2tlZCcpPy52YWx1ZTtcclxuICAgICAgY29uc3QgYXBwcm92ZXJDb250cm9sID0gYXBwcm92ZXIuZ2V0KCdpc0NoZWNrZWQnKTtcclxuICAgICAgLy8gQ2hlY2sgaWYgYXBwcm92ZXIgaXMgZGlzYWJsZWQgT1IgcmV2aWV3ZXIgaXMgbm90IGNoZWNrZWRcclxuICAgICAgcmV0dXJuIGFwcHJvdmVyQ29udHJvbD8uZGlzYWJsZWQgfHwgIXJldmlld2VyQ2hlY2tlZDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldCBpc1RhbmdvRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAvLyBUYW5nbyBhbHdheXMgc2hvd3MgZGlzYWJsZWQgZGVzaWduXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdENhdGVnb3J5Rm9ybSgpIHtcclxuICAgIHRoaXMuY2F0ZWdvcnlGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGljb25OYW1lOiBbdGhpcy5iYXNlQ2F0ZWdvcnlJY29uc1swXS52YWx1ZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIG5hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMwKV1dLFxyXG4gICAgICBsaW1pdDogW3RoaXMucGVyY2VudGFnZUxpc3RbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcclxuICBjbG9zZU1lbnVzKCkge1xyXG4gICAgdGhpcy5hY3RpdmVNZW51SW5kZXggPSBudWxsO1xyXG4gICAgdGhpcy5vcGVuTGltaXREcm9wZG93bkluZGV4ID0gbnVsbDtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzQXV0b0Nsb3NlRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzVGlja2V0Q291bnREcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNTdG9yZURheXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc3NlbmRUYW5nb0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ2F0ZWdvcnlJY29uRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSAhdGhpcy5pc0NhdGVnb3J5SWNvbkRyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHNlbGVjdENhdGVnb3J5SWNvbkZyb21Ecm9wZG93bihldmVudDogRXZlbnQsIGljb25WYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuc2VsZWN0Q2F0ZWdvcnlJY29uKGljb25WYWx1ZSk7XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRDbGllbnRNYXBwZWRTdG9yZXNEZXRhaWxzKGNsaWVuSWQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcclxuICAgICB0aGlzLmFwaVNlcnZpY2UuZ2V0Rm9vdGZhbGxTdG9yZVJhaXNlRGV0YWlscyhjbGllbklkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgLy8gdGhpcy5hcGlTZXJ2aWNlLmdldEZvb3RmYWxsRGV0YWlscyhjbGllbklkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OihyZXM6IGFueSk9PntcclxuICAgICAgICBpZihyZXMgJiYgcmVzLmNvZGU9PScyMDAnKXtcclxuICAgICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gcmVzPy5kYXRhPy5yZXN1bHQ7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6KGVycik9PntcclxuICAgICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHN0b3JlIGxpc3QnLCBlcnIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgfSlcclxuICB9XHJcblxyXG5cclxuICAvLyBoZWxwZXJzXHJcbiAgZ2V0IHJldmlzaW9uQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdyZXZpc2lvbicpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCB0YWdMaW1pdHMoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCd0YWdnaW5nTGltaXRhdGlvbicpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG5cclxuICBjcmVhdGVSZXZpc2lvbihhY3Rpb25UeXBlOiBzdHJpbmcsIGlzQ2hlY2tlZDogYm9vbGVhbik6IEZvcm1Hcm91cCB7XHJcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGFjdGlvblR5cGU6IFthY3Rpb25UeXBlXSxcclxuICAgICAgaXNDaGVja2VkOiBbaXNDaGVja2VkXVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVUYWdMaW1pdCh0eXBlOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIsIGljb25OYW1lOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIGtleT86IHN0cmluZyk6IEZvcm1Hcm91cCB7XHJcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHR5cGU6IFt0eXBlXSxcclxuICAgICAgdmFsdWU6IFt2YWx1ZV0sXHJcbiAgICAgIHVuaXQ6IFsnJSddLFxyXG4gICAgICBpY29uTmFtZTogW2ljb25OYW1lXSxcclxuICAgICAgbmFtZTogW25hbWVdLFxyXG4gICAgICBrZXk6IFtrZXldXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVN0b3JlU2VsZWN0aW9uKHN0b3JlOiBhbnksIGNoZWNrZWQ6IGJvb2xlYW4pIHtcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIHRoaXMucmVzZXRSZXF1ZXN0LmNsaWVudElkID0gdGhpcy5jbGllbklkO1xyXG4gICAgICB0aGlzLnJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzLnB1c2goeyBzdG9yZUlkOiBzdG9yZS5zdG9yZUlkLCBkYXRlU3RyaW5nOiBzdG9yZS5kYXRlU3RyaW5nIH0pO1xyXG4gICAgfSBlbHNlIGlmICghY2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMgPSB0aGlzLnJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzLmZpbHRlcihcclxuICAgICAgICAocykgPT4gcy5zdG9yZUlkICE9PSBzdG9yZS5zdG9yZUlkXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc1N0b3JlU2VsZWN0ZWQoc3RvcmU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMuc29tZShyID0+IHIuc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnN0b3JlTGlzdC5sZW5ndGggPiAwICYmIHRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMubGVuZ3RoID09PSB0aGlzLnN0b3JlTGlzdC5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvLyBzZWxlY3QgYWxsIHN0b3JlcyByZXF1ZXN0IGxpc3QgaGFuZGxlclxyXG4gIHRvZ2dsZVNlbGVjdEFsbChldmVudDogRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgY2hlY2tlZCA9IHRhcmdldC5jaGVja2VkO1xyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRTdG9yZXMgPSB0aGlzLnN0b3JlTGlzdC5tYXAoKHN0b3JlOiBhbnkpID0+ICh7XHJcbiAgICAgICAgc3RvcmVJZDogc3RvcmUuc3RvcmVJZCxcclxuICAgICAgICBkYXRlU3RyaW5nOiBzdG9yZS5kYXRlU3RyaW5nXHJcbiAgICAgIH0pKTtcclxuICAgICAgdGhpcy5yZXNldFJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVzZXRQYXlsb2FkKHNlbGVjdGVkU3RvcmVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVzZXRSZXF1ZXN0ID0gdGhpcy5idWlsZFJlc2V0UGF5bG9hZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlUmV2aXNpb25EZXBlbmRlbmNpZXMoKSB7XHJcbiAgICBjb25zdCByZXZpc2lvbnMgPSB0aGlzLnJldmlzaW9uQXJyYXkuY29udHJvbHM7XHJcbiAgICBjb25zdCByZXZpZXdlciA9IHJldmlzaW9ucy5maW5kKChyKSA9PiByLmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ3Jldmlld2VyJyk7XHJcbiAgICBjb25zdCBhcHByb3ZlciA9IHJldmlzaW9ucy5maW5kKChyKSA9PiByLmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ2FwcHJvdmVyJyk7XHJcbiAgICBjb25zdCB0YW5nbyA9IHJldmlzaW9ucy5maW5kKChyKSA9PiByLmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ3RhbmdvJyk7XHJcblxyXG4gICAgaWYgKHRhbmdvKSB7XHJcbiAgICAgIHRhbmdvLmdldCgnaXNDaGVja2VkJyk/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXZpZXdlciAmJiBhcHByb3Zlcikge1xyXG4gICAgICAvLyBkaXNhYmxlIGFwcHJvdmVyIGluaXRpYWxseSBpZiByZXZpZXdlciB1bmNoZWNrZWRcclxuICAgICAgaWYgKCFyZXZpZXdlci5nZXQoJ2lzQ2hlY2tlZCcpPy52YWx1ZSkge1xyXG4gICAgICAgIGFwcHJvdmVyLmdldCgnaXNDaGVja2VkJyk/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIGFwcHJvdmVyLnBhdGNoVmFsdWUoeyBpc0NoZWNrZWQ6IGZhbHNlIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBlbmFibGUgYXBwcm92ZXIgaWYgcmV2aWV3ZXIgaXMgY2hlY2tlZFxyXG4gICAgICAgIGFwcHJvdmVyLmdldCgnaXNDaGVja2VkJyk/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGxpc3RlbiByZXZpZXdlciBjaGVja2JveCBjaGFuZ2UgKG9ubHkgd2lyZSBvbmNlKVxyXG4gICAgICBpZiAoIXRoaXMucmV2aXNpb25EZXBzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICByZXZpZXdlci5nZXQoJ2lzQ2hlY2tlZCcpPy52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoY2hlY2tlZCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICAgICAgYXBwcm92ZXIuZ2V0KCdpc0NoZWNrZWQnKT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFwcHJvdmVyLmdldCgnaXNDaGVja2VkJyk/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICBhcHByb3Zlci5wYXRjaFZhbHVlKHsgaXNDaGVja2VkOiBmYWxzZSB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZXZpc2lvbkRlcHNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRWRpdCA9ICF0aGlzLmlzRWRpdDtcclxuICAgIGlmICghdGhpcy5pc0VkaXQpIHtcclxuICAgICAgLy8gRmlyc3QsIGVuc3VyZSBhcHByb3ZlciBzdGF0ZSBpcyBjb3JyZWN0IGJlZm9yZSBlbmFibGluZyBmb3JtXHJcbiAgICAgIGNvbnN0IHJldmlzaW9ucyA9IHRoaXMucmV2aXNpb25BcnJheS5jb250cm9scztcclxuICAgICAgY29uc3QgcmV2aWV3ZXIgPSByZXZpc2lvbnMuZmluZCgocikgPT4gci5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICdyZXZpZXdlcicpO1xyXG4gICAgICBjb25zdCBhcHByb3ZlciA9IHJldmlzaW9ucy5maW5kKChyKSA9PiByLmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ2FwcHJvdmVyJyk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBJZiByZXZpZXdlciBpcyB1bmNoZWNrZWQsIGVuc3VyZSBhcHByb3ZlciBpcyB1bmNoZWNrZWQgYmVmb3JlIGVuYWJsaW5nXHJcbiAgICAgIGlmIChyZXZpZXdlciAmJiBhcHByb3ZlciAmJiAhcmV2aWV3ZXIuZ2V0KCdpc0NoZWNrZWQnKT8udmFsdWUpIHtcclxuICAgICAgICBhcHByb3Zlci5wYXRjaFZhbHVlKHsgaXNDaGVja2VkOiBmYWxzZSB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5lbmFibGUoKTtcclxuICAgICAgLy8gUmUtYXBwbHkgcmV2aXNpb24gZGVwZW5kZW5jaWVzIGFmdGVyIGVuYWJsaW5nIHRvIGVuc3VyZSBhcHByb3ZlciBzdGF0ZSBpcyBjb3JyZWN0XHJcbiAgICAgIHRoaXMuaGFuZGxlUmV2aXNpb25EZXBlbmRlbmNpZXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5kaXNhYmxlKCk7XHJcbiAgICAgIC8vIFJlLWFwcGx5IHJldmlzaW9uIGRlcGVuZGVuY2llcyBzbyBUYW5nbyByZW1haW5zIGRpc2FibGVkXHJcbiAgICAgIC8vIGFuZCBBcHByb3ZlciBmb2xsb3dzIFJldmlld2VyIGluIGJvdGggdmlldyBhbmQgZWRpdCBtb2Rlcy5cclxuICAgICAgdGhpcy5oYW5kbGVSZXZpc2lvbkRlcGVuZGVuY2llcygpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyBPcGVuIHJlc2V0IGNvbmZpcm1hdGlvbiBtb2RhbFxyXG4gIG9wZW5SZXNldENvbmZpcm1hdGlvbk1vZGFsKCkge1xyXG4gICAgaWYgKCF0aGlzLnJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzLmxlbmd0aCB8fCB0aGlzLmlzUmVzZXR0aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucmVzZXRNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5yZXNldENvbmZpcm1hdGlvbk1vZGFsVHBsLCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICBzaXplOiAnc20nLFxyXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXHJcbiAgICAgIGtleWJvYXJkOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBDbG9zZSByZXNldCBjb25maXJtYXRpb24gbW9kYWxcclxuICBjbG9zZVJlc2V0TW9kYWwoKSB7XHJcbiAgICBpZiAodGhpcy5yZXNldE1vZGFsUmVmKSB7XHJcbiAgICAgIHRoaXMucmVzZXRNb2RhbFJlZi5jbG9zZSgpO1xyXG4gICAgICB0aGlzLnJlc2V0TW9kYWxSZWYgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ29uZmlybSBhbmQgcHJvY2VlZCB3aXRoIHJlc2V0XHJcbiAgY29uZmlybVJlc2V0U3RvcmVSZXF1ZXN0KCkge1xyXG4gICAgaWYgKCF0aGlzLnJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzLmxlbmd0aCB8fCB0aGlzLmlzUmVzZXR0aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIENsb3NlIG1vZGFsIGltbWVkaWF0ZWx5XHJcbiAgICB0aGlzLmNsb3NlUmVzZXRNb2RhbCgpO1xyXG4gICAgXHJcbiAgICAvLyBQcm9jZWVkIHdpdGggcmVzZXQgb3BlcmF0aW9uXHJcbiAgICB0aGlzLmlzUmVzZXR0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuYXBpU2VydmljZS5yZXNldFN0b3JlUmVxdWVzdExpc3QodGhpcy5yZXNldFJlcXVlc3QpXHJcbiAgICAucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc1Jlc2V0dGluZyA9IGZhbHNlO1xyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gICAgLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6KHJlczogYW55KT0+e1xyXG4gICAgICBpZihyZXMgJiYgcmVzLmNvZGU9PScyMDAnKXtcclxuICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IHJlcz8uZGF0YT8ucmVzdWx0O1xyXG4gICAgICAgIHRoaXMuZ2V0Q2xpZW50TWFwcGVkU3RvcmVzRGV0YWlscyh0aGlzLmNsaWVuSWQpO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdTdG9yZSByZXF1ZXN0cyByZXNldCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gcmVzZXQgc3RvcmUgcmVxdWVzdHMuJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZXNldFJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVzZXRQYXlsb2FkKCk7XHJcbiAgICAgfSxcclxuICAgICAgZXJyb3I6KGVycik9PntcclxuICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRXJyb3IgcmVzZXR0aW5nIHN0b3JlIHJlcXVlc3RzLicpO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHN0b3JlIGxpc3QnLCBlcnIpO1xyXG4gICAgICB9LFxyXG4gICB9KVxyXG4gIH1cclxuXHJcbiAgLy8gdG8gcmVzZXQgc3RvcmUgbGlzdCAoa2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpZiBuZWVkZWQpXHJcbiAgcmVzZXRTdG9yZVJlcXVlc3QoKSB7XHJcbiAgICB0aGlzLm9wZW5SZXNldENvbmZpcm1hdGlvbk1vZGFsKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNSZXNldERpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLnJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzLmxlbmd0aCB8fCB0aGlzLmlzUmVzZXR0aW5nIHx8IHRoaXMuaXNFZGl0O1xyXG4gIH1cclxuXHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICAvLyBFbnN1cmUgVGFuZ28gY2hlY2tib3ggaXMgYWx3YXlzIHRydWUgd2hlbiBzYXZpbmdcclxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybVZhbHVlLnJldmlzaW9uKSkge1xyXG4gICAgICBjb25zdCB0YW5nb0luZGV4ID0gZm9ybVZhbHVlLnJldmlzaW9uLmZpbmRJbmRleCgocjogYW55KSA9PiByPy5hY3Rpb25UeXBlID09PSAndGFuZ28nKTtcclxuICAgICAgaWYgKHRhbmdvSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgZm9ybVZhbHVlLnJldmlzaW9uW3RhbmdvSW5kZXhdLmlzQ2hlY2tlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKCd1cGRhdGUgZm9ybSBjb25maWcgPj4nLCBmb3JtVmFsdWUpO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmNsaWVudEZvcm1EYXRhLm5leHQoeyB2YWx1ZTogZm9ybVZhbHVlLCB0eXBlOiAnc3VibWl0JywgZm9ybTogJ2Zvb3RmYWxsRGlyZWN0b3J5Q29uZmlncycgfSlcclxuICAgIC8vIGNvbnN0IGZvcm1WYWx1ZSA9IHsgLi4udGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLnZhbHVlIH07XHJcbiAgICAvLyBpZiAoQXJyYXkuaXNBcnJheShmb3JtVmFsdWUudGFnZ2luZ0xpbWl0YXRpb24pKSB7XHJcbiAgICAvLyAgIGZvcm1WYWx1ZS50YWdnaW5nTGltaXRhdGlvbiA9IGZvcm1WYWx1ZS50YWdnaW5nTGltaXRhdGlvbi5tYXAoKHRhZzogYW55KSA9PiAoe1xyXG4gICAgLy8gICAgIHR5cGU6IHRhZy50eXBlLFxyXG4gICAgLy8gICAgIHZhbHVlOiB0YWcudmFsdWUsXHJcbiAgICAvLyAgICAgdW5pdDogdGFnLnVuaXQgfHwgJyUnXHJcbiAgICAvLyAgICAgLy8gaWNvbk5hbWU6IHRhZy5pY29uTmFtZSxcclxuICAgIC8vICAgICAvLyBuYW1lOiB0YWcubmFtZSB8fCB0YWcudHlwZVxyXG4gICAgLy8gICB9KSk7XHJcbiAgICAvLyB9XHJcbiAgICAvLyBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgLy8gICBmb290ZmFsbERpcmVjdG9yeUNvbmZpZ3M6IGZvcm1WYWx1ZSxcclxuICAgIC8vICAgcmVxdWVzdDogdGhpcy5yZXNldFJlcXVlc3RcclxuICAgIC8vIH07XHJcbiAgICAgIC8vIGNvbnN0IG9iaiA9IHtcclxuICAgICAgLy8gICB0YW5nb1JldmlldzogZm9ybVZhbHVlLnRhbmdvUmV2aWV3LFxyXG4gICAgICAvLyAgIGFjY3VyYWN5QnJlYWNoOiBmb3JtVmFsdWUuYWNjdXJhY3lCcmVhY2gsXHJcbiAgICAgIC8vICAgdGFnZ2luZ0xpbWl0YXRpb246IGZvcm1WYWx1ZS50YWdnaW5nTGltaXRhdGlvblxyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdGaW5hbCBQYXlsb2FkOicsIG9iaik7XHJcbiAgICAgIC8vIHRoaXMuYXBpU2VydmljZS51cGRhdGVGb290ZmFsbERpcmVjdG9yeUNvbmZpZyhvYmosIHRoaXMuY2xpZW5JZClcclxuICAgICAgLy8gICAucGlwZShcclxuICAgICAgLy8gICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxyXG4gICAgICAvLyAgIClcclxuICAgICAgLy8gICAuc3Vic2NyaWJlKHtcclxuICAgICAgLy8gICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAvLyAgICAgICBjb25zb2xlLmxvZygnc2F2ZSBmb290ZmFsbCBjb25maWcgZGV0YWlscyA+PicsIHJlcyk7XHJcbiAgICAgIC8vICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gJzIwMCcgJiYgcmVzLnN0YXR1cyA9PSAnc3VjY2VzcycpIHtcclxuICAgICAgLy8gICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnZm9vdGZhbGwgY29uZmlnIGRldGFpbHMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICAgIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gdXBkYXRlIGZvb3RmYWxsIGNvbmZpZyBkZXRhaWxzLicpO1xyXG4gICAgICAvLyAgICAgICB9XHJcbiAgICAgIC8vICAgICB9LFxyXG4gICAgICAvLyAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgLy8gICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdFcnJvciBpbiB1cGRhdGluZyBmb290ZmFsbCBjb25maWcgZGV0YWlscy4nKTtcclxuICAgICAgLy8gICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gdXBkYXRlRm9vdGZhbGxEaXJlY3RvcnlDb25maWcgOicsIGVycik7XHJcbiAgICAgIC8vICAgICB9LFxyXG4gICAgICAvLyAgIH0pXHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbCgpIHtcclxuICAgIHRoaXMuYXBpU2VydmljZS5jbGllbnRGb3JtRGF0YS5uZXh0KHsgdmFsdWU6IG51bGwsIHR5cGU6ICdjYW5jZWwnLCBmb3JtOiAnZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzJyB9KVxyXG4gICAgdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmRpc2FibGUoKTtcclxuICAgIHRoaXMudG9nZ2xlRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkUmVzZXRQYXlsb2FkKHN0b3JlczogeyBzdG9yZUlkOiBzdHJpbmc7IGRhdGVTdHJpbmc6IHN0cmluZyB9W10gPSBbXSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW5JZCA/PyAnJyxcclxuICAgICAgYXJyYXlPZlN0b3Jlczogc3RvcmVzXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhdGVnb3J5SWNvbnMoKTogQXJyYXk8eyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IGF2YWlsYWJsZUljb25zID0gWy4uLnRoaXMuYmFzZUNhdGVnb3J5SWNvbnNdO1xyXG4gICAgXHJcbiAgICAvLyBDaGVjayB3aGljaCBhZGRpdGlvbmFsIGljb25zIGFyZSBjdXJyZW50bHkgaW4gdXNlXHJcbiAgICBjb25zdCB1c2VkSWNvbnMgPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5tYXAoY3RybCA9PiBjdHJsLmdldCgnaWNvbk5hbWUnKT8udmFsdWUpLmZpbHRlcihCb29sZWFuKTtcclxuICAgIFxyXG4gICAgLy8gSWYgZWRpdGluZywgZXhjbHVkZSB0aGUgY3VycmVudCBpY29uIGJlaW5nIGVkaXRlZCBmcm9tIHRoZSB1c2VkIGxpc3RcclxuICAgIGxldCB1c2VkSWNvbnNGb3JDaGVjayA9IFsuLi51c2VkSWNvbnNdO1xyXG4gICAgaWYgKHRoaXMuY2F0ZWdvcnlNb2RhbE1vZGUgPT09ICdlZGl0JyAmJiB0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IGVkaXRpbmdJY29uID0gdGhpcy50YWdMaW1pdHMuYXQodGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCk/LmdldCgnaWNvbk5hbWUnKT8udmFsdWU7XHJcbiAgICAgIHVzZWRJY29uc0ZvckNoZWNrID0gdXNlZEljb25zRm9yQ2hlY2suZmlsdGVyKGljb24gPT4gaWNvbiAhPT0gZWRpdGluZ0ljb24pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBBZGQgaG91c2VLZWVwaW5nVGFnIGFuZCBqdW5rVGFnIGlmIHRoZXkncmUgbm90IGluIHVzZVxyXG4gICAgdGhpcy5hZGRpdGlvbmFsQ2F0ZWdvcnlJY29ucy5mb3JFYWNoKGljb24gPT4ge1xyXG4gICAgICBpZiAoIXVzZWRJY29uc0ZvckNoZWNrLmluY2x1ZGVzKGljb24udmFsdWUpKSB7XHJcbiAgICAgICAgYXZhaWxhYmxlSWNvbnMucHVzaChpY29uKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIHJldHVybiBhdmFpbGFibGVJY29ucztcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZENhdGVnb3J5SWNvbkxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jYXRlZ29yeUZvcm0/LmdldCgnaWNvbk5hbWUnKT8udmFsdWUgfHwgdGhpcy5iYXNlQ2F0ZWdvcnlJY29uc1swXT8udmFsdWU7XHJcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuY2F0ZWdvcnlJY29ucy5maW5kKGljb24gPT4gaWNvbi52YWx1ZSA9PT0gY3VycmVudCk7XHJcbiAgICByZXR1cm4gbWF0Y2g/LmxhYmVsIHx8ICcnO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybVwiIGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/Lkdsb2JhbF9Db25maWd1cmF0aW9uX2lzRWRpdFwiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0VkaXRcIiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgIDwhLS0gKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8udXNlclR5cGUgPT09ICd0YW5nbycgfHwgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2Zvb3RmYWxsRGlyZWN0b3J5Q29uZmlncycpPy52YWx1ZSA9PT0gdHJ1ZVwiPiAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlRm9ybSgpO1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBhbGlnbi1pdGVtcy1lbmRcIj48c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1lLTJcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzI1NzlfMjUxMjUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNC4xNjcgMi40OTk5M0MxNC4zODU5IDIuMjgxMDYgMTQuNjQ1NyAyLjEwNzQ0IDE0LjkzMTcgMS45ODg5OUMxNS4yMTc2IDEuODcwNTQgMTUuNTI0MSAxLjgwOTU3IDE1LjgzMzcgMS44MDk1N0MxNi4xNDMyIDEuODA5NTcgMTYuNDQ5NyAxLjg3MDU0IDE2LjczNTcgMS45ODg5OUMxNy4wMjE2IDIuMTA3NDQgMTcuMjgxNSAyLjI4MTA2IDE3LjUwMDMgMi40OTk5M0MxNy43MTkyIDIuNzE4OCAxNy44OTI4IDIuOTc4NjMgMTguMDExMyAzLjI2NDZDMTguMTI5NyAzLjU1MDU3IDE4LjE5MDcgMy44NTcwNiAxOC4xOTA3IDQuMTY2NTlDMTguMTkwNyA0LjQ3NjEyIDE4LjEyOTcgNC43ODI2MiAxOC4wMTEzIDUuMDY4NTlDMTcuODkyOCA1LjM1NDU1IDE3LjcxOTIgNS42MTQzOSAxNy41MDAzIDUuODMzMjZMNi4yNTAzMyAxNy4wODMzTDEuNjY2OTkgMTguMzMzM0wyLjkxNjk5IDEzLjc0OTlMMTQuMTY3IDIuNDk5OTNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMjU3OV8yNTEyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5FZGl0IERldGFpbHM8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIEFwcHJvdmVyIENvbmZpZ3VyYXRpb24gLS0+XHJcbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTMgbWItM1wiPlxyXG4gICAgICAgICAgICA8aDU+QXBwcm92ZXIgQ29uZmlndXJhdGlvbjwvaDU+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRleHRcIj5TZXQgbGV2ZWwgb2YgcmV2aXNpb24gcmVxdWlyZWQgZm9yIGEgc3RvcmUgcmFpc2VkIHRpY2tldHM8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInJldmlzaW9uXCIgY2xhc3M9XCJkLWZsZXggZ2FwLTRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJldiBvZiByZXZpc2lvbkFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0NoZWNrZWRcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBbaWRdPVwiJ2FjdGlvbi0nICsgaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cIidhY3Rpb24tJyArIGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSB8IHRpdGxlY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT0gJ3Jldmlld2VyJ1wiIGNsYXNzPVwic3ViLXRleHRcIj5UaGUgVGlja2V0IHVuZGVyZ29lcyBhIHNpbmdsZSByZXZpZXcgdG8gdmVyaWZ5IGZvb3RmYWxsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyZXYuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09ICdhcHByb3ZlcidcIiBjbGFzcz1cInN1Yi10ZXh0XCI+VGhlIFRpY2tldCB1bmRlcmdvZXMgYSBmaW5hbCByZXZpZXcgYWZ0ZXIgdGhlIGluaXRpYWwgY2hlY2s8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT0gJ3RhbmdvJ1wiIGNsYXNzPVwic3ViLXRleHRcIj5GaW5hbGl6ZSB0aWNrZXQgYW5kIHVwZGF0ZSBmb290ZmFsbCBjb3VudDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICA8IS0tIEFwcHJvdmVyIENvbmZpZ3VyYXRpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTQgbWItNCBhcHByb3Zlci1zZWN0aW9uXCI+XHJcbiAgICAgICAgPGg1IGNsYXNzPVwibWItMSBmdy1zZW1pYm9sZFwiPkFwcHJvdmVyIGNvbmZpZ3VyYXRpb248L2g1PlxyXG4gICAgICAgIDxwIGNsYXNzPVwibWItNCBzbWFsbFwiPlxyXG4gICAgICAgICAgICBTZXQgbGV2ZWwgb2YgcmV2aXNpb25zIHJlcXVpcmVkIGZvciBhIHN0b3JlIHJhaXNlZCB0aWNrZXRzXHJcbiAgICAgICAgPC9wPlxyXG5cclxuICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJyZXZpc2lvblwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBnYXAtNVwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByZXYgb2YgcmV2aXNpb25BcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhcHByb3Zlci1vcHRpb24gZC1mbGV4IGZsZXgtY29sdW1uXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1vcHRpb25dPVwiKHJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICdhcHByb3ZlcicgJiYgaXNBcHByb3ZlckRpc2FibGVkKSB8fCAocmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ3RhbmdvJyAmJiBpc1RhbmdvRGlzYWJsZWQpXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94IGFsaWduLWl0ZW1zLXN0YXJ0XCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2hlY2tib3hdPVwiKHJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICdhcHByb3ZlcicgJiYgaXNBcHByb3ZlckRpc2FibGVkKSB8fCAocmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ3RhbmdvJyAmJiBpc1RhbmdvRGlzYWJsZWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cImlzQ2hlY2tlZFwiIFtpZF09XCInYWN0aW9uLScgKyBpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrbWFya1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgfCB0aXRsZWNhc2UgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjIHRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3Jldmlld2VyJ1wiPlRoZSB0aWNrZXQgdW5kZXJnb2VzIGEgc2luZ2xlIHJldmlldyB0byB2ZXJpZnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vdGZhbGwuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInYXBwcm92ZXInXCI+VGhlIHRpY2tldCB1bmRlcmdvZXMgYSBmaW5hbCByZXZpZXcgYWZ0ZXIgdGhlIGluaXRpYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2suPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCIndGFuZ28nXCI+RmluYWxpemUgdGlja2V0cyBhbmQgdXBkYXRlIGZvb3RmYWxsIGNvdW50Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8aHIgY2xhc3M9XCJtcy00IG1lLTRcIj5cclxuXHJcbiAgICA8IS0tIFN0b3JlIFNQT0MgVGlja2V0IENyZWF0aW9uIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNhcmQgcC0zIG1iLTNcIj5cclxuICAgICAgICAgICAgPGg1PlN0b3JlIFNQT0MgVGlja2V0IENyZWF0aW9uPC9oNT5cclxuICAgICAgICAgICAgPGxhYmVsPkFsbG93IFN0b3JlIFNQT0MgdG8gY3JlYXRlIHRpY2tldHMgb25seSBmb3IgbGFzdDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIG1heD1cIjNcIiBjbGFzcz1cImZvcm0tY29udHJvbCB3LTI1IGQtaW5saW5lIG14LTJcIiBmb3JtQ29udHJvbE5hbWU9XCJhbGxvd1RpY2tldENyZWF0aW9uXCI+IERheXNcclxuICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC0zIG1iLTNcIj5cclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwiZnctYm9sZCBtYi0zXCI+U3RvcmUgU1BPQyBUaWNrZXQgQ3JlYXRpb248L2g1PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwIGdhcC0yXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEFsbG93IHN0b3JlIFNQT0MgdG8gY3JlYXRlIHRpY2tldHMgb25seSBmb3IgdGhlIGxhc3RcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBOdW1iZXIgZHJvcGRvd24gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdCBtcy0yXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub3Blbl09XCJpc0FsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bk9wZW5cIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhbGxvd1RpY2tldENyZWF0aW9uJyk/LnZhbHVlIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG9jVGlja2V0Q3JlYXRpb25kYXlzWzBdIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc0FsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bk9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IGRheSBvZiBzcG9jVGlja2V0Q3JlYXRpb25kYXlzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBbGxvd1RpY2tldENyZWF0aW9uKCRldmVudCwgZGF5KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi0wXCI+RGF5czwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxociBjbGFzcz1cIm1zLTQgbWUtNFwiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8IS0tIFRpY2tldCBBdXRvLWNsb3NlIC0tPlxyXG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNhcmQgcC0zIG1iLTNcIj5cclxuICAgICAgICAgICAgPGg1PlRpY2tldCBBdXRvLWNsb3NlPC9oNT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2ggbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGlkPVwiYXV0b0Nsb3NlXCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNBdXRvQ2xvc2VFbmFibGVcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJhdXRvQ2xvc2VcIj5FbmFibGUgQXV0by1jbG9zZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPkF1dG8tY2xvc2UgQWNjdXJhY3k8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJhdXRvQ2xvc2VBY2N1cmFjeVwiIGNsYXNzPVwiZm9ybS1zZWxlY3Qgdy0yNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHZhbCBvZiBbJzg1JScsICc5MCUnLCAnOTUlJywgJzEwMCUnXVwiIFt2YWx1ZV09XCJ2YWxcIj57eyB2YWwgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtMyBtYi0zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImZ3LWJvbGQgbS0wXCI+VGlja2V0IEF1dG8tY2xvc2U8L2g1PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVG9nZ2xlIFN3aXRjaCAtLT5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN3aXRjaCBtLTAgbXMtM1wiIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNBdXRvQ2xvc2VFbmFibGVcIiBbZGlzYWJsZWRdPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbGlkZXIgcm91bmRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFRpY2tldCBzaG91bGQgYmUgYXV0by1jbG9zZWQsIGlmIHRoZSBjcmVhdGVkIHRpY2tldCBhY2N1cmFjeSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEFjY3VyYWN5IGRyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIGZmLXNlbGVjdC13cmFwcGVyIGNvbXBhY3QgbXMtMlwiIFtjbGFzcy5vcGVuXT1cImlzQXV0b0Nsb3NlRHJvcGRvd25PcGVuXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0IHx8ICFmb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnaXNBdXRvQ2xvc2VFbmFibGUnKT8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIiAoY2xpY2spPVwidG9nZ2xlQXV0b0Nsb3NlRHJvcGRvd24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBmb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYXV0b0Nsb3NlQWNjdXJhY3knKT8udmFsdWUgfHwgJzElJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwiaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IHAgb2YgYWNjdXJhY3lQZXJjZW50YWdlTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QXV0b0Nsb3NlQWNjdXJhY3koJGV2ZW50LCBwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcCB9fSVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxociBjbGFzcz1cIm1zLTQgbWUtNFwiPlxyXG5cclxuICAgIDwhLS0gVGFnZ2luZyBMaW1pdGF0aW9ucyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtNCBtYi00XCI+XHJcbiAgICAgICAgICAgIDwhLS0gRm9vdGZhbGwgZGlyZWN0b3J5IGxpbWl0YXRpb25zIHN0YXJ0ICAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJmdy1zZW1pYm9sZCBtLTBcIj5Gb290ZmFsbCBkaXJlY3RvcnkgbGltaXRhdGlvbnM8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGwgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTZXQgbWF4aW11bSBsaW1pdGF0aW9uIGZvciBzdG9yZXMgdG8gdGFnIG5vbi1QdXJjaGFzZXJzIGZyb20gVG90YWwgRm9vdGZhbGxcclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXNFZGl0XCIgY2xhc3M9XCJhZGQtbmV3LWJ0biBkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5DYXRlZ29yeU1vZGFsKCdhZGQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggMy4zMzMzNFYxMi42NjY3TTMuMzMzMzQgOEgxMi42NjY3XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+QWRkIE5ldzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRm9vdGZhbGwgZGlyZWN0b3J5IGxpbWl0YXRpb25zIGNhdGVnb3J5IHBhcnQgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInRhZ2dpbmdMaW1pdGF0aW9uXCIgY2xhc3M9XCJjYXRlZ29yeS1ncmlkIG10LTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRhZyBvZiB0YWdMaW1pdHMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJjYXRlZ29yeS1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBUb3AgU2VjdGlvbjogSWNvbiBhbmQgTmFtZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktY2FyZC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaWNvblwiIFtuZ0NsYXNzXT1cInRhZy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlXCI+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWljb25cIiBbbmdDbGFzc109XCJ0YWcuZ2V0KCdpY29uTmFtZScpPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwidGFnLmdldCgnaWNvbk5hbWUnKT8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIER1cGxpY2F0ZSBUYWcgU1ZHIC0gVHdvIG92ZXJsYXBwaW5nIHNxdWFyZXMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAgKm5nU3dpdGNoQ2FzZT1cIidkdXBsaWNhdGVUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzExNjJfMjQ2MjEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMi41IDcuNUgyQzEuNzM0NzggNy41IDEuNDgwNDMgNy4zOTQ2NCAxLjI5Mjg5IDcuMjA3MTFDMS4xMDUzNiA3LjAxOTU3IDEgNi43NjUyMiAxIDYuNVYyQzEgMS43MzQ3OCAxLjEwNTM2IDEuNDgwNDMgMS4yOTI4OSAxLjI5Mjg5QzEuNDgwNDMgMS4xMDUzNiAxLjczNDc4IDEgMiAxSDYuNUM2Ljc2NTIyIDEgNy4wMTk1NyAxLjEwNTM2IDcuMjA3MTEgMS4yOTI4OUM3LjM5NDY0IDEuNDgwNDMgNy41IDEuNzM0NzggNy41IDJWMi41TTUuNSA0LjVIMTBDMTAuNTUyMyA0LjUgMTEgNC45NDc3MiAxMSA1LjVWMTBDMTEgMTAuNTUyMyAxMC41NTIzIDExIDEwIDExSDUuNUM0Ljk0NzcyIDExIDQuNSAxMC41NTIzIDQuNSAxMFY1LjVDNC41IDQuOTQ3NzIgNC45NDc3MiA0LjUgNS41IDQuNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTE2Ml8yNDYyMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW1wbG95ZWUgVGFnIFNWRyAtIFR3byBwZW9wbGUsIG9uZSBpbiBmcm9udCBvZiB0aGUgb3RoZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2VtcGxveWVlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE2IDEzXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEuMTY2NyAxMi41VjExLjE2NjdDMTEuMTY2NyAxMC40NTk0IDEwLjg4NTcgOS43ODExNSAxMC4zODU2IDkuMjgxMDVDOS44ODU1MiA4Ljc4MDk1IDkuMjA3MjQgOC41IDguNSA4LjVIMy4xNjY2N0MyLjQ1OTQyIDguNSAxLjc4MTE1IDguNzgwOTUgMS4yODEwNSA5LjI4MTA1QzAuNzgwOTUyIDkuNzgxMTUgMC41IDEwLjQ1OTQgMC41IDExLjE2NjdWMTIuNU0xNS4xNjY3IDEyLjVWMTEuMTY2N0MxNS4xNjYyIDEwLjU3NTggMTQuOTY5NiAxMC4wMDE4IDE0LjYwNzYgOS41MzQ4OEMxNC4yNDU2IDkuMDY3OTEgMTMuNzM4OCA4LjczNDM4IDEzLjE2NjcgOC41ODY2N00xMC41IDAuNTg2NjY3QzExLjA3MzYgMC43MzM1MzQgMTEuNTgyIDEuMDY3MTMgMTEuOTQ1MSAxLjUzNDg3QzEyLjMwODIgMi4wMDI2MSAxMi41MDUyIDIuNTc3ODkgMTIuNTA1MiAzLjE3QzEyLjUwNTIgMy43NjIxMSAxMi4zMDgyIDQuMzM3MzkgMTEuOTQ1MSA0LjgwNTEzQzExLjU4MiA1LjI3Mjg3IDExLjA3MzYgNS42MDY0NyAxMC41IDUuNzUzMzNNOC41IDMuMTY2NjdDOC41IDQuNjM5NDMgNy4zMDYwOSA1LjgzMzMzIDUuODMzMzMgNS44MzMzM0M0LjM2MDU3IDUuODMzMzMgMy4xNjY2NyA0LjYzOTQzIDMuMTY2NjcgMy4xNjY2N0MzLjE2NjY3IDEuNjkzOTEgNC4zNjA1NyAwLjUgNS44MzMzMyAwLjVDNy4zMDYwOSAwLjUgOC41IDEuNjkzOTEgOC41IDMuMTY2NjdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhvdXNlIEtlZXBpbmcgVGFnIFNWRyAtIEhvdXNlIHdpdGggYnJvb20gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidob3VzZUtlZXBpbmdUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTE2Ml8yNDY1MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4wNDk4MyAwLjU0NDk0N0M3Ljc0NzM4IC0wLjE4MTY0OSA4Ljg3ODI5IC0wLjE4MTY0OSA5LjU3NTg0IDAuNTQ0OTQ3TDE1LjQ2OTcgNi42ODQ0QzE2LjE2NzIgNy40MTEwMSAxNi4xNjcyIDguNTg5MDQgMTUuNDY5NyA5LjMxNTY1TDkuNTc1ODQgMTUuNDU1MUM4Ljg3ODI5IDE2LjE4MTYgNy43NDczOCAxNi4xODE2IDcuMDQ5ODMgMTUuNDU1MUw1LjM2NTYyIDEzLjcwMDdMMy44MjE3OSAxNS4zMDg4QzMuMTI0MjYgMTYuMDM1NCAxLjk5MzM0IDE2LjAzNTQgMS4yOTU4IDE1LjMwODhDMC41OTgyNzIgMTQuNTgyMyAwLjU5ODI3MiAxMy40MDQyIDEuMjk1OCAxMi42Nzc3TDIuODM5NjQgMTEuMDY5NUwxLjE1NTk2IDkuMzE1NjVDMC40NTg0MjkgOC41ODkwNCAwLjQ1ODQyOSA3LjQxMTAxIDEuMTU1OTYgNi42ODQ0TDcuMDQ5ODMgMC41NDQ5NDdaTTguNzMzODEgMS40MjIwM0M4LjUwMTI5IDEuMTc5ODMgOC4xMjQzIDEuMTc5ODMgNy44OTE3OCAxLjQyMjAzTDMuNjgxNjUgNS44MDc2MkwxMC40MTc1IDEyLjgyNDJMMTQuNjI3NyA4LjQzODU0QzE0Ljg2MDIgOC4xOTYzNCAxNC44NjAyIDcuODAzNjMgMTQuNjI3NyA3LjU2MTUxTDExLjY4MDUgNC40OTE0M0wxMC42OTgxIDUuNTE0NjlDMTAuNDY1NiA1Ljc1Njg5IDEwLjA4ODcgNS43NTY4OSA5Ljg1NjE0IDUuNTE0NjlDOS42MjM2MyA1LjI3MjQ5IDkuNjIzNjMgNC44Nzk4MSA5Ljg1NjE0IDQuNjM3NjFMMTAuODM4NCAzLjYxNDM1TDkuOTk2NjUgMi43Mzc0Nkw3LjYxMSA1LjIyMjUyQzcuMzc4NDkgNS40NjQ3MSA3LjAwMTQ5IDUuNDY0NzEgNi43Njg5NyA1LjIyMjUyQzYuNTM2NDYgNC45ODAzMiA2LjUzNjQ2IDQuNTg3NjMgNi43Njg5NyA0LjM0NTQ0TDkuMTU0NjIgMS44NjAzOEw4LjczMzgxIDEuNDIyMDNaTTkuNTc1NTIgMTMuNzAxMkwyLjgzOTY2IDYuNjg0N0wxLjk5Nzk2IDcuNTYxNTFDMS43NjU0NCA3LjgwMzYzIDEuNzY1NDQgOC4xOTYzNCAxLjk5Nzk2IDguNDM4NTRMNy44OTE3OCAxNC41NzhDOC4xMjQzIDE0LjgyMDIgOC41MDEyOSAxNC44MjAyIDguNzMzODEgMTQuNTc4TDkuNTc1NTIgMTMuNzAxMlpNMy42ODE1NiAxMS45NDY2TDIuMTM3OCAxMy41NTQ3QzEuOTA1MjkgMTMuNzk2OSAxLjkwNTI5IDE0LjE4OTYgMi4xMzc4IDE0LjQzMThDMi4zNzAzMSAxNC42NzQgMi43NDcyOSAxNC42NzQgMi45Nzk4IDE0LjQzMThMNC41MjM1NSAxMi44MjM3TDMuNjgxNTYgMTEuOTQ2NlpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzM0NDA1NFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xMTYyXzI0NjUwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSnVuayBUYWcgU1ZHIC0gVHJhc2ggY2FuIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInanVua1RhZydcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbjxwYXRoIGQ9XCJNMiA0LjAwMDA0SDMuMzMzMzNNMy4zMzMzMyA0LjAwMDA0SDE0TTMuMzMzMzMgNC4wMDAwNFYxMy4zMzM0QzMuMzMzMzMgMTMuNjg3IDMuNDczODEgMTQuMDI2MSAzLjcyMzg2IDE0LjI3NjJDMy45NzM5MSAxNC41MjYyIDQuMzEzMDQgMTQuNjY2NyA0LjY2NjY3IDE0LjY2NjdIMTEuMzMzM0MxMS42ODcgMTQuNjY2NyAxMi4wMjYxIDE0LjUyNjIgMTIuMjc2MSAxNC4yNzYyQzEyLjUyNjIgMTQuMDI2MSAxMi42NjY3IDEzLjY4NyAxMi42NjY3IDEzLjMzMzRWNC4wMDAwNEgzLjMzMzMzWk01LjMzMzMzIDQuMDAwMDRWMi42NjY3MUM1LjMzMzMzIDIuMzEzMDkgNS40NzM4MSAxLjk3Mzk1IDUuNzIzODYgMS43MjM5QzUuOTczOTEgMS40NzM4NSA2LjMxMzA0IDEuMzMzMzcgNi42NjY2NyAxLjMzMzM3SDkuMzMzMzNDOS42ODY5NiAxLjMzMzM3IDEwLjAyNjEgMS40NzM4NSAxMC4yNzYxIDEuNzIzOUMxMC41MjYyIDEuOTczOTUgMTAuNjY2NyAyLjMxMzA5IDEwLjY2NjcgMi42NjY3MVY0LjAwMDA0TTYuNjY2NjcgNy4zMzMzN1YxMS4zMzM0TTkuMzMzMzMgNy4zMzMzN1YxMS4zMzM0XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbjwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFB1cnBsZSBUYWcgU1ZHIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidwdXJwbGVUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9yYW5nZSBUYWcgU1ZHIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidvcmFuZ2VUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJsdWUgVGFnIFNWRyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidibHVlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGVmYXVsdCBUYWcgU1ZHIChmYWxsYmFjaykgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3ZnICpuZ1N3aXRjaERlZmF1bHQgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRhZy5nZXQoJ25hbWUnKT8udmFsdWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTWVudSBCdXR0b24gKG9ubHkgZm9yIGhvdXNlS2VlcGluZ1RhZyBhbmQganVua1RhZykgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHRhZy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlICE9PSAnZHVwbGljYXRlVGFnJyAmJiB0YWcuZ2V0KCdpY29uTmFtZScpPy52YWx1ZSAhPT0gJ2VtcGxveWVlVGFnJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2F0ZWdvcnktbWVudS1idG5cIiAoY2xpY2spPVwidG9nZ2xlQ2F0ZWdvcnlNZW51KCRldmVudCwgaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyIDVDMTIuNTUyMyA1IDEzIDQuNTUyMjggMTMgNEMxMyAzLjQ0NzcyIDEyLjU1MjMgMyAxMiAzQzExLjQ0NzcgMyAxMSAzLjQ0NzcyIDExIDRDMTEgNC41NTIyOCAxMS40NDc3IDUgMTIgNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMiAxM0MxMi41NTIzIDEzIDEzIDEyLjU1MjMgMTMgMTJDMTMgMTEuNDQ3NyAxMi41NTIzIDExIDEyIDExQzExLjQ0NzcgMTEgMTEgMTEuNDQ3NyAxMSAxMkMxMSAxMi41NTIzIDExLjQ0NzcgMTMgMTIgMTNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgMjFDMTIuNTUyMyAyMSAxMyAyMC41NTIzIDEzIDIwQzEzIDE5LjQ0NzcgMTIuNTUyMyAxOSAxMiAxOUMxMS40NDc3IDE5IDExIDE5LjQ0NzcgMTEgMjBDMTEgMjAuNTUyMyAxMS40NDc3IDIxIDEyIDIxWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW1lbnVcIiAqbmdJZj1cImFjdGl2ZU1lbnVJbmRleCA9PT0gaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2F0ZWdvcnlNZW51QWN0aW9uKCRldmVudCwgJ2VkaXQnLCBpKVwiPkVkaXQgTmFtZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2F0ZWdvcnlNZW51QWN0aW9uKCRldmVudCwgJ2RlbGV0ZScsIGkpXCI+RGVsZXRlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIEJvdHRvbSBTZWN0aW9uOiBQZXJjZW50YWdlIERyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1wZXJjZW50YWdlLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIGZmLXNlbGVjdC13cmFwcGVyIGNvbXBhY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm9wZW5dPVwib3BlbkxpbWl0RHJvcGRvd25JbmRleCA9PT0gaVwiIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZSBzbWFsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUxpbWl0RHJvcGRvd24oJGV2ZW50LCBpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHRhZy5nZXQoJ3ZhbHVlJyk/LnZhbHVlIHx8IDAgfX0lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJvcGVuTGltaXREcm9wZG93bkluZGV4ID09PSBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IHAgb2YgcGVyY2VudGFnZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TGltaXRWYWx1ZSgkZXZlbnQsIGksIHApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHAgfX0lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC0zXCIgKm5nSWY9XCJpc0NhdGVnb3J5TGltaXRSZWFjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtc29mdC1wcmltYXJ5IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgbWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UtZG90XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPk1heGltdW0gY2F0ZWdvcnkgY3JlYXRpb24gbGltaXQgcmVhY2hlZC48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8IS0tIEZvb3RmYWxsIGRpcmVjdG9yeSBsaW1pdGF0aW9ucyBlbmQgIC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGhyIGNsYXNzPVwibXMtNCBtZS00XCIgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8udXNlclR5cGUgPT09ICd0YW5nbydcIj5cclxuICAgIFxyXG4gICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwiYWNjdXJhY3lCcmVhY2hcIiBjbGFzcz1cImNhcmQgcC00IG1iLTMgc3RvcmUtcmVxdWVzdHMtc2VjdGlvblwiPlxyXG4gICAgICAgIDwhLS0gc3RvcmUgcmVxdWVzdCBIZWFkZXIgU2VjdGlvbiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLXN0YXJ0IG1iLTRcIj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImZ3LXNlbWlib2xkIG1iLTJcIj5TdG9yZSBSZXF1ZXN0czwvaDU+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNtYWxsIG1iLTAgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEJlbG93IHN0b3JlcyBoYXZlIHJlcXVlc3RlZCB0byByYWlzZSBhIHRpY2tldCBhZnRlciBicmVhY2hpbmcgdGhlIGNvbmZpZ3VyZWQgbGltaXRcclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluZm8taWNvblwiPmk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByZXNldC1idG4gZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNFZGl0XCIgW2Rpc2FibGVkXT1cImlzUmVzZXREaXNhYmxlZFwiIChjbGljayk9XCJvcGVuUmVzZXRDb25maXJtYXRpb25Nb2RhbCgpXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5SZXNldDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gUmVzdHJpY3Rpb24gQ3JpdGVyaWEgU2VjdGlvbiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVzdHJpY3Rpb24tY3JpdGVyaWEgbWItNFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi0zIGQtYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIFJlc3RyaWN0IHRpY2tldCBjcmVhdGlvbiBmb3IgYW55IHN0b3JlIHRoYXQ6XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtbm93cmFwIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIFRpY2tldCBDb3VudCBEcm9wZG93biAtLT5cclxuICAgICAgICAgICAgICAgIDxzcGFuPkhhcyByYWlzZWQgbW9yZSB0aGFuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIGZmLXNlbGVjdC13cmFwcGVyIGNvbXBhY3RcIiBbY2xhc3Mub3Blbl09XCJpc1RpY2tldENvdW50RHJvcGRvd25PcGVuXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCIgKGNsaWNrKT1cInRvZ2dsZVRpY2tldENvdW50RHJvcGRvd24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC50aWNrZXRDb3VudCcpPy52YWx1ZSB8fCAxIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwiaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgYyBvZiBbMSwgMiwgMywgNCwgNV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRpY2tldENvdW50KCRldmVudCwgYylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnRpY2tldHMgaW4gdGhlIGNhbGVuZGVyIG1vbnRoIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwhLS0gRGF5cyBEcm9wZG93biAtLT5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIGZmLXNlbGVjdC13cmFwcGVyIGNvbXBhY3Qgc3RvcmUtZGF5cy1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cImlzU3RvcmVEYXlzRHJvcGRvd25PcGVuXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZSBzbWFsbFwiIChjbGljayk9XCJ0b2dnbGVTdG9yZURheXNEcm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC5kYXlzJyk/LnZhbHVlIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVRpY2tldERheXNbMF0gfX0gRGF5czwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwiaXNTdG9yZURheXNEcm9wZG93bk9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IGRheSBvZiBzdG9yZVRpY2tldERheXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN0b3JlRGF5cygkZXZlbnQsIGRheSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheSB9fSBEYXlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJib2xkXCIgc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPkFORDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPmhhcyBmb290ZmFsbCBhY2N1cmFjeTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwhLS0gQWNjdXJhY3kgRHJvcGRvd24gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdFwiIFtjbGFzcy5vcGVuXT1cImlzU3RvcmVBY2N1cmFjeURyb3Bkb3duT3BlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZSBzbWFsbFwiIChjbGljayk9XCJ0b2dnbGVTdG9yZUFjY3VyYWN5RHJvcGRvd24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID49e3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoLmFjY3VyYWN5Jyk/LnZhbHVlIHx8ICc5NSUnIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwiaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIFs5NSwgOTYsIDk3LCA5OCwgOTldXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTdG9yZUFjY3VyYWN5KCRldmVudCwgcClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID49e3sgcCB9fSVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU3RvcmUgUmVxdWVzdHMgVGFibGUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlLXJlcXVlc3RzLXRhYmxlXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwic3RvcmVMaXN0Py5sZW5ndGggPiAwOyBlbHNlIGVtcHR5U3RvcmVSZXF1ZXN0c1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiIFtuZ0NsYXNzXT1cInsnc3RvcmUtdGFibGUtc2Nyb2xsJzogc3RvcmVMaXN0Py5sZW5ndGggPiA1fVwiPlxyXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtaG92ZXIgc3RvcmUtcmVxdWVzdHMtdGFibGUtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2hlY2tib3gtY29sdW1uXCI+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlIHN0b3JlLW5hbWUtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94LXNlbGVjdCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc0FsbFNlbGVjdGVkXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGwoJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrbWFyay1zZWxlY3RcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIj5TZWxlY3QgYWxsIHN0b3JlcyAoe3sgc3RvcmVMaXN0Py5sZW5ndGggfHwgMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19KTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIGNsYXNzPVwibXMtMiBkcm9wZG93bi1hcnJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic29ydGFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWlzZWQgb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1zLTEgc29ydC1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA0LjVMNiAxLjVMOSA0LjVNMyA3LjVMNiAxMC41TDkgNy41XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdCByYWlzZWQoQXBwcm92ZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtcy0xIHNvcnQtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNC41TDYgMS41TDkgNC41TTMgNy41TDYgMTAuNUw5IDcuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzb3J0YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIG9mIFRpbWUgUmFpc2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtcy0xIHNvcnQtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNC41TDYgMS41TDkgNC41TTMgNy41TDYgMTAuNUw5IDcuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgc3RvcmUgb2Ygc3RvcmVMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjaGVja2JveC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY2hlY2tib3gtc2VsZWN0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI2NiIHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzU3RvcmVTZWxlY3RlZChzdG9yZSlcIiBbZGlzYWJsZWRdPVwiaXNFZGl0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU3RvcmVTZWxlY3Rpb24oc3RvcmUsIGNiLmNoZWNrZWQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja21hcmstc2VsZWN0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLnN0b3JlTmFtZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgc3RvcmUucmFpc2VkT24gfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLmxhc3RBcHByb3ZlZCB8fCAnLScgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLnRvdGFsUmFpc2VkIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eVN0b3JlUmVxdWVzdHM+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdG9yZS1zdGF0ZSB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0b3JlLWljb24gbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgdmlld0JveD1cIjAgMCA0MCA0MFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04Ljk0NjI5IDIxLjE5OTVDOC42NDUgMjEuMjMxMyA4LjMzODI4IDIxLjI1MDIgOC4wMjczNCAyMS4yNTAyQzcuODU3ODIgMjEuMjUwMiA3LjY5MDUyIDIxLjI0MzQgNy41MjUzOSAyMS4yMzM2VjMxLjYwNjdDNy41MjUzOSAzMy4wMzQ3IDguNzA4MzcgMzQuMjI1OCAxMC4xOTYzIDM0LjIyNThIMjkuODAwOEMzMS4yODg4IDM0LjIyNTggMzIuNDcxNyAzMy4wMzQ3IDMyLjQ3MTcgMzEuNjA2N1YyMS4yMzQ2QzMyLjMwOTggMjEuMjQzOCAzMi4xNDU5IDIxLjI1MDIgMzEuOTgxNCAyMS4yNTAyQzMxLjY2NzUgMjEuMjUwMiAzMS4zNTY5IDIxLjIzMjMgMzEuMDUwOCAyMS4xOTk1VjI4Ljk4NzVIOC45NDYyOVYyMS4xOTk1Wk0zMC45Mjc3IDUuNzczNjhIOS4wNjkzNEM4Ljg5MTk3IDUuNzczNjggOC43MzY3MSA1Ljg2NjQ3IDguNjU5MTggNS45ODc1NUw4LjY1NzIzIDUuOTg5NUw1LjE0NzQ2IDExLjQ3MjlMNS4wNTI3MyAxMS42MjA0QzMuODI3MTkgMTMuNzQwMiA1LjA5MTggMTYuNDY3MSA3LjQ0MzM2IDE2Ljc3NjZDNy42NDQyOCAxNi44MDExIDcuODM0MDMgMTYuODE1NyA4LjAyMTQ4IDE2LjgxNTdDOS4yNTE1NiAxNi44MTU3IDEwLjMzOTUgMTYuMjg3IDExLjA5NjcgMTUuNDY1MUwxMi4wMTg2IDE0LjQ2NDFMMTIuOTM3NSAxNS40NjhDMTMuNjg2NCAxNi4yODYxIDE0Ljc3MzEgMTYuODE1NyAxNi4wMTA3IDE2LjgxNTdDMTcuMjQyOCAxNi44MTU2IDE4LjMzNDcgMTYuMjg1NCAxOS4wODMgMTUuNDY4TDIwLjAwNDkgMTQuNDYxMkwyMC45MjY4IDE1LjQ2OEMyMS42NzUxIDE2LjI4NTUgMjIuNzY2OCAxNi44MTU3IDIzLjk5OSAxNi44MTU3QzI1LjIzMTIgMTYuODE1NyAyNi4zMjI5IDE2LjI4NTQgMjcuMDcxMyAxNS40NjhMMjcuOTkzMiAxNC40NjEyTDI4LjkxNSAxNS40NjhDMjkuNjYzNCAxNi4yODU1IDMwLjc1NiAxNi44MTU3IDMxLjk4ODMgMTYuODE1N0MzMi4xNjk3IDE2LjgxNTcgMzIuMzY0OCAxNi44MDE4IDMyLjU2NDUgMTYuNzc3NkgzMi41NjM1QzM0Ljk1NzIgMTYuNDU3MSAzNi4yMjU0IDEzLjYwNzUgMzQuODU3NCAxMS40NzI5TDM0Ljg1NjQgMTEuNDczOUwzMS4zMzk4IDUuOTkwNDhMMzEuMzM4OSA1Ljk4NzU1QzMxLjI2MTQgNS44NjYyOCAzMS4xMDUzIDUuNzczNjggMzAuOTI3NyA1Ljc3MzY4WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wIGZ3LXNlbWlib2xkIHRleHQtbXV0ZWRcIj5ObyByZXNldCByZXF1ZXN0IGZyb20gc3RvcmU8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxociBjbGFzcz1cIm1zLTQgbWUtNFwiICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LnVzZXJUeXBlID09PSAndGFuZ28nXCI+XHJcbiAgICA8IS0tIFRhbmdvIFJldmlldyAtLT5cclxuICAgIDwhLS0gPGRpdiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiIGNsYXNzPVwiY2FyZCBwLTMgbWItM1wiPlxyXG4gICAgICAgIDxsYWJlbD5TZW5kIFRpY2tldCB0byBUYW5nbyBpZiBhY2N1cmFjeSBmYWxscyBiZWxvdzwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdy0yNVwiIGZvcm1Db250cm9sTmFtZT1cInRhbmdvUmV2aWV3XCI+XHJcbiAgICA8L2Rpdj4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8udXNlclR5cGUgPT09ICd0YW5nbydcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTQgbWItNCB0YW5nby1yZXZpZXctY2FyZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJmdy1ib2xkIG0tMFwiPlNlbmQgVGlja2V0IHRvIFRhbmdvPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtZS0yIG1iLTAgdGFuZ28tbGFiZWxcIj5TZW5kIHRpY2tldCB0byBUYW5nbyBpZiBhY2N1cmFjeSBmYWxscyBiZWxvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdCBtcy0wXCIgW2NsYXNzLm9wZW5dPVwiaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIiAoY2xpY2spPVwidG9nZ2xlU2VuZFRhbmdvQ2xvc2VEcm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCd0YW5nb1JldmlldycpPy52YWx1ZSB8fCAnMSUnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc3NlbmRUYW5nb0Ryb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgcCBvZiBzZW5kVGlja2V0VGFuZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFNlbmRUaWNrZXRUYW5nbygkZXZlbnQsIHApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwIH19JVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCIhaXNFZGl0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTUgdy0xMDAgZm9vdGVyLXNlcGVyYXRvclwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICA8YSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgbXQtMSBtZS00XCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2E+XHJcbiAgICAgICAgICAgIDxhIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBweC00XCIgKGNsaWNrKT1cIm9uU3VibWl0KClcIj48c3Bhbj5TYXZlIENoYW5nZXM8L3NwYW4+PC9hPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBDYXRlZ29yeSBNb2RhbCAtLT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjY2F0ZWdvcnlNb2RhbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGJvcmRlci0wIHBiLTBcIj5cclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgIHt7IGNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJyA/ICdBZGQgTmV3IENhdGVnb3J5JyA6ICdFZGl0IENhdGVnb3J5JyB9fVxyXG4gICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJjbG9zZUNhdGVnb3J5TW9kYWwoKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGNhdGVnb3J5LW1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJjYXRlZ29yeUZvcm1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCB0ZXh0LW11dGVkXCI+SWNvbjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC13cmFwcGVyIGljb24tc2VsZWN0XCIgW2NsYXNzLm9wZW5dPVwiaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlXCIgKGNsaWNrKT1cInRvZ2dsZUNhdGVnb3J5SWNvbkRyb3Bkb3duKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5LWljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjYXRlZ29yeUZvcm0uZ2V0KCdpY29uTmFtZScpPy52YWx1ZSB8fCBiYXNlQ2F0ZWdvcnlJY29uc1swXT8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY2F0ZWdvcnlGb3JtLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgfHwgYmFzZUNhdGVnb3J5SWNvbnNbMF0/LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJsdWUgVGFnIFNWRyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2JsdWVUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFB1cnBsZSBUYWcgU1ZHIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ3B1cnBsZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjcwNzEgMTMuMjkyOUwxMS40MTQyIDRINFYxMS40MTQyTDEzLjI5MjkgMjAuNzA3MUMxMy42ODM0IDIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDE0LjcwNzEgMjAuNzA3MUwyMC43MDcxIDE0LjcwNzFDMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTMuNjgzNCAyMC43MDcxIDEzLjI5MjlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgN0g3LjAxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPcmFuZ2UgVGFnIFNWRyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidvcmFuZ2VUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSG91c2UgS2VlcGluZyBUYWcgU1ZHIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2hvdXNlS2VlcGluZ1RhZydcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwX2ljb25faG91c2VrZWVwaW5nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMDQ5ODMgMC41NDQ5NDdDNy43NDczOCAtMC4xODE2NDkgOC44NzgyOSAtMC4xODE2NDkgOS41NzU4NCAwLjU0NDk0N0wxNS40Njk3IDYuNjg0NEMxNi4xNjcyIDcuNDExMDEgMTYuMTY3MiA4LjU4OTA0IDE1LjQ2OTcgOS4zMTU2NUw5LjU3NTg0IDE1LjQ1NTFDOC44NzgyOSAxNi4xODE2IDcuNzQ3MzggMTYuMTgxNiA3LjA0OTgzIDE1LjQ1NTFMNS4zNjU2MiAxMy43MDA3TDMuODIxNzkgMTUuMzA4OEMzLjEyNDI2IDE2LjAzNTQgMS45OTMzNCAxNi4wMzU0IDEuMjk1OCAxNS4zMDg4QzAuNTk4MjcyIDE0LjU4MjMgMC41OTgyNzIgMTMuNDA0MiAxLjI5NTggMTIuNjc3N0wyLjgzOTY0IDExLjA2OTVMMS4xNTU5NiA5LjMxNTY1QzAuNDU4NDI5IDguNTg5MDQgMC40NTg0MjkgNy40MTEwMSAxLjE1NTk2IDYuNjg0NEw3LjA0OTgzIDAuNTQ0OTQ3Wk04LjczMzgxIDEuNDIyMDNDOC41MDEyOSAxLjE3OTgzIDguMTI0MyAxLjE3OTgzIDcuODkxNzggMS40MjIwM0wzLjY4MTY1IDUuODA3NjJMMTAuNDE3NSAxMi44MjQyTDE0LjYyNzcgOC40Mzg1NEMxNC44NjAyIDguMTk2MzQgMTQuODYwMiA3LjgwMzYzIDE0LjYyNzcgNy41NjE1MUwxMS42ODA1IDQuNDkxNDNMMTAuNjk4MSA1LjUxNDY5QzEwLjQ2NTYgNS43NTY4OSAxMC4wODg3IDUuNzU2ODkgOS44NTYxNCA1LjUxNDY5QzkuNjIzNjMgNS4yNzI0OSA5LjYyMzYzIDQuODc5ODEgOS44NTYxNCA0LjYzNzYxTDEwLjgzODQgMy42MTQzNUw5Ljk5NjY1IDIuNzM3NDZMNy42MTEgNS4yMjI1MkM3LjM3ODQ5IDUuNDY0NzEgNy4wMDE0OSA1LjQ2NDcxIDYuNzY4OTcgNS4yMjI1MkM2LjUzNjQ2IDQuOTgwMzIgNi41MzY0NiA0LjU4NzYzIDYuNzY4OTcgNC4zNDU0NEw5LjE1NDYyIDEuODYwMzhMOC43MzM4MSAxLjQyMjAzWk05LjU3NTUyIDEzLjcwMTJMMi44Mzk2NiA2LjY4NDdMMS45OTc5NiA3LjU2MTUxQzEuNzY1NDQgNy44MDM2MyAxLjc2NTQ0IDguMTk2MzQgMS45OTc5NiA4LjQzODU0TDcuODkxNzggMTQuNTc4QzguMTI0MyAxNC44MjAyIDguNTAxMjkgMTQuODIwMiA4LjczMzgxIDE0LjU3OEw5LjU3NTUyIDEzLjcwMTJaTTMuNjgxNTYgMTEuOTQ2NkwyLjEzNzggMTMuNTU0N0MxLjkwNTI5IDEzLjc5NjkgMS45MDUyOSAxNC4xODk2IDIuMTM3OCAxNC40MzE4QzIuMzcwMzEgMTQuNjc0IDIuNzQ3MjkgMTQuNjc0IDIuOTc5OCAxNC40MzE4TDQuNTIzNTUgMTIuODIzN0wzLjY4MTU2IDExLjk0NjZaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfaWNvbl9ob3VzZWtlZXBpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEp1bmsgVGFnIFNWRyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidqdW5rVGFnJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIgNC4wMDAwNEgzLjMzMzMzTTMuMzMzMzMgNC4wMDAwNEgxNE0zLjMzMzMzIDQuMDAwMDRWMTMuMzMzNEMzLjMzMzMzIDEzLjY4NyAzLjQ3MzgxIDE0LjAyNjEgMy43MjM4NiAxNC4yNzYyQzMuOTczOTEgMTQuNTI2MiA0LjMxMzA0IDE0LjY2NjcgNC42NjY2NyAxNC42NjY3SDExLjMzMzNDMTEuNjg3IDE0LjY2NjcgMTIuMDI2MSAxNC41MjYyIDEyLjI3NjEgMTQuMjc2MkMxMi41MjYyIDE0LjAyNjEgMTIuNjY2NyAxMy42ODcgMTIuNjY2NyAxMy4zMzM0VjQuMDAwMDRIMy4zMzMzM1pNNS4zMzMzMyA0LjAwMDA0VjIuNjY2NzFDNS4zMzMzMyAyLjMxMzA5IDUuNDczODEgMS45NzM5NSA1LjcyMzg2IDEuNzIzOUM1Ljk3MzkxIDEuNDczODUgNi4zMTMwNCAxLjMzMzM3IDYuNjY2NjcgMS4zMzMzN0g5LjMzMzMzQzkuNjg2OTYgMS4zMzMzNyAxMC4wMjYxIDEuNDczODUgMTAuMjc2MSAxLjcyMzlDMTAuNTI2MiAxLjk3Mzk1IDEwLjY2NjcgMi4zMTMwOSAxMC42NjY3IDIuNjY2NzFWNC4wMDAwNE02LjY2NjY3IDcuMzMzMzdWMTEuMzMzNE05LjMzMzMzIDcuMzMzMzdWMTEuMzMzNFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1sYWJlbFwiPnt7IHNlbGVjdGVkQ2F0ZWdvcnlJY29uTGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb24gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGljb24gb2YgY2F0ZWdvcnlJY29uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhdGVnb3J5SWNvbkZyb21Ecm9wZG93bigkZXZlbnQsIGljb24udmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeS1pY29uXCIgW25nQ2xhc3NdPVwiaWNvbi52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJpY29uLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJsdWUgVGFnIFNWRyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2JsdWVUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFB1cnBsZSBUYWcgU1ZHIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ3B1cnBsZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjcwNzEgMTMuMjkyOUwxMS40MTQyIDRINFYxMS40MTQyTDEzLjI5MjkgMjAuNzA3MUMxMy42ODM0IDIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDE0LjcwNzEgMjAuNzA3MUwyMC43MDcxIDE0LjcwNzFDMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTMuNjgzNCAyMC43MDcxIDEzLjI5MjlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgN0g3LjAxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPcmFuZ2UgVGFnIFNWRyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidvcmFuZ2VUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSG91c2UgS2VlcGluZyBUYWcgU1ZHIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2hvdXNlS2VlcGluZ1RhZydcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzExNjJfMjQ2NTApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4wNDk4MyAwLjU0NDk0N0M3Ljc0NzM4IC0wLjE4MTY0OSA4Ljg3ODI5IC0wLjE4MTY0OSA5LjU3NTg0IDAuNTQ0OTQ3TDE1LjQ2OTcgNi42ODQ0QzE2LjE2NzIgNy40MTEwMSAxNi4xNjcyIDguNTg5MDQgMTUuNDY5NyA5LjMxNTY1TDkuNTc1ODQgMTUuNDU1MUM4Ljg3ODI5IDE2LjE4MTYgNy43NDczOCAxNi4xODE2IDcuMDQ5ODMgMTUuNDU1MUw1LjM2NTYyIDEzLjcwMDdMMy44MjE3OSAxNS4zMDg4QzMuMTI0MjYgMTYuMDM1NCAxLjk5MzM0IDE2LjAzNTQgMS4yOTU4IDE1LjMwODhDMC41OTgyNzIgMTQuNTgyMyAwLjU5ODI3MiAxMy40MDQyIDEuMjk1OCAxMi42Nzc3TDIuODM5NjQgMTEuMDY5NUwxLjE1NTk2IDkuMzE1NjVDMC40NTg0MjkgOC41ODkwNCAwLjQ1ODQyOSA3LjQxMTAxIDEuMTU1OTYgNi42ODQ0TDcuMDQ5ODMgMC41NDQ5NDdaTTguNzMzODEgMS40MjIwM0M4LjUwMTI5IDEuMTc5ODMgOC4xMjQzIDEuMTc5ODMgNy44OTE3OCAxLjQyMjAzTDMuNjgxNjUgNS44MDc2MkwxMC40MTc1IDEyLjgyNDJMMTQuNjI3NyA4LjQzODU0QzE0Ljg2MDIgOC4xOTYzNCAxNC44NjAyIDcuODAzNjMgMTQuNjI3NyA3LjU2MTUxTDExLjY4MDUgNC40OTE0M0wxMC42OTgxIDUuNTE0NjlDMTAuNDY1NiA1Ljc1Njg5IDEwLjA4ODcgNS43NTY4OSA5Ljg1NjE0IDUuNTE0NjlDOS42MjM2MyA1LjI3MjQ5IDkuNjIzNjMgNC44Nzk4MSA5Ljg1NjE0IDQuNjM3NjFMMTAuODM4NCAzLjYxNDM1TDkuOTk2NjUgMi43Mzc0Nkw3LjYxMSA1LjIyMjUyQzcuMzc4NDkgNS40NjQ3MSA3LjAwMTQ5IDUuNDY0NzEgNi43Njg5NyA1LjIyMjUyQzYuNTM2NDYgNC45ODAzMiA2LjUzNjQ2IDQuNTg3NjMgNi43Njg5NyA0LjM0NTQ0TDkuMTU0NjIgMS44NjAzOEw4LjczMzgxIDEuNDIyMDNaTTkuNTc1NTIgMTMuNzAxMkwyLjgzOTY2IDYuNjg0N0wxLjk5Nzk2IDcuNTYxNTFDMS43NjU0NCA3LjgwMzYzIDEuNzY1NDQgOC4xOTYzNCAxLjk5Nzk2IDguNDM4NTRMNy44OTE3OCAxNC41NzhDOC4xMjQzIDE0LjgyMDIgOC41MDEyOSAxNC44MjAyIDguNzMzODEgMTQuNTc4TDkuNTc1NTIgMTMuNzAxMlpNMy42ODE1NiAxMS45NDY2TDIuMTM3OCAxMy41NTQ3QzEuOTA1MjkgMTMuNzk2OSAxLjkwNTI5IDE0LjE4OTYgMi4xMzc4IDE0LjQzMThDMi4zNzAzMSAxNC42NzQgMi43NDcyOSAxNC42NzQgMi45Nzk4IDE0LjQzMThMNC41MjM1NSAxMi44MjM3TDMuNjgxNTYgMTEuOTQ2NlpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMzNDQwNTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTE2Ml8yNDY1MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSnVuayBUYWcgU1ZHIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2p1bmtUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMiA0LjAwMDA0SDMuMzMzMzNNMy4zMzMzMyA0LjAwMDA0SDE0TTMuMzMzMzMgNC4wMDAwNFYxMy4zMzM0QzMuMzMzMzMgMTMuNjg3IDMuNDczODEgMTQuMDI2MSAzLjcyMzg2IDE0LjI3NjJDMy45NzM5MSAxNC41MjYyIDQuMzEzMDQgMTQuNjY2NyA0LjY2NjY3IDE0LjY2NjdIMTEuMzMzM0MxMS42ODcgMTQuNjY2NyAxMi4wMjYxIDE0LjUyNjIgMTIuMjc2MSAxNC4yNzYyQzEyLjUyNjIgMTQuMDI2MSAxMi42NjY3IDEzLjY4NyAxMi42NjY3IDEzLjMzMzRWNC4wMDAwNEgzLjMzMzMzWk01LjMzMzMzIDQuMDAwMDRWMi42NjY3MUM1LjMzMzMzIDIuMzEzMDkgNS40NzM4MSAxLjk3Mzk1IDUuNzIzODYgMS43MjM5QzUuOTczOTEgMS40NzM4NSA2LjMxMzA0IDEuMzMzMzcgNi42NjY2NyAxLjMzMzM3SDkuMzMzMzNDOS42ODY5NiAxLjMzMzM3IDEwLjAyNjEgMS40NzM4NSAxMC4yNzYxIDEuNzIzOUMxMC41MjYyIDEuOTczOTUgMTAuNjY2NyAyLjMxMzA5IDEwLjY2NjcgMi42NjY3MVY0LjAwMDA0TTYuNjY2NjcgNy4zMzMzN1YxMS4zMzM0TTkuMzMzMzMgNy4zMzMzN1YxMS4zMzM0XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGljb24ubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgdGV4dC1tdXRlZFwiPkNhdGVnb3J5IE5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKT8uaW52YWxpZCAmJiBjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/LnRvdWNoZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgbmV3IGNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpPy50b3VjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5IG5hbWUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpPy5oYXNFcnJvcignZHVwbGljYXRlJykgJiYgY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpPy50b3VjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5IG5hbWUgYWxyZWFkeSBleGlzdHMuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCB0ZXh0LW11dGVkXCI+TGltaXRhdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC13cmFwcGVyXCIgW2NsYXNzLm9wZW5dPVwiaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZVwiIChjbGljayk9XCJ0b2dnbGVDYXRlZ29yeUxpbWl0RHJvcGRvd24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgY2F0ZWdvcnlGb3JtLmdldCgnbGltaXQnKT8udmFsdWUgfHwgcGVyY2VudGFnZUxpc3RbMF0gfX0lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc0NhdGVnb3J5TGltaXREcm9wZG93bk9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIHBlcmNlbnRhZ2VMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2F0ZWdvcnlMaW1pdFZhbHVlKCRldmVudCwgcClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwIH19JVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyIGJvcmRlci0wIHB0LTBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiY2xvc2VDYXRlZ29yeU1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwic3VibWl0Q2F0ZWdvcnlGb3JtKClcIj5cclxuICAgICAgICAgICAgICAgIHt7IGNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJyA/ICdDcmVhdGUnIDogJ1NhdmUnIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8IS0tIERlbGV0ZSBDb25maXJtYXRpb24gTW9kYWwgLS0+XHJcbiAgICA8bmctdGVtcGxhdGUgI2RlbGV0ZUNhdGVnb3J5TW9kYWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgdGV4dC1jZW50ZXIgcC00XCI+XHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cImZ3LXNlbWlib2xkIG1iLTJcIj5Db25maXJtYXRpb248L2g1PlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTQgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgWW91J3JlIGFib3V0IHRvIGRlbGV0ZSA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgY2F0ZWdvcnlQZW5kaW5nRGVsZXRlTmFtZSB9fTwvc3Bhbj4gY2F0ZWdvcnkuXHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJjbG9zZURlbGV0ZU1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiAoY2xpY2spPVwiY29uZmlybURlbGV0ZUNhdGVnb3J5KClcIj5EZWxldGU8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDwhLS0gUmVzZXQgU3RvcmUgUmVxdWVzdHMgQ29uZmlybWF0aW9uIE1vZGFsIC0tPlxyXG4gICAgPG5nLXRlbXBsYXRlICNyZXNldENvbmZpcm1hdGlvbk1vZGFsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHRleHQtY2VudGVyIHAtNFwiPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJmdy1zZW1pYm9sZCBtYi0yXCI+UmVzZXQgU3RvcmUgUmVxdWVzdHM8L2g1PlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTQgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHByb2NlZWQgd2l0aCByZXNldHRpbmcgdGhlIHNlbGVjdGVkIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57e1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzLmxlbmd0aCB9fTwvc3Bhbj4gc3RvcmUocykgcmVxdWVzdHM/XHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJjbG9zZVJlc2V0TW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiY29uZmlybVJlc2V0U3RvcmVSZXF1ZXN0KClcIj5SZXNldDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG48L2Zvcm0+Il19
851
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBdUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQVcxQyxNQUFNLE9BQU8sOEJBQThCO0lBd0RyQjtJQUNYO0lBQ0M7SUFDQTtJQUNBO0lBM0RWLDRCQUE0QixDQUFhO0lBQ3hCLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzFDLFlBQVksR0FBbUY7UUFDN0YsUUFBUSxFQUFFLEVBQUU7UUFDWixhQUFhLEVBQUUsRUFBRTtLQUNsQixDQUFDO0lBQ0Ysc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25DLGNBQWMsR0FBYSxFQUFFLENBQUM7SUFDOUIsc0JBQXNCLEdBQWEsRUFBRSxDQUFDO0lBQ3RD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QlUsOEJBQThCOzRGQUE5Qiw4QkFBOEIsc2RDakIzQyxtcjNEQTJ3Qk87OzRGRDF2Qk0sOEJBQThCO2tCQVAxQyxTQUFTOytCQUNFLDRCQUE0QjtrTUEwRFYsZ0JBQWdCO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ1Esc0JBQXNCO3NCQUF2RCxTQUFTO3VCQUFDLHFCQUFxQjtnQkFDSyx5QkFBeUI7c0JBQTdELFNBQVM7dUJBQUMsd0JBQXdCO2dCQW9oQm5DLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdiTW9kYWwsIE5nYk1vZGFsUmVmIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgQ2xpZW50QXBpU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NsaWVudC1hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZm9vdGZhbGwtY29uZmlndXJhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBGb290ZmFsbENvbmZpZ3VyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcmVzZXRSZXF1ZXN0OiB7IGNsaWVudElkOiBzdHJpbmc7IGFycmF5T2ZTdG9yZXM6IHsgc3RvcmVJZDogc3RyaW5nOyBkYXRlU3RyaW5nOiBzdHJpbmcgfVtdIH0gPSB7XHJcbiAgICBjbGllbnRJZDogJycsXHJcbiAgICBhcnJheU9mU3RvcmVzOiBbXVxyXG4gIH07XHJcbiAgc3BvY1RpY2tldENyZWF0aW9uZGF5cyA9IFsxLCAyLCAzXTtcclxuICBwZXJjZW50YWdlTGlzdDogbnVtYmVyW10gPSBbXTtcclxuICBhY2N1cmFjeVBlcmNlbnRhZ2VMaXN0OiBudW1iZXJbXSA9IFtdO1xyXG4gIHN0b3JlVGlja2V0RGF5czogbnVtYmVyW10gPSBbXTtcclxuICBzZW5kVGlja2V0VGFuZ286IG51bWJlcltdID0gW107XHJcbiAgaXNFZGl0OiBib29sZWFuID0gdHJ1ZTtcclxuICBjbGllbklkOiBzdHJpbmc7XHJcbiAgc3RvcmVMaXN0OiBhbnkgPSBbXTtcclxuICBpc1Jlc2V0dGluZyA9IGZhbHNlO1xyXG4gIGNhdGVnb3J5Rm9ybSE6IEZvcm1Hcm91cDtcclxuICBjYXRlZ29yeU1vZGFsTW9kZTogJ2FkZCcgfCAnZWRpdCcgPSAnYWRkJztcclxuICBlZGl0aW5nQ2F0ZWdvcnlJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgY2F0ZWdvcnlNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcclxuICBkZWxldGVNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcclxuICByZXNldE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xyXG4gIGNhdGVnb3J5VG9EZWxldGVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgY2F0ZWdvcnlQZW5kaW5nRGVsZXRlTmFtZSA9ICcnO1xyXG4gIGFjdGl2ZU1lbnVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgb3BlbkxpbWl0RHJvcGRvd25JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICBpc0F1dG9DbG9zZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzU3RvcmVEYXlzRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgZGF5c09wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXHJcbiAgICB7IGxhYmVsOiAnTW9udGgnLCB2YWx1ZTogJzMwJyB9LFxyXG4gICAgeyBsYWJlbDogJ1dlZWsnLCB2YWx1ZTogJzcnIH1cclxuICBdO1xyXG4gIGlzU3RvcmVBY2N1cmFjeURyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmV2aXNpb25EZXBzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICByZWFkb25seSBtYXhDYXRlZ29yeUNvdW50ID0gNTtcclxuICByZWFkb25seSBiYXNlQ2F0ZWdvcnlJY29uczphbnkgPSBbXHJcbiAgICAvLyB7IGxhYmVsOiAnQmx1ZSBUYWcnLCB2YWx1ZTogJ2JsdWVUYWcnIH0sXHJcbiAgICB7IGxhYmVsOiAnUHVycGxlIFRhZycsIHZhbHVlOiAncHVycGxlVGFnJyB9LFxyXG4gICAgeyBsYWJlbDogJ09yYW5nZSBUYWcnLCB2YWx1ZTogJ29yYW5nZVRhZycgfVxyXG4gIF07XHJcblxyXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxDYXRlZ29yeUljb25zID0gW1xyXG4gICAgeyBsYWJlbDogJ0hvdXNlIEtlZXBpbmcnLCB2YWx1ZTogJ2hvdXNlS2VlcGluZ1RhZycgfSxcclxuICAgIHsgbGFiZWw6ICdKdW5rJywgdmFsdWU6ICdqdW5rVGFnJyB9XHJcbiAgXTtcclxuXHJcbiAgZm9vdGZhbGxDb25maWdEYXRhOiBhbnkgPSBbXTtcclxuICBAVmlld0NoaWxkKCdjYXRlZ29yeU1vZGFsJykgY2F0ZWdvcnlNb2RhbFRwbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnZGVsZXRlQ2F0ZWdvcnlNb2RhbCcpIGRlbGV0ZUNhdGVnb3J5TW9kYWxUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Jlc2V0Q29uZmlybWF0aW9uTW9kYWwnKSByZXNldENvbmZpcm1hdGlvbk1vZGFsVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogQ2xpZW50QXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSkge1xyXG4gICAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50SWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW5JZCA9IGVcclxuICAgICAgICB0aGlzLnJlc2V0UmVxdWVzdC5jbGllbnRJZCA9IGU7XHJcbiAgICAgICAgdGhpcy5nZXRDbGllbnRNYXBwZWRTdG9yZXNEZXRhaWxzKGUpO1xyXG4gICAgICAgIC8vIExvYWQgZm9vdGZhbGwgZGV0YWlscyB3aGVuIGNsaWVudElkIGlzIGF2YWlsYWJsZVxyXG4gICAgICAgIC8vIHRoaXMubG9hZEZvb3RmYWxsQ29uZmlnRGV0YWlscyhlKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0Q2F0ZWdvcnlGb3JtKCk7XHJcbiAgICB0aGlzLmxvYWRGb3JtKCk7XHJcbiAgICB0aGlzLmdlbmVyYXRlRGF5T3B0aW9ucyg0NSk7XHJcbiAgICB0aGlzLmdlbmVyYXRlRGlyTGltaXRhdGlvbigxMDApO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUFjY3VyYWN5T3B0aW9ucyg5NSk7XHJcbiAgICB0aGlzLnNlbmRUaWNrZXRUb1RhbmdvKDEwMCk7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50Rm9ybURhdGEucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICBpZiAocmVzLnR5cGUgPT09ICdpbnB1dCcgJiYgcmVzLmZvcm0gPT09ICdmb290ZmFsbERpcmVjdG9yeUNvbmZpZ3MnKSB7XHJcbiAgICAgICAgICB0aGlzLnBhdGNoRm9ybShyZXMudmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgZm9vdGZhbGwgZGV0YWlscyBmcm9tIEFQSSB3aGVuIGNsaWVudElkIGlzIGF2YWlsYWJsZVxyXG4gICAqIFRoaXMgZW5zdXJlcyBjbGllbklkIGlzIHNldCBiZWZvcmUgbWFraW5nIHRoZSBBUEkgY2FsbFxyXG4gICAqL1xyXG4gIC8vIHByaXZhdGUgbG9hZEZvb3RmYWxsQ29uZmlnRGV0YWlscyhjbGllbnRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgLy8gICBpZiAoIWNsaWVudElkKSB7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMuYXBpU2VydmljZS5nZXRGb290ZmFsbERldGFpbHMoY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gIC8vICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHJlcykge1xyXG4gIC8vICAgICAgICAgY29uc29sZS5sb2coJ0Zvb3RmYWxsIERpcmVjdG9yeSBDb25maWdzIGRhdGEgOjonLCByZXMpO1xyXG4gIC8vICAgICAgICAgaWYgKHJlcz8uZGF0YSAmJiByZXM/LmRhdGE/LmZvb3RmYWxsRGlyZWN0b3J5Q29uZmlncykge1xyXG4gIC8vICAgICAgICAgICB0aGlzLmZvb3RmYWxsQ29uZmlnRGF0YSA9IHJlcz8uZGF0YT8uZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzO1xyXG4gIC8vICAgICAgICAgICB0aGlzLnBhdGNoRm9ybSh0aGlzLmZvb3RmYWxsQ29uZmlnRGF0YSk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgZm9vdGZhbGwgZGV0YWlsczonLCBlcnIpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIGdlbmVyYXRlRGF5T3B0aW9ucyhjb3VudDogbnVtYmVyKSB7XHJcbiAgdGhpcy5zdG9yZVRpY2tldERheXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gaSArIDEpO1xyXG4gfVxyXG5cclxuICBnZW5lcmF0ZURpckxpbWl0YXRpb24oY291bnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5wZXJjZW50YWdlTGlzdCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiBpICsgMSk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZUFjY3VyYWN5T3B0aW9ucyhtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5hY2N1cmFjeVBlcmNlbnRhZ2VMaXN0ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbWF4IH0sIChfLCBpKSA9PiBpICsgMSk7XHJcbiAgfVxyXG5cclxuICBzZW5kVGlja2V0VG9UYW5nbyhtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZW5kVGlja2V0VGFuZ28gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBtYXggfSwgKF8sIGkpID0+IGkgKyAxKTtcclxuICB9XHJcblxyXG4gIGxvYWRGb3JtKCkge1xyXG4gICAgLy8gaW5pdGlhbGl6ZSBmb3JtXHJcbiAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcmV2aXNpb246IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBhbGxvd1RpY2tldENyZWF0aW9uOiBbbnVsbF0sXHJcbiAgICAgIGlzQXV0b0Nsb3NlRW5hYmxlOiBbZmFsc2VdLFxyXG4gICAgICBhdXRvQ2xvc2VBY2N1cmFjeTogWycnXSxcclxuICAgICAgdGFnZ2luZ0xpbWl0YXRpb246IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBhY2N1cmFjeUJyZWFjaDogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgdGlja2V0Q291bnQ6IFsnJ10sXHJcbiAgICAgICAgZGF5czogW10sXHJcbiAgICAgICAgYWNjdXJhY3k6IFsnJ11cclxuICAgICAgfSksXHJcbiAgICAgIHRhbmdvUmV2aWV3OiBbJyddXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHBhdGNoRm9ybShkYXRhOiBhbnkpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuO1xyXG4gICAgLy8gcGF0Y2ggcmV2aXNpb25cclxuICAgIGNvbnN0IHJldmlzaW9uQXJyYXkgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdyZXZpc2lvbicpIGFzIEZvcm1BcnJheTtcclxuICAgIHJldmlzaW9uQXJyYXkuY2xlYXIoKTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEucmV2aXNpb24pKSB7XHJcbiAgICAgIGRhdGEucmV2aXNpb24uZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV2aXNpb25BcnJheS5wdXNoKHRoaXMuY3JlYXRlUmV2aXNpb24oaXRlbS5hY3Rpb25UeXBlLCBpdGVtLmlzQ2hlY2tlZCkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwYXRjaCB0YWdnaW5nTGltaXRhdGlvbiAtLSBiYXNlZCBvbiBuZXcga2V5IGZvcm1hdCBcImVmZmVjdGl2ZUZyb21cIlxyXG4gICAgY29uc3QgdGFnQXJyYXkgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCd0YWdnaW5nTGltaXRhdGlvbicpIGFzIEZvcm1BcnJheTtcclxuICAgIHRhZ0FycmF5LmNsZWFyKCk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhPy50YWdnaW5nTGltaXRhdGlvbikgJiYgZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24/Lmxlbmd0aCA+IDAgJiYgXHJcbiAgICBkYXRhPy50YWdnaW5nTGltaXRhdGlvbj8ubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIC8vIE9ubHkgb25lIGNvbmZpZyBwcmVzZW50IOKAkyB1c2UgaXRzIHZhbHVlcyBkaXJlY3RseVxyXG4gICAgICBkYXRhPy50YWdnaW5nTGltaXRhdGlvblswXT8udmFsdWVzPy5mb3JFYWNoKCh0YWc6IGFueSkgPT4ge1xyXG4gICAgICAgIHRhZ0FycmF5LnB1c2godGhpcy5jcmVhdGVUYWdMaW1pdCh0YWc/LnR5cGUsIHRhZz8udmFsdWUsIHRhZz8uaWNvbk5hbWUsIHRhZz8ubmFtZSwgdGFnPy5rZXkpKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24pICYmIGRhdGE/LnRhZ2dpbmdMaW1pdGF0aW9uPy5sZW5ndGggPiAwICYmIFxyXG4gICAgZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24/Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgLy8gTXVsdGlwbGUgY29uZmlncyBwcmVzZW50IOKAkyBwaWNrIHRoZSBvbmUgd2l0aCBsYXRlc3QgZWZmZWN0aXZlRnJvbSBkYXRlXHJcbiAgICAgIGNvbnN0IGxhdGVzdEVudHJ5ID0gZGF0YS50YWdnaW5nTGltaXRhdGlvbi5yZWR1Y2UoKGxhdGVzdDogYW55LCBjdXJyZW50OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWN1cnJlbnQgfHwgIWN1cnJlbnQuZWZmZWN0aXZlRnJvbSkge1xyXG4gICAgICAgICAgcmV0dXJuIGxhdGVzdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFsYXRlc3QgfHwgIWxhdGVzdC5lZmZlY3RpdmVGcm9tKSB7XHJcbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZShjdXJyZW50LmVmZmVjdGl2ZUZyb20pO1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdERhdGUgPSBuZXcgRGF0ZShsYXRlc3QuZWZmZWN0aXZlRnJvbSk7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlID4gbGF0ZXN0RGF0ZSA/IGN1cnJlbnQgOiBsYXRlc3Q7XHJcbiAgICAgIH0sIG51bGwpO1xyXG5cclxuICAgICAgaWYgKGxhdGVzdEVudHJ5ICYmIEFycmF5LmlzQXJyYXkobGF0ZXN0RW50cnkudmFsdWVzKSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdlZmZlY3RpdmVGcm9tOicsIGxhdGVzdEVudHJ5LmVmZmVjdGl2ZUZyb20pO1xyXG4gICAgICAgIGxhdGVzdEVudHJ5LnZhbHVlcy5mb3JFYWNoKCh0YWc6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGFnQXJyYXkucHVzaCh0aGlzLmNyZWF0ZVRhZ0xpbWl0KHRhZz8udHlwZSwgdGFnPy52YWx1ZSwgdGFnPy5pY29uTmFtZSwgdGFnPy5uYW1lLCB0YWc/LmtleSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcGF0Y2ggYWNjdXJhY3lCcmVhY2ggZ3JvdXBcclxuICAgIGlmIChkYXRhLmFjY3VyYWN5QnJlYWNoKSB7XHJcbiAgICAgIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoJyk/LnBhdGNoVmFsdWUoe1xyXG4gICAgICAgIHRpY2tldENvdW50OiBkYXRhLmFjY3VyYWN5QnJlYWNoLnRpY2tldENvdW50LFxyXG4gICAgICAgIGRheXM6IGRhdGEuYWNjdXJhY3lCcmVhY2guZGF5cyA/PyAnMzAnLFxyXG4gICAgICAgIGFjY3VyYWN5OiBkYXRhLmFjY3VyYWN5QnJlYWNoLmFjY3VyYWN5XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHBhdGNoIHNpbXBsZSBmaWVsZHNcclxuICAgIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgYWxsb3dUaWNrZXRDcmVhdGlvbjogZGF0YS5hbGxvd1RpY2tldENyZWF0aW9uID8/IDMsXHJcbiAgICAgIGlzQXV0b0Nsb3NlRW5hYmxlOiBkYXRhLmlzQXV0b0Nsb3NlRW5hYmxlID8/IGZhbHNlLFxyXG4gICAgICBhdXRvQ2xvc2VBY2N1cmFjeTogZGF0YS5hdXRvQ2xvc2VBY2N1cmFjeSA/PyAnOTUlJyxcclxuICAgICAgdGFuZ29SZXZpZXc6IGRhdGEudGFuZ29SZXZpZXcgPz8gJzg1JSdcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmRpc2FibGUoKTtcclxuICAgIC8vIEFwcGx5IGRlcGVuZGVuY3kgbG9naWNcclxuICAgIHRoaXMuaGFuZGxlUmV2aXNpb25EZXBlbmRlbmNpZXMoKTtcclxuICB9XHJcblxyXG4gIG9wZW5DYXRlZ29yeU1vZGFsKG1vZGU6ICdhZGQnIHwgJ2VkaXQnLCBpbmRleD86IG51bWJlcikge1xyXG4gICAgaWYgKG1vZGUgPT09ICdhZGQnICYmIHRoaXMuaXNDYXRlZ29yeUxpbWl0UmVhY2hlZCkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnTWF4aW11bSBDYXRlZ29yeSBjcmVhdGlvbiBsaW1pdCByZWFjaGVkJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9IG1vZGU7XHJcbiAgICB0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4ID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IGluZGV4IDogbnVsbDtcclxuXHJcbiAgICBpZiAobW9kZSA9PT0gJ2VkaXQnICYmIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgY2F0ZWdvcnlHcm91cCA9IHRoaXMudGFnTGltaXRzLmF0KHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgdGhpcy5jYXRlZ29yeUZvcm0uc2V0VmFsdWUoe1xyXG4gICAgICAgIGljb25OYW1lOiBjYXRlZ29yeUdyb3VwLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgfHwgdGhpcy5iYXNlQ2F0ZWdvcnlJY29uc1swXS52YWx1ZSxcclxuICAgICAgICBuYW1lOiBjYXRlZ29yeUdyb3VwLmdldCgnbmFtZScpPy52YWx1ZSB8fCBjYXRlZ29yeUdyb3VwLmdldCgndHlwZScpPy52YWx1ZSB8fCAnJyxcclxuICAgICAgICBsaW1pdDogY2F0ZWdvcnlHcm91cC5nZXQoJ3ZhbHVlJyk/LnZhbHVlIHx8IHRoaXMucGVyY2VudGFnZUxpc3RbMF1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhdGVnb3J5Rm9ybS5yZXNldCh7XHJcbiAgICAgICAgaWNvbk5hbWU6IHRoaXMuYmFzZUNhdGVnb3J5SWNvbnNbMF0udmFsdWUsXHJcbiAgICAgICAgbmFtZTogJycsXHJcbiAgICAgICAgbGltaXQ6IHRoaXMucGVyY2VudGFnZUxpc3RbMF1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYXRlZ29yeU1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmNhdGVnb3J5TW9kYWxUcGwsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIHNpemU6ICdtZCcsXHJcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcclxuICAgICAga2V5Ym9hcmQ6IHRydWVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0Q2F0ZWdvcnlGb3JtKCkge1xyXG4gICAgaWYgKHRoaXMuY2F0ZWdvcnlGb3JtLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5jYXRlZ29yeUZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgeyBpY29uTmFtZSwgbmFtZSwgbGltaXQgfSA9IHRoaXMuY2F0ZWdvcnlGb3JtLnZhbHVlO1xyXG4gICAgY29uc3QgdHJpbW1lZE5hbWUgPSAobmFtZSB8fCAnJykudHJpbSgpO1xyXG5cclxuICAgIGlmICghdHJpbW1lZE5hbWUpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdDYXRlZ29yeSBuYW1lIGlzIHJlcXVpcmVkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZHVwbGljYXRlSW5kZXggPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5maW5kSW5kZXgoKGN0cmwsIGlkeCkgPT5cclxuICAgICAgKGN0cmwuZ2V0KCduYW1lJyk/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSB0cmltbWVkTmFtZS50b0xvd2VyQ2FzZSgpIHx8IFxyXG4gICAgICAgY3RybC5nZXQoJ3R5cGUnKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09IHRyaW1tZWROYW1lLnRvTG93ZXJDYXNlKCkpICYmXHJcbiAgICAgIGlkeCAhPT0gKHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggPz8gLTEpXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChkdXBsaWNhdGVJbmRleCAhPT0gLTEpIHtcclxuICAgICAgY29uc3QgbmFtZUNvbnRyb2wgPSB0aGlzLmNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKTtcclxuICAgICAgbmFtZUNvbnRyb2w/LnNldEVycm9ycyh7IGR1cGxpY2F0ZTogdHJ1ZSB9KTtcclxuICAgICAgbmFtZUNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIGljb25OYW1lIGFscmVhZHkgZXhpc3RzXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmdJY29uID0gdGhpcy50YWdMaW1pdHMuY29udHJvbHMuZmluZCgoY3RybCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uTmFtZVxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKGV4aXN0aW5nSWNvbikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVGhpcyBpY29uIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnZWRpdCcgJiYgdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBJbiBlZGl0IG1vZGUsIGNoZWNrIGlmIGljb24gaXMgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5IChleGNsdWRpbmcgY3VycmVudCBvbmUpXHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nSWNvbiA9IHRoaXMudGFnTGltaXRzLmNvbnRyb2xzLmZpbmQoKGN0cmwsIGlkeCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uTmFtZSAmJiBpZHggIT09IHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXhcclxuICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChleGlzdGluZ0ljb24pIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1RoaXMgaWNvbiBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciBjYXRlZ29yeS4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgLy8gR2VuZXJhdGUgdHlwZSBmcm9tIG5hbWUgKGxvd2VyY2FzZSwgcmVtb3ZlIHNwYWNlcylcclxuICAgICAgY29uc3QgdHlwZSA9IHRyaW1tZWROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnJyk7XHJcbiAgICAgIGNvbnN0IGtleSA9IHR5cGUuY2hhckF0KDApO1xyXG4gICAgICB0aGlzLnRhZ0xpbWl0cy5wdXNoKHRoaXMuY3JlYXRlVGFnTGltaXQodHlwZSwgTnVtYmVyKGxpbWl0KSwgaWNvbk5hbWUsIHRyaW1tZWROYW1lLCBrZXkpKTtcclxuICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ0NhdGVnb3J5IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3J5R3JvdXAgPSB0aGlzLnRhZ0xpbWl0cy5hdCh0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4KSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgIGNhdGVnb3J5R3JvdXAucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgbmFtZTogdHJpbW1lZE5hbWUsXHJcbiAgICAgICAgdmFsdWU6IE51bWJlcihsaW1pdCksXHJcbiAgICAgICAgaWNvbk5hbWU6IGljb25OYW1lXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnQ2F0ZWdvcnkgdXBkYXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbG9zZUNhdGVnb3J5TW9kYWwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlQ2F0ZWdvcnlNb2RhbCgpIHtcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxSZWYpIHtcclxuICAgICAgdGhpcy5jYXRlZ29yeU1vZGFsUmVmLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMuY2F0ZWdvcnlNb2RhbFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb3BlbkRlbGV0ZUNhdGVnb3J5TW9kYWwoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXggPSBpbmRleDtcclxuICAgIGNvbnN0IGNhdGVnb3J5R3JvdXAgPSB0aGlzLnRhZ0xpbWl0cy5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgdGhpcy5jYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gY2F0ZWdvcnlHcm91cC5nZXQoJ25hbWUnKT8udmFsdWUgfHwgJ3RoaXMgY2F0ZWdvcnknO1xyXG4gICAgdGhpcy5kZWxldGVNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5kZWxldGVDYXRlZ29yeU1vZGFsVHBsLCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICBzaXplOiAnc20nLFxyXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXHJcbiAgICAgIGtleWJvYXJkOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25maXJtRGVsZXRlQ2F0ZWdvcnkoKSB7XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXggPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWdMaW1pdHMucmVtb3ZlQXQodGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXgpO1xyXG4gICAgdGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXggPSBudWxsO1xyXG4gICAgdGhpcy5jYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gJyc7XHJcbiAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnQ2F0ZWdvcnkgZGVsZXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICB0aGlzLmNsb3NlRGVsZXRlTW9kYWwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlRGVsZXRlTW9kYWwoKSB7XHJcbiAgICBpZiAodGhpcy5kZWxldGVNb2RhbFJlZikge1xyXG4gICAgICB0aGlzLmRlbGV0ZU1vZGFsUmVmLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMuZGVsZXRlTW9kYWxSZWYgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gJyc7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RDYXRlZ29yeUljb24oaWNvblZhbHVlOiBzdHJpbmcpIHtcclxuICAgIC8vIENoZWNrIGlmIGljb25OYW1lIGFscmVhZHkgZXhpc3RzXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmdJY29uID0gdGhpcy50YWdMaW1pdHMuY29udHJvbHMuZmluZCgoY3RybCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uVmFsdWVcclxuICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChleGlzdGluZ0ljb24pIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1RoaXMgaWNvbiBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciBjYXRlZ29yeS4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2VkaXQnICYmIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgLy8gSW4gZWRpdCBtb2RlLCBjaGVjayBpZiBpY29uIGlzIHVzZWQgYnkgYW5vdGhlciBjYXRlZ29yeSAoZXhjbHVkaW5nIGN1cnJlbnQgb25lKVxyXG4gICAgICBjb25zdCBleGlzdGluZ0ljb24gPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5maW5kKChjdHJsLCBpZHgpID0+IFxyXG4gICAgICAgIGN0cmwuZ2V0KCdpY29uTmFtZScpPy52YWx1ZSA9PT0gaWNvblZhbHVlICYmIGlkeCAhPT0gdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleFxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKGV4aXN0aW5nSWNvbikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVGhpcyBpY29uIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLmNhdGVnb3J5Rm9ybS5nZXQoJ2ljb25OYW1lJyk/LnNldFZhbHVlKGljb25WYWx1ZSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDYXRlZ29yeU1lbnUoZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuYWN0aXZlTWVudUluZGV4ID0gdGhpcy5hY3RpdmVNZW51SW5kZXggPT09IGluZGV4ID8gbnVsbCA6IGluZGV4O1xyXG4gIH1cclxuXHJcbiAgb25DYXRlZ29yeU1lbnVBY3Rpb24oZXZlbnQ6IEV2ZW50LCBhY3Rpb246ICdlZGl0JyB8ICdkZWxldGUnLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuYWN0aXZlTWVudUluZGV4ID0gbnVsbDtcclxuICAgIGlmIChhY3Rpb24gPT09ICdlZGl0Jykge1xyXG4gICAgICB0aGlzLm9wZW5DYXRlZ29yeU1vZGFsKCdlZGl0JywgaW5kZXgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcGVuRGVsZXRlQ2F0ZWdvcnlNb2RhbChpbmRleCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVMaW1pdERyb3Bkb3duKGV2ZW50OiBFdmVudCwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vcGVuTGltaXREcm9wZG93bkluZGV4ID0gdGhpcy5vcGVuTGltaXREcm9wZG93bkluZGV4ID09PSBpbmRleCA/IG51bGwgOiBpbmRleDtcclxuICB9XHJcblxyXG4gIHNlbGVjdExpbWl0VmFsdWUoZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSAodGhpcy50YWdMaW1pdHMuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ2F0ZWdvcnlMaW1pdERyb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9ICF0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHNlbGVjdENhdGVnb3J5TGltaXRWYWx1ZShldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuY2F0ZWdvcnlGb3JtLmdldCgnbGltaXQnKTtcclxuICAgIGNvbnRyb2w/LnNldFZhbHVlKHZhbHVlKTtcclxuICAgIGNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQXV0b0Nsb3NlRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpc0F1dG9DbG9zZUVuYWJsZWQgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdpc0F1dG9DbG9zZUVuYWJsZScpPy52YWx1ZTtcclxuICAgIGlmICghaXNBdXRvQ2xvc2VFbmFibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0F1dG9DbG9zZURyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbmRUYW5nb0Nsb3NlRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gIXRoaXMuaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RBdXRvQ2xvc2VBY2N1cmFjeShldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2F1dG9DbG9zZUFjY3VyYWN5Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShgJHt2YWx1ZX0lYCk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFNlbmRUaWNrZXRUYW5nbyhldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3RhbmdvUmV2aWV3Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShgJHt2YWx1ZX0lYCk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVRpY2tldENvdW50RHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzVGlja2V0Q291bnREcm9wZG93bk9wZW4gPSAhdGhpcy5pc1RpY2tldENvdW50RHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0VGlja2V0Q291bnQoZXZlbnQ6IEV2ZW50LCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC50aWNrZXRDb3VudCcpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzVGlja2V0Q291bnREcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVN0b3JlRGF5c0Ryb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc1N0b3JlRGF5c0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmlzU3RvcmVEYXlzRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U3RvcmVEYXlzKGV2ZW50OiBFdmVudCwgb3B0aW9uOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYWNjdXJhY3lCcmVhY2guZGF5cycpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUob3B0aW9uLnZhbHVlKTtcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc1N0b3JlRGF5c0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkRGF5c0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC5kYXlzJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRheXNPcHRpb25zLmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PT0gY3VycmVudFZhbHVlKTtcclxuICAgIHJldHVybiBtYXRjaD8ubGFiZWwgfHwgJ01vbnRoJztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVN0b3JlQWNjdXJhY3lEcm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuID0gIXRoaXMuaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U3RvcmVBY2N1cmFjeShldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoLmFjY3VyYWN5Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShgJHt2YWx1ZX0lYCk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlbiA9ICF0aGlzLmlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHNlbGVjdEFsbG93VGlja2V0Q3JlYXRpb24oZXZlbnQ6IEV2ZW50LCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhbGxvd1RpY2tldENyZWF0aW9uJyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNDYXRlZ29yeUxpbWl0UmVhY2hlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRhZ0xpbWl0cy5sZW5ndGggPj0gdGhpcy5tYXhDYXRlZ29yeUNvdW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQXBwcm92ZXJEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJldmlzaW9ucyA9IHRoaXMucmV2aXNpb25BcnJheS5jb250cm9scztcclxuICAgIGNvbnN0IHJldmlld2VyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAncmV2aWV3ZXInKTtcclxuICAgIGNvbnN0IGFwcHJvdmVyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInKTtcclxuICAgIFxyXG4gICAgaWYgKHJldmlld2VyICYmIGFwcHJvdmVyKSB7XHJcbiAgICAgIGNvbnN0IHJldmlld2VyQ2hlY2tlZCA9IHJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlO1xyXG4gICAgICBjb25zdCBhcHByb3ZlckNvbnRyb2wgPSBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpO1xyXG4gICAgICAvLyBDaGVjayBpZiBhcHByb3ZlciBpcyBkaXNhYmxlZCBPUiByZXZpZXdlciBpcyBub3QgY2hlY2tlZFxyXG4gICAgICByZXR1cm4gYXBwcm92ZXJDb250cm9sPy5kaXNhYmxlZCB8fCAhcmV2aWV3ZXJDaGVja2VkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzVGFuZ29EaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIC8vIFRhbmdvIGFsd2F5cyBzaG93cyBkaXNhYmxlZCBkZXNpZ25cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q2F0ZWdvcnlGb3JtKCkge1xyXG4gICAgdGhpcy5jYXRlZ29yeUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgaWNvbk5hbWU6IFt0aGlzLmJhc2VDYXRlZ29yeUljb25zWzBdLnZhbHVlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgbmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzApXV0sXHJcbiAgICAgIGxpbWl0OiBbdGhpcy5wZXJjZW50YWdlTGlzdFswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxyXG4gIGNsb3NlTWVudXMoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1lbnVJbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPSBudWxsO1xyXG4gICAgdGhpcy5pc0NhdGVnb3J5TGltaXREcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N0b3JlRGF5c0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N0b3JlQWNjdXJhY3lEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDYXRlZ29yeUljb25Ecm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5pc0NhdGVnb3J5SWNvbkRyb3Bkb3duT3BlbiA9ICF0aGlzLmlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q2F0ZWdvcnlJY29uRnJvbURyb3Bkb3duKGV2ZW50OiBFdmVudCwgaWNvblZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zZWxlY3RDYXRlZ29yeUljb24oaWNvblZhbHVlKTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldENsaWVudE1hcHBlZFN0b3Jlc0RldGFpbHMoY2xpZW5JZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0b3JlTGlzdCA9IFtdO1xyXG4gICAgIHRoaXMuYXBpU2VydmljZS5nZXRGb290ZmFsbFN0b3JlUmFpc2VEZXRhaWxzKGNsaWVuSWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAvLyB0aGlzLmFwaVNlcnZpY2UuZ2V0Rm9vdGZhbGxEZXRhaWxzKGNsaWVuSWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6KHJlczogYW55KT0+e1xyXG4gICAgICAgIGlmKHJlcyAmJiByZXMuY29kZT09JzIwMCcpe1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSByZXM/LmRhdGE/LnJlc3VsdDtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgfSxcclxuICAgICAgICBlcnJvcjooZXJyKT0+e1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgc3RvcmUgbGlzdCcsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIC8vIGhlbHBlcnNcclxuICBnZXQgcmV2aXNpb25BcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3JldmlzaW9uJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRhZ0xpbWl0cygpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3RhZ2dpbmdMaW1pdGF0aW9uJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcblxyXG4gIGNyZWF0ZVJldmlzaW9uKGFjdGlvblR5cGU6IHN0cmluZywgaXNDaGVja2VkOiBib29sZWFuKTogRm9ybUdyb3VwIHtcclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYWN0aW9uVHlwZTogW2FjdGlvblR5cGVdLFxyXG4gICAgICBpc0NoZWNrZWQ6IFtpc0NoZWNrZWRdXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVRhZ0xpbWl0KHR5cGU6IHN0cmluZywgdmFsdWU6IG51bWJlciwgaWNvbk5hbWU6IHN0cmluZywgbmFtZT86IHN0cmluZywga2V5Pzogc3RyaW5nKTogRm9ybUdyb3VwIHtcclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdHlwZTogW3R5cGVdLFxyXG4gICAgICB2YWx1ZTogW3ZhbHVlXSxcclxuICAgICAgdW5pdDogWyclJ10sXHJcbiAgICAgIGljb25OYW1lOiBbaWNvbk5hbWVdLFxyXG4gICAgICBuYW1lOiBbbmFtZV0sXHJcbiAgICAgIGtleTogW2tleV1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU3RvcmVTZWxlY3Rpb24oc3RvcmU6IGFueSwgY2hlY2tlZDogYm9vbGVhbikge1xyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5yZXNldFJlcXVlc3QuY2xpZW50SWQgPSB0aGlzLmNsaWVuSWQ7XHJcbiAgICAgIHRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMucHVzaCh7IHN0b3JlSWQ6IHN0b3JlLnN0b3JlSWQsIGRhdGVTdHJpbmc6IHN0b3JlLmRhdGVTdHJpbmcgfSk7XHJcbiAgICB9IGVsc2UgaWYgKCFjaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3JlcyA9IHRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMuZmlsdGVyKFxyXG4gICAgICAgIChzKSA9PiBzLnN0b3JlSWQgIT09IHN0b3JlLnN0b3JlSWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzU3RvcmVTZWxlY3RlZChzdG9yZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5zb21lKHIgPT4gci5zdG9yZUlkID09PSBzdG9yZS5zdG9yZUlkKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVMaXN0Lmxlbmd0aCA+IDAgJiYgdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5sZW5ndGggPT09IHRoaXMuc3RvcmVMaXN0Lmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8vIHNlbGVjdCBhbGwgc3RvcmVzIHJlcXVlc3QgbGlzdCBoYW5kbGVyXHJcbiAgdG9nZ2xlU2VsZWN0QWxsKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjaGVja2VkID0gdGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZFN0b3JlcyA9IHRoaXMuc3RvcmVMaXN0Lm1hcCgoc3RvcmU6IGFueSkgPT4gKHtcclxuICAgICAgICBzdG9yZUlkOiBzdG9yZS5zdG9yZUlkLFxyXG4gICAgICAgIGRhdGVTdHJpbmc6IHN0b3JlLmRhdGVTdHJpbmdcclxuICAgICAgfSkpO1xyXG4gICAgICB0aGlzLnJlc2V0UmVxdWVzdCA9IHRoaXMuYnVpbGRSZXNldFBheWxvYWQoc2VsZWN0ZWRTdG9yZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXNldFJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVzZXRQYXlsb2FkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVSZXZpc2lvbkRlcGVuZGVuY2llcygpIHtcclxuICAgIGNvbnN0IHJldmlzaW9ucyA9IHRoaXMucmV2aXNpb25BcnJheS5jb250cm9scztcclxuICAgIGNvbnN0IHJldmlld2VyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAncmV2aWV3ZXInKTtcclxuICAgIGNvbnN0IGFwcHJvdmVyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInKTtcclxuICAgIGNvbnN0IHRhbmdvID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAndGFuZ28nKTtcclxuXHJcbiAgICBpZiAodGFuZ28pIHtcclxuICAgICAgdGFuZ28uZ2V0KCdpc0NoZWNrZWQnKT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJldmlld2VyICYmIGFwcHJvdmVyKSB7XHJcbiAgICAgIC8vIGRpc2FibGUgYXBwcm92ZXIgaW5pdGlhbGx5IGlmIHJldmlld2VyIHVuY2hlY2tlZFxyXG4gICAgICBpZiAoIXJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlKSB7XHJcbiAgICAgICAgYXBwcm92ZXIuZ2V0KCdpc0NoZWNrZWQnKT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgYXBwcm92ZXIucGF0Y2hWYWx1ZSh7IGlzQ2hlY2tlZDogZmFsc2UgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGVuYWJsZSBhcHByb3ZlciBpZiByZXZpZXdlciBpcyBjaGVja2VkXHJcbiAgICAgICAgYXBwcm92ZXIuZ2V0KCdpc0NoZWNrZWQnKT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gbGlzdGVuIHJldmlld2VyIGNoZWNrYm94IGNoYW5nZSAob25seSB3aXJlIG9uY2UpXHJcbiAgICAgIGlmICghdGhpcy5yZXZpc2lvbkRlcHNJbml0aWFsaXplZCkge1xyXG4gICAgICAgIHJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgICAgICBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXBwcm92ZXIuZ2V0KCdpc0NoZWNrZWQnKT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIGFwcHJvdmVyLnBhdGNoVmFsdWUoeyBpc0NoZWNrZWQ6IGZhbHNlIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJldmlzaW9uRGVwc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRm9ybSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNFZGl0ID0gIXRoaXMuaXNFZGl0O1xyXG4gICAgaWYgKCF0aGlzLmlzRWRpdCkge1xyXG4gICAgICAvLyBGaXJzdCwgZW5zdXJlIGFwcHJvdmVyIHN0YXRlIGlzIGNvcnJlY3QgYmVmb3JlIGVuYWJsaW5nIGZvcm1cclxuICAgICAgY29uc3QgcmV2aXNpb25zID0gdGhpcy5yZXZpc2lvbkFycmF5LmNvbnRyb2xzO1xyXG4gICAgICBjb25zdCByZXZpZXdlciA9IHJldmlzaW9ucy5maW5kKChyKSA9PiByLmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ3Jldmlld2VyJyk7XHJcbiAgICAgIGNvbnN0IGFwcHJvdmVyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInKTtcclxuICAgICAgXHJcbiAgICAgIC8vIElmIHJldmlld2VyIGlzIHVuY2hlY2tlZCwgZW5zdXJlIGFwcHJvdmVyIGlzIHVuY2hlY2tlZCBiZWZvcmUgZW5hYmxpbmdcclxuICAgICAgaWYgKHJldmlld2VyICYmIGFwcHJvdmVyICYmICFyZXZpZXdlci5nZXQoJ2lzQ2hlY2tlZCcpPy52YWx1ZSkge1xyXG4gICAgICAgIGFwcHJvdmVyLnBhdGNoVmFsdWUoeyBpc0NoZWNrZWQ6IGZhbHNlIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmVuYWJsZSgpO1xyXG4gICAgICAvLyBSZS1hcHBseSByZXZpc2lvbiBkZXBlbmRlbmNpZXMgYWZ0ZXIgZW5hYmxpbmcgdG8gZW5zdXJlIGFwcHJvdmVyIHN0YXRlIGlzIGNvcnJlY3RcclxuICAgICAgdGhpcy5oYW5kbGVSZXZpc2lvbkRlcGVuZGVuY2llcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmRpc2FibGUoKTtcclxuICAgICAgLy8gUmUtYXBwbHkgcmV2aXNpb24gZGVwZW5kZW5jaWVzIHNvIFRhbmdvIHJlbWFpbnMgZGlzYWJsZWRcclxuICAgICAgLy8gYW5kIEFwcHJvdmVyIGZvbGxvd3MgUmV2aWV3ZXIgaW4gYm90aCB2aWV3IGFuZCBlZGl0IG1vZGVzLlxyXG4gICAgICB0aGlzLmhhbmRsZVJldmlzaW9uRGVwZW5kZW5jaWVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vIE9wZW4gcmVzZXQgY29uZmlybWF0aW9uIG1vZGFsXHJcbiAgb3BlblJlc2V0Q29uZmlybWF0aW9uTW9kYWwoKSB7XHJcbiAgICBpZiAoIXRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMubGVuZ3RoIHx8IHRoaXMuaXNSZXNldHRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXNldE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLnJlc2V0Q29uZmlybWF0aW9uTW9kYWxUcGwsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIHNpemU6ICdzbScsXHJcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcclxuICAgICAga2V5Ym9hcmQ6IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIENsb3NlIHJlc2V0IGNvbmZpcm1hdGlvbiBtb2RhbFxyXG4gIGNsb3NlUmVzZXRNb2RhbCgpIHtcclxuICAgIGlmICh0aGlzLnJlc2V0TW9kYWxSZWYpIHtcclxuICAgICAgdGhpcy5yZXNldE1vZGFsUmVmLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMucmVzZXRNb2RhbFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBDb25maXJtIGFuZCBwcm9jZWVkIHdpdGggcmVzZXRcclxuICBjb25maXJtUmVzZXRTdG9yZVJlcXVlc3QoKSB7XHJcbiAgICBpZiAoIXRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMubGVuZ3RoIHx8IHRoaXMuaXNSZXNldHRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gQ2xvc2UgbW9kYWwgaW1tZWRpYXRlbHlcclxuICAgIHRoaXMuY2xvc2VSZXNldE1vZGFsKCk7XHJcbiAgICBcclxuICAgIC8vIFByb2NlZWQgd2l0aCByZXNldCBvcGVyYXRpb25cclxuICAgIHRoaXMuaXNSZXNldHRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLnJlc2V0U3RvcmVSZXF1ZXN0TGlzdCh0aGlzLnJlc2V0UmVxdWVzdClcclxuICAgIC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICB0aGlzLmlzUmVzZXR0aW5nID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDoocmVzOiBhbnkpPT57XHJcbiAgICAgIGlmKHJlcyAmJiByZXMuY29kZT09JzIwMCcpe1xyXG4gICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gcmVzPy5kYXRhPy5yZXN1bHQ7XHJcbiAgICAgICAgdGhpcy5nZXRDbGllbnRNYXBwZWRTdG9yZXNEZXRhaWxzKHRoaXMuY2xpZW5JZCk7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ1N0b3JlIHJlcXVlc3RzIHJlc2V0IHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byByZXNldCBzdG9yZSByZXF1ZXN0cy4nKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlc2V0UmVxdWVzdCA9IHRoaXMuYnVpbGRSZXNldFBheWxvYWQoKTtcclxuICAgICB9LFxyXG4gICAgICBlcnJvcjooZXJyKT0+e1xyXG4gICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdFcnJvciByZXNldHRpbmcgc3RvcmUgcmVxdWVzdHMuJyk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgc3RvcmUgbGlzdCcsIGVycik7XHJcbiAgICAgIH0sXHJcbiAgIH0pXHJcbiAgfVxyXG5cclxuICAvLyB0byByZXNldCBzdG9yZSBsaXN0IChrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlmIG5lZWRlZClcclxuICByZXNldFN0b3JlUmVxdWVzdCgpIHtcclxuICAgIHRoaXMub3BlblJlc2V0Q29uZmlybWF0aW9uTW9kYWwoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1Jlc2V0RGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMubGVuZ3RoIHx8IHRoaXMuaXNSZXNldHRpbmcgfHwgdGhpcy5pc0VkaXQ7XHJcbiAgfVxyXG5cclxuICBvblN1Ym1pdCgpIHtcclxuICAgIC8vIEVuc3VyZSBUYW5nbyBjaGVja2JveCBpcyBhbHdheXMgdHJ1ZSB3aGVuIHNhdmluZ1xyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldFJhd1ZhbHVlKCk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JtVmFsdWUucmV2aXNpb24pKSB7XHJcbiAgICAgIGNvbnN0IHRhbmdvSW5kZXggPSBmb3JtVmFsdWUucmV2aXNpb24uZmluZEluZGV4KChyOiBhbnkpID0+IHI/LmFjdGlvblR5cGUgPT09ICd0YW5nbycpO1xyXG4gICAgICBpZiAodGFuZ29JbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBmb3JtVmFsdWUucmV2aXNpb25bdGFuZ29JbmRleF0uaXNDaGVja2VkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coJ3VwZGF0ZSBmb3JtIGNvbmZpZyA+PicsIGZvcm1WYWx1ZSk7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50Rm9ybURhdGEubmV4dCh7IHZhbHVlOiBmb3JtVmFsdWUsIHR5cGU6ICdzdWJtaXQnLCBmb3JtOiAnZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzJyB9KVxyXG4gICAgLy8gY29uc3QgZm9ybVZhbHVlID0geyAuLi50aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0udmFsdWUgfTtcclxuICAgIC8vIGlmIChBcnJheS5pc0FycmF5KGZvcm1WYWx1ZS50YWdnaW5nTGltaXRhdGlvbikpIHtcclxuICAgIC8vICAgZm9ybVZhbHVlLnRhZ2dpbmdMaW1pdGF0aW9uID0gZm9ybVZhbHVlLnRhZ2dpbmdMaW1pdGF0aW9uLm1hcCgodGFnOiBhbnkpID0+ICh7XHJcbiAgICAvLyAgICAgdHlwZTogdGFnLnR5cGUsXHJcbiAgICAvLyAgICAgdmFsdWU6IHRhZy52YWx1ZSxcclxuICAgIC8vICAgICB1bml0OiB0YWcudW5pdCB8fCAnJSdcclxuICAgIC8vICAgICAvLyBpY29uTmFtZTogdGFnLmljb25OYW1lLFxyXG4gICAgLy8gICAgIC8vIG5hbWU6IHRhZy5uYW1lIHx8IHRhZy50eXBlXHJcbiAgICAvLyAgIH0pKTtcclxuICAgIC8vIH1cclxuICAgIC8vIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAvLyAgIGZvb3RmYWxsRGlyZWN0b3J5Q29uZmlnczogZm9ybVZhbHVlLFxyXG4gICAgLy8gICByZXF1ZXN0OiB0aGlzLnJlc2V0UmVxdWVzdFxyXG4gICAgLy8gfTtcclxuICAgICAgLy8gY29uc3Qgb2JqID0ge1xyXG4gICAgICAvLyAgIHRhbmdvUmV2aWV3OiBmb3JtVmFsdWUudGFuZ29SZXZpZXcsXHJcbiAgICAgIC8vICAgYWNjdXJhY3lCcmVhY2g6IGZvcm1WYWx1ZS5hY2N1cmFjeUJyZWFjaCxcclxuICAgICAgLy8gICB0YWdnaW5nTGltaXRhdGlvbjogZm9ybVZhbHVlLnRhZ2dpbmdMaW1pdGF0aW9uXHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gY29uc29sZS5sb2coJ0ZpbmFsIFBheWxvYWQ6Jywgb2JqKTtcclxuICAgICAgLy8gdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZUZvb3RmYWxsRGlyZWN0b3J5Q29uZmlnKG9iaiwgdGhpcy5jbGllbklkKVxyXG4gICAgICAvLyAgIC5waXBlKFxyXG4gICAgICAvLyAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgIC8vICAgKVxyXG4gICAgICAvLyAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAvLyAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgIC8vICAgICAgIGNvbnNvbGUubG9nKCdzYXZlIGZvb3RmYWxsIGNvbmZpZyBkZXRhaWxzID4+JywgcmVzKTtcclxuICAgICAgLy8gICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAnMjAwJyAmJiByZXMuc3RhdHVzID09ICdzdWNjZXNzJykge1xyXG4gICAgICAvLyAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdmb290ZmFsbCBjb25maWcgZGV0YWlscyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgICAgLy8gICAgICAgfSBlbHNlIHtcclxuICAgICAgLy8gICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byB1cGRhdGUgZm9vdGZhbGwgY29uZmlnIGRldGFpbHMuJyk7XHJcbiAgICAgIC8vICAgICAgIH1cclxuICAgICAgLy8gICAgIH0sXHJcbiAgICAgIC8vICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAvLyAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0Vycm9yIGluIHVwZGF0aW5nIGZvb3RmYWxsIGNvbmZpZyBkZXRhaWxzLicpO1xyXG4gICAgICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiB1cGRhdGVGb290ZmFsbERpcmVjdG9yeUNvbmZpZyA6JywgZXJyKTtcclxuICAgICAgLy8gICAgIH0sXHJcbiAgICAgIC8vICAgfSlcclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmNsaWVudEZvcm1EYXRhLm5leHQoeyB2YWx1ZTogbnVsbCwgdHlwZTogJ2NhbmNlbCcsIGZvcm06ICdmb290ZmFsbERpcmVjdG9yeUNvbmZpZ3MnIH0pXHJcbiAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZGlzYWJsZSgpO1xyXG4gICAgdGhpcy50b2dnbGVGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRSZXNldFBheWxvYWQoc3RvcmVzOiB7IHN0b3JlSWQ6IHN0cmluZzsgZGF0ZVN0cmluZzogc3RyaW5nIH1bXSA9IFtdKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbklkID8/ICcnLFxyXG4gICAgICBhcnJheU9mU3RvcmVzOiBzdG9yZXNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXQgY2F0ZWdvcnlJY29ucygpOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4ge1xyXG4gICAgY29uc3QgYXZhaWxhYmxlSWNvbnMgPSBbLi4udGhpcy5iYXNlQ2F0ZWdvcnlJY29uc107XHJcbiAgICBcclxuICAgIC8vIENoZWNrIHdoaWNoIGFkZGl0aW9uYWwgaWNvbnMgYXJlIGN1cnJlbnRseSBpbiB1c2VcclxuICAgIGNvbnN0IHVzZWRJY29ucyA9IHRoaXMudGFnTGltaXRzLmNvbnRyb2xzLm1hcChjdHJsID0+IGN0cmwuZ2V0KCdpY29uTmFtZScpPy52YWx1ZSkuZmlsdGVyKEJvb2xlYW4pO1xyXG4gICAgXHJcbiAgICAvLyBJZiBlZGl0aW5nLCBleGNsdWRlIHRoZSBjdXJyZW50IGljb24gYmVpbmcgZWRpdGVkIGZyb20gdGhlIHVzZWQgbGlzdFxyXG4gICAgbGV0IHVzZWRJY29uc0ZvckNoZWNrID0gWy4uLnVzZWRJY29uc107XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2VkaXQnICYmIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgZWRpdGluZ0ljb24gPSB0aGlzLnRhZ0xpbWl0cy5hdCh0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4KT8uZ2V0KCdpY29uTmFtZScpPy52YWx1ZTtcclxuICAgICAgdXNlZEljb25zRm9yQ2hlY2sgPSB1c2VkSWNvbnNGb3JDaGVjay5maWx0ZXIoaWNvbiA9PiBpY29uICE9PSBlZGl0aW5nSWNvbik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEFkZCBob3VzZUtlZXBpbmdUYWcgYW5kIGp1bmtUYWcgaWYgdGhleSdyZSBub3QgaW4gdXNlXHJcbiAgICB0aGlzLmFkZGl0aW9uYWxDYXRlZ29yeUljb25zLmZvckVhY2goaWNvbiA9PiB7XHJcbiAgICAgIGlmICghdXNlZEljb25zRm9yQ2hlY2suaW5jbHVkZXMoaWNvbi52YWx1ZSkpIHtcclxuICAgICAgICBhdmFpbGFibGVJY29ucy5wdXNoKGljb24pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGF2YWlsYWJsZUljb25zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkQ2F0ZWdvcnlJY29uTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNhdGVnb3J5Rm9ybT8uZ2V0KCdpY29uTmFtZScpPy52YWx1ZSB8fCB0aGlzLmJhc2VDYXRlZ29yeUljb25zWzBdPy52YWx1ZTtcclxuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5jYXRlZ29yeUljb25zLmZpbmQoaWNvbiA9PiBpY29uLnZhbHVlID09PSBjdXJyZW50KTtcclxuICAgIHJldHVybiBtYXRjaD8ubGFiZWwgfHwgJyc7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtXCIgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uR2xvYmFsX0NvbmZpZ3VyYXRpb25faXNFZGl0XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImlzRWRpdFwiIGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJyB8fCBmb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzJyk/LnZhbHVlID09PSB0cnVlXCI+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVGb3JtKCk7XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGFsaWduLWl0ZW1zLWVuZFwiPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMlwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMjU3OV8yNTEyNSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0LjE2NyAyLjQ5OTkzQzE0LjM4NTkgMi4yODEwNiAxNC42NDU3IDIuMTA3NDQgMTQuOTMxNyAxLjk4ODk5QzE1LjIxNzYgMS44NzA1NCAxNS41MjQxIDEuODA5NTcgMTUuODMzNyAxLjgwOTU3QzE2LjE0MzIgMS44MDk1NyAxNi40NDk3IDEuODcwNTQgMTYuNzM1NyAxLjk4ODk5QzE3LjAyMTYgMi4xMDc0NCAxNy4yODE1IDIuMjgxMDYgMTcuNTAwMyAyLjQ5OTkzQzE3LjcxOTIgMi43MTg4IDE3Ljg5MjggMi45Nzg2MyAxOC4wMTEzIDMuMjY0NkMxOC4xMjk3IDMuNTUwNTcgMTguMTkwNyAzLjg1NzA2IDE4LjE5MDcgNC4xNjY1OUMxOC4xOTA3IDQuNDc2MTIgMTguMTI5NyA0Ljc4MjYyIDE4LjAxMTMgNS4wNjg1OUMxNy44OTI4IDUuMzU0NTUgMTcuNzE5MiA1LjYxNDM5IDE3LjUwMDMgNS44MzMyNkw2LjI1MDMzIDE3LjA4MzNMMS42NjY5OSAxOC4zMzMzTDIuOTE2OTkgMTMuNzQ5OUwxNC4xNjcgMi40OTk5M1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8yNTc5XzI1MTI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPkVkaXQgRGV0YWlsczwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0gQXBwcm92ZXIgQ29uZmlndXJhdGlvbiAtLT5cclxuICAgIDwhLS0gPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtMyBtYi0zXCI+XHJcbiAgICAgICAgICAgIDxoNT5BcHByb3ZlciBDb25maWd1cmF0aW9uPC9oNT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dFwiPlNldCBsZXZlbCBvZiByZXZpc2lvbiByZXF1aXJlZCBmb3IgYSBzdG9yZSByYWlzZWQgdGlja2V0czwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwicmV2aXNpb25cIiBjbGFzcz1cImQtZmxleCBnYXAtNFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcmV2IG9mIHJldmlzaW9uQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cImlzQ2hlY2tlZFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIFtpZF09XCInYWN0aW9uLScgKyBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIFtmb3JdPVwiJ2FjdGlvbi0nICsgaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByZXYuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlIHwgdGl0bGVjYXNlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PSAncmV2aWV3ZXInXCIgY2xhc3M9XCJzdWItdGV4dFwiPlRoZSBUaWNrZXQgdW5kZXJnb2VzIGEgc2luZ2xlIHJldmlldyB0byB2ZXJpZnkgZm9vdGZhbGw8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT0gJ2FwcHJvdmVyJ1wiIGNsYXNzPVwic3ViLXRleHRcIj5UaGUgVGlja2V0IHVuZGVyZ29lcyBhIGZpbmFsIHJldmlldyBhZnRlciB0aGUgaW5pdGlhbCBjaGVjazwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PSAndGFuZ28nXCIgY2xhc3M9XCJzdWItdGV4dFwiPkZpbmFsaXplIHRpY2tldCBhbmQgdXBkYXRlIGZvb3RmYWxsIGNvdW50PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+IC0tPlxyXG5cclxuICAgIDwhLS0gQXBwcm92ZXIgQ29uZmlndXJhdGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtNCBtYi00IGFwcHJvdmVyLXNlY3Rpb25cIj5cclxuICAgICAgICA8aDUgY2xhc3M9XCJtYi0xIGZ3LXNlbWlib2xkXCI+QXBwcm92ZXIgY29uZmlndXJhdGlvbjwvaDU+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJtYi00IHNtYWxsXCI+XHJcbiAgICAgICAgICAgIFNldCBsZXZlbCBvZiByZXZpc2lvbnMgcmVxdWlyZWQgZm9yIGEgc3RvcmUgcmFpc2VkIHRpY2tldHNcclxuICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInJldmlzaW9uXCIgY2xhc3M9XCJkLWZsZXggZmxleC13cmFwIGdhcC01XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJldiBvZiByZXZpc2lvbkFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFwcHJvdmVyLW9wdGlvbiBkLWZsZXggZmxleC1jb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLW9wdGlvbl09XCIocmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ2FwcHJvdmVyJyAmJiBpc0FwcHJvdmVyRGlzYWJsZWQpIHx8IChyZXYuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAndGFuZ28nICYmIGlzVGFuZ29EaXNhYmxlZClcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY2hlY2tib3ggYWxpZ24taXRlbXMtc3RhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jaGVja2JveF09XCIocmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ2FwcHJvdmVyJyAmJiBpc0FwcHJvdmVyRGlzYWJsZWQpIHx8IChyZXYuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAndGFuZ28nICYmIGlzVGFuZ29EaXNhYmxlZClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNDaGVja2VkXCIgW2lkXT1cIidhY3Rpb24tJyArIGlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hlY2ttYXJrXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSB8IHRpdGxlY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCIncmV2aWV3ZXInXCI+VGhlIHRpY2tldCB1bmRlcmdvZXMgYSBzaW5nbGUgcmV2aWV3IHRvIHZlcmlmeVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb290ZmFsbC48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidhcHByb3ZlcidcIj5UaGUgdGlja2V0IHVuZGVyZ29lcyBhIGZpbmFsIHJldmlldyBhZnRlciB0aGUgaW5pdGlhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjay48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid0YW5nbydcIj5GaW5hbGl6ZSB0aWNrZXRzIGFuZCB1cGRhdGUgZm9vdGZhbGwgY291bnQuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG5cclxuICAgIDxociBjbGFzcz1cIm1zLTQgbWUtNFwiPlxyXG5cclxuICAgIDwhLS0gU3RvcmUgU1BPQyBUaWNrZXQgQ3JlYXRpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY2FyZCBwLTMgbWItM1wiPlxyXG4gICAgICAgICAgICA8aDU+U3RvcmUgU1BPQyBUaWNrZXQgQ3JlYXRpb248L2g1PlxyXG4gICAgICAgICAgICA8bGFiZWw+QWxsb3cgU3RvcmUgU1BPQyB0byBjcmVhdGUgdGlja2V0cyBvbmx5IGZvciBsYXN0PC9sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIxXCIgbWF4PVwiM1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIHctMjUgZC1pbmxpbmUgbXgtMlwiIGZvcm1Db250cm9sTmFtZT1cImFsbG93VGlja2V0Q3JlYXRpb25cIj4gRGF5c1xyXG4gICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTMgbWItM1wiPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJmdy1ib2xkIG1iLTNcIj5TdG9yZSBTUE9DIFRpY2tldCBDcmVhdGlvbjwvaDU+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgZ2FwLTJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQWxsb3cgc3RvcmUgU1BPQyB0byBjcmVhdGUgdGlja2V0cyBvbmx5IGZvciB0aGUgbGFzdFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIE51bWJlciBkcm9wZG93biAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmZi1zZWxlY3Qtd3JhcHBlciBjb21wYWN0IG1zLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cImlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlblwiIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FsbG93VGlja2V0Q3JlYXRpb24nKT8udmFsdWUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwb2NUaWNrZXRDcmVhdGlvbmRheXNbMF0gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgZGF5IG9mIHNwb2NUaWNrZXRDcmVhdGlvbmRheXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEFsbG93VGlja2V0Q3JlYXRpb24oJGV2ZW50LCBkYXkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLTBcIj5EYXlzPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGhyIGNsYXNzPVwibXMtNCBtZS00XCI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDwhLS0gVGlja2V0IEF1dG8tY2xvc2UgLS0+XHJcbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY2FyZCBwLTMgbWItM1wiPlxyXG4gICAgICAgICAgICA8aDU+VGlja2V0IEF1dG8tY2xvc2U8L2g1PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJhdXRvQ2xvc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0F1dG9DbG9zZUVuYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImF1dG9DbG9zZVwiPkVuYWJsZSBBdXRvLWNsb3NlPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+QXV0by1jbG9zZSBBY2N1cmFjeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImF1dG9DbG9zZUFjY3VyYWN5XCIgY2xhc3M9XCJmb3JtLXNlbGVjdCB3LTI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsIG9mIFsnODUlJywgJzkwJScsICc5NSUnLCAnMTAwJSddXCIgW3ZhbHVlXT1cInZhbFwiPnt7IHZhbCB9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC0zIG1iLTNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiZnctYm9sZCBtLTBcIj5UaWNrZXQgQXV0by1jbG9zZTwvaDU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUb2dnbGUgU3dpdGNoIC0tPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3dpdGNoIG0tMCBtcy0zXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0F1dG9DbG9zZUVuYWJsZVwiIFtkaXNhYmxlZF09XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNsaWRlciByb3VuZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgVGlja2V0IHNob3VsZCBiZSBhdXRvLWNsb3NlZCwgaWYgdGhlIGNyZWF0ZWQgdGlja2V0IGFjY3VyYWN5IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gQWNjdXJhY3kgZHJvcGRvd24gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdCBtcy0yXCIgW2NsYXNzLm9wZW5dPVwiaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXQgfHwgIWZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdpc0F1dG9DbG9zZUVuYWJsZScpPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZSBzbWFsbFwiIChjbGljayk9XCJ0b2dnbGVBdXRvQ2xvc2VEcm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhdXRvQ2xvc2VBY2N1cmFjeScpPy52YWx1ZSB8fCAnMSUnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc0F1dG9DbG9zZURyb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgcCBvZiBhY2N1cmFjeVBlcmNlbnRhZ2VMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBdXRvQ2xvc2VBY2N1cmFjeSgkZXZlbnQsIHApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwIH19JVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGhyIGNsYXNzPVwibXMtNCBtZS00XCI+XHJcblxyXG4gICAgPCEtLSBUYWdnaW5nIExpbWl0YXRpb25zIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LnVzZXJUeXBlID09PSAndGFuZ28nXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC00IG1iLTRcIj5cclxuICAgICAgICAgICAgPCEtLSBGb290ZmFsbCBkaXJlY3RvcnkgbGltaXRhdGlvbnMgc3RhcnQgIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImZ3LXNlbWlib2xkIG0tMFwiPkZvb3RmYWxsIGRpcmVjdG9yeSBsaW1pdGF0aW9uczwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzbWFsbCBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNldCBtYXhpbXVtIGxpbWl0YXRpb24gZm9yIHN0b3JlcyB0byB0YWcgbm9uLVB1cmNoYXNlcnMgZnJvbSBUb3RhbCBGb290ZmFsbFxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpc0VkaXRcIiBjbGFzcz1cImFkZC1uZXctYnRuIGQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNhdGVnb3J5TW9kYWwoJ2FkZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCAzLjMzMzM0VjEyLjY2NjdNMy4zMzMzNCA4SDEyLjY2NjdcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BZGQgTmV3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBGb290ZmFsbCBkaXJlY3RvcnkgbGltaXRhdGlvbnMgY2F0ZWdvcnkgcGFydCAtLT5cclxuICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwidGFnZ2luZ0xpbWl0YXRpb25cIiBjbGFzcz1cImNhdGVnb3J5LWdyaWQgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdGFnIG9mIHRhZ0xpbWl0cy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjbGFzcz1cImNhdGVnb3J5LWNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFRvcCBTZWN0aW9uOiBJY29uIGFuZCBOYW1lIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1jYXJkLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1pY29uXCIgW25nQ2xhc3NdPVwidGFnLmdldCgnaWNvbk5hbWUnKT8udmFsdWVcIj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaWNvblwiIFtuZ0NsYXNzXT1cInRhZy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJ0YWcuZ2V0KCdpY29uTmFtZScpPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHVwbGljYXRlIFRhZyBTVkcgLSBUd28gb3ZlcmxhcHBpbmcgc3F1YXJlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICAqbmdTd2l0Y2hDYXNlPVwiJ2R1cGxpY2F0ZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTE2Ml8yNDYyMSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yLjUgNy41SDJDMS43MzQ3OCA3LjUgMS40ODA0MyA3LjM5NDY0IDEuMjkyODkgNy4yMDcxMUMxLjEwNTM2IDcuMDE5NTcgMSA2Ljc2NTIyIDEgNi41VjJDMSAxLjczNDc4IDEuMTA1MzYgMS40ODA0MyAxLjI5Mjg5IDEuMjkyODlDMS40ODA0MyAxLjEwNTM2IDEuNzM0NzggMSAyIDFINi41QzYuNzY1MjIgMSA3LjAxOTU3IDEuMTA1MzYgNy4yMDcxMSAxLjI5Mjg5QzcuMzk0NjQgMS40ODA0MyA3LjUgMS43MzQ3OCA3LjUgMlYyLjVNNS41IDQuNUgxMEMxMC41NTIzIDQuNSAxMSA0Ljk0NzcyIDExIDUuNVYxMEMxMSAxMC41NTIzIDEwLjU1MjMgMTEgMTAgMTFINS41QzQuOTQ3NzIgMTEgNC41IDEwLjU1MjMgNC41IDEwVjUuNUM0LjUgNC45NDc3MiA0Ljk0NzcyIDQuNSA1LjUgNC41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xMTYyXzI0NjIxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbXBsb3llZSBUYWcgU1ZHIC0gVHdvIHBlb3BsZSwgb25lIGluIGZyb250IG9mIHRoZSBvdGhlciAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInZW1wbG95ZWVUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTYgMTNcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS4xNjY3IDEyLjVWMTEuMTY2N0MxMS4xNjY3IDEwLjQ1OTQgMTAuODg1NyA5Ljc4MTE1IDEwLjM4NTYgOS4yODEwNUM5Ljg4NTUyIDguNzgwOTUgOS4yMDcyNCA4LjUgOC41IDguNUgzLjE2NjY3QzIuNDU5NDIgOC41IDEuNzgxMTUgOC43ODA5NSAxLjI4MTA1IDkuMjgxMDVDMC43ODA5NTIgOS43ODExNSAwLjUgMTAuNDU5NCAwLjUgMTEuMTY2N1YxMi41TTE1LjE2NjcgMTIuNVYxMS4xNjY3QzE1LjE2NjIgMTAuNTc1OCAxNC45Njk2IDEwLjAwMTggMTQuNjA3NiA5LjUzNDg4QzE0LjI0NTYgOS4wNjc5MSAxMy43Mzg4IDguNzM0MzggMTMuMTY2NyA4LjU4NjY3TTEwLjUgMC41ODY2NjdDMTEuMDczNiAwLjczMzUzNCAxMS41ODIgMS4wNjcxMyAxMS45NDUxIDEuNTM0ODdDMTIuMzA4MiAyLjAwMjYxIDEyLjUwNTIgMi41Nzc4OSAxMi41MDUyIDMuMTdDMTIuNTA1MiAzLjc2MjExIDEyLjMwODIgNC4zMzczOSAxMS45NDUxIDQuODA1MTNDMTEuNTgyIDUuMjcyODcgMTEuMDczNiA1LjYwNjQ3IDEwLjUgNS43NTMzM004LjUgMy4xNjY2N0M4LjUgNC42Mzk0MyA3LjMwNjA5IDUuODMzMzMgNS44MzMzMyA1LjgzMzMzQzQuMzYwNTcgNS44MzMzMyAzLjE2NjY3IDQuNjM5NDMgMy4xNjY2NyAzLjE2NjY3QzMuMTY2NjcgMS42OTM5MSA0LjM2MDU3IDAuNSA1LjgzMzMzIDAuNUM3LjMwNjA5IDAuNSA4LjUgMS42OTM5MSA4LjUgMy4xNjY2N1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSG91c2UgS2VlcGluZyBUYWcgU1ZHIC0gSG91c2Ugd2l0aCBicm9vbSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2hvdXNlS2VlcGluZ1RhZydcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xMTYyXzI0NjUwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjA0OTgzIDAuNTQ0OTQ3QzcuNzQ3MzggLTAuMTgxNjQ5IDguODc4MjkgLTAuMTgxNjQ5IDkuNTc1ODQgMC41NDQ5NDdMMTUuNDY5NyA2LjY4NDRDMTYuMTY3MiA3LjQxMTAxIDE2LjE2NzIgOC41ODkwNCAxNS40Njk3IDkuMzE1NjVMOS41NzU4NCAxNS40NTUxQzguODc4MjkgMTYuMTgxNiA3Ljc0NzM4IDE2LjE4MTYgNy4wNDk4MyAxNS40NTUxTDUuMzY1NjIgMTMuNzAwN0wzLjgyMTc5IDE1LjMwODhDMy4xMjQyNiAxNi4wMzU0IDEuOTkzMzQgMTYuMDM1NCAxLjI5NTggMTUuMzA4OEMwLjU5ODI3MiAxNC41ODIzIDAuNTk4MjcyIDEzLjQwNDIgMS4yOTU4IDEyLjY3NzdMMi44Mzk2NCAxMS4wNjk1TDEuMTU1OTYgOS4zMTU2NUMwLjQ1ODQyOSA4LjU4OTA0IDAuNDU4NDI5IDcuNDExMDEgMS4xNTU5NiA2LjY4NDRMNy4wNDk4MyAwLjU0NDk0N1pNOC43MzM4MSAxLjQyMjAzQzguNTAxMjkgMS4xNzk4MyA4LjEyNDMgMS4xNzk4MyA3Ljg5MTc4IDEuNDIyMDNMMy42ODE2NSA1LjgwNzYyTDEwLjQxNzUgMTIuODI0MkwxNC42Mjc3IDguNDM4NTRDMTQuODYwMiA4LjE5NjM0IDE0Ljg2MDIgNy44MDM2MyAxNC42Mjc3IDcuNTYxNTFMMTEuNjgwNSA0LjQ5MTQzTDEwLjY5ODEgNS41MTQ2OUMxMC40NjU2IDUuNzU2ODkgMTAuMDg4NyA1Ljc1Njg5IDkuODU2MTQgNS41MTQ2OUM5LjYyMzYzIDUuMjcyNDkgOS42MjM2MyA0Ljg3OTgxIDkuODU2MTQgNC42Mzc2MUwxMC44Mzg0IDMuNjE0MzVMOS45OTY2NSAyLjczNzQ2TDcuNjExIDUuMjIyNTJDNy4zNzg0OSA1LjQ2NDcxIDcuMDAxNDkgNS40NjQ3MSA2Ljc2ODk3IDUuMjIyNTJDNi41MzY0NiA0Ljk4MDMyIDYuNTM2NDYgNC41ODc2MyA2Ljc2ODk3IDQuMzQ1NDRMOS4xNTQ2MiAxLjg2MDM4TDguNzMzODEgMS40MjIwM1pNOS41NzU1MiAxMy43MDEyTDIuODM5NjYgNi42ODQ3TDEuOTk3OTYgNy41NjE1MUMxLjc2NTQ0IDcuODAzNjMgMS43NjU0NCA4LjE5NjM0IDEuOTk3OTYgOC40Mzg1NEw3Ljg5MTc4IDE0LjU3OEM4LjEyNDMgMTQuODIwMiA4LjUwMTI5IDE0LjgyMDIgOC43MzM4MSAxNC41NzhMOS41NzU1MiAxMy43MDEyWk0zLjY4MTU2IDExLjk0NjZMMi4xMzc4IDEzLjU1NDdDMS45MDUyOSAxMy43OTY5IDEuOTA1MjkgMTQuMTg5NiAyLjEzNzggMTQuNDMxOEMyLjM3MDMxIDE0LjY3NCAyLjc0NzI5IDE0LjY3NCAyLjk3OTggMTQuNDMxOEw0LjUyMzU1IDEyLjgyMzdMMy42ODE1NiAxMS45NDY2WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMzQ0MDU0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzExNjJfMjQ2NTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBKdW5rIFRhZyBTVkcgLSBUcmFzaCBjYW4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidqdW5rVGFnJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuPHBhdGggZD1cIk0yIDQuMDAwMDRIMy4zMzMzM00zLjMzMzMzIDQuMDAwMDRIMTRNMy4zMzMzMyA0LjAwMDA0VjEzLjMzMzRDMy4zMzMzMyAxMy42ODcgMy40NzM4MSAxNC4wMjYxIDMuNzIzODYgMTQuMjc2MkMzLjk3MzkxIDE0LjUyNjIgNC4zMTMwNCAxNC42NjY3IDQuNjY2NjcgMTQuNjY2N0gxMS4zMzMzQzExLjY4NyAxNC42NjY3IDEyLjAyNjEgMTQuNTI2MiAxMi4yNzYxIDE0LjI3NjJDMTIuNTI2MiAxNC4wMjYxIDEyLjY2NjcgMTMuNjg3IDEyLjY2NjcgMTMuMzMzNFY0LjAwMDA0SDMuMzMzMzNaTTUuMzMzMzMgNC4wMDAwNFYyLjY2NjcxQzUuMzMzMzMgMi4zMTMwOSA1LjQ3MzgxIDEuOTczOTUgNS43MjM4NiAxLjcyMzlDNS45NzM5MSAxLjQ3Mzg1IDYuMzEzMDQgMS4zMzMzNyA2LjY2NjY3IDEuMzMzMzdIOS4zMzMzM0M5LjY4Njk2IDEuMzMzMzcgMTAuMDI2MSAxLjQ3Mzg1IDEwLjI3NjEgMS43MjM5QzEwLjUyNjIgMS45NzM5NSAxMC42NjY3IDIuMzEzMDkgMTAuNjY2NyAyLjY2NjcxVjQuMDAwMDRNNi42NjY2NyA3LjMzMzM3VjExLjMzMzRNOS4zMzMzMyA3LjMzMzM3VjExLjMzMzRcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUHVycGxlIFRhZyBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ3B1cnBsZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjIwXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjcwNzEgMTMuMjkyOUwxMS40MTQyIDRINFYxMS40MTQyTDEzLjI5MjkgMjAuNzA3MUMxMy42ODM0IDIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDE0LjcwNzEgMjAuNzA3MUwyMC43MDcxIDE0LjcwNzFDMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTMuNjgzNCAyMC43MDcxIDEzLjI5MjlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgN0g3LjAxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3JhbmdlIFRhZyBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ29yYW5nZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjIwXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjcwNzEgMTMuMjkyOUwxMS40MTQyIDRINFYxMS40MTQyTDEzLjI5MjkgMjAuNzA3MUMxMy42ODM0IDIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDE0LjcwNzEgMjAuNzA3MUwyMC43MDcxIDE0LjcwNzFDMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTMuNjgzNCAyMC43MDcxIDEzLjI5MjlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgN0g3LjAxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQmx1ZSBUYWcgU1ZHIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2JsdWVUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZWZhdWx0IFRhZyBTVkcgKGZhbGxiYWNrKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzdmcgKm5nU3dpdGNoRGVmYXVsdCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjcwNzEgMTMuMjkyOUwxMS40MTQyIDRINFYxMS40MTQyTDEzLjI5MjkgMjAuNzA3MUMxMy42ODM0IDIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDE0LjcwNzEgMjAuNzA3MUwyMC43MDcxIDE0LjcwNzFDMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTMuNjgzNCAyMC43MDcxIDEzLjI5MjlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgN0g3LjAxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdGFnLmdldCgnbmFtZScpPy52YWx1ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNZW51IEJ1dHRvbiAob25seSBmb3IgaG91c2VLZWVwaW5nVGFnIGFuZCBqdW5rVGFnKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIodGFnLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgIT09ICdkdXBsaWNhdGVUYWcnICYmIHRhZy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlICE9PSAnZW1wbG95ZWVUYWcnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjYXRlZ29yeS1tZW51LWJ0blwiIChjbGljayk9XCJ0b2dnbGVDYXRlZ29yeU1lbnUoJGV2ZW50LCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgNUMxMi41NTIzIDUgMTMgNC41NTIyOCAxMyA0QzEzIDMuNDQ3NzIgMTIuNTUyMyAzIDEyIDNDMTEuNDQ3NyAzIDExIDMuNDQ3NzIgMTEgNEMxMSA0LjU1MjI4IDExLjQ0NzcgNSAxMiA1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyIDEzQzEyLjU1MjMgMTMgMTMgMTIuNTUyMyAxMyAxMkMxMyAxMS40NDc3IDEyLjU1MjMgMTEgMTIgMTFDMTEuNDQ3NyAxMSAxMSAxMS40NDc3IDExIDEyQzExIDEyLjU1MjMgMTEuNDQ3NyAxMyAxMiAxM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMiAyMUMxMi41NTIzIDIxIDEzIDIwLjU1MjMgMTMgMjBDMTMgMTkuNDQ3NyAxMi41NTIzIDE5IDEyIDE5QzExLjQ0NzcgMTkgMTEgMTkuNDQ3NyAxMSAyMEMxMSAyMC41NTIzIDExLjQ0NzcgMjEgMTIgMjFaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktbWVudVwiICpuZ0lmPVwiYWN0aXZlTWVudUluZGV4ID09PSBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYXRlZ29yeU1lbnVBY3Rpb24oJGV2ZW50LCAnZWRpdCcsIGkpXCI+RWRpdCBOYW1lPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYXRlZ29yeU1lbnVBY3Rpb24oJGV2ZW50LCAnZGVsZXRlJywgaSlcIj5EZWxldGU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQm90dG9tIFNlY3Rpb246IFBlcmNlbnRhZ2UgRHJvcGRvd24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LXBlcmNlbnRhZ2Utc2VjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub3Blbl09XCJvcGVuTGltaXREcm9wZG93bkluZGV4ID09PSBpXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTGltaXREcm9wZG93bigkZXZlbnQsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdGFnLmdldCgndmFsdWUnKT8udmFsdWUgfHwgMCB9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cIm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPT09IGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgcCBvZiBwZXJjZW50YWdlTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMaW1pdFZhbHVlKCRldmVudCwgaSwgcClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcCB9fSVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm10LTNcIiAqbmdJZj1cImlzQ2F0ZWdvcnlMaW1pdFJlYWNoZWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1zb2Z0LXByaW1hcnkgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZS1kb3RcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+TWF4aW11bSBjYXRlZ29yeSBjcmVhdGlvbiBsaW1pdCByZWFjaGVkLjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgIDwhLS0gRm9vdGZhbGwgZGlyZWN0b3J5IGxpbWl0YXRpb25zIGVuZCAgLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8aHIgY2xhc3M9XCJtcy00IG1lLTRcIiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiPlxyXG4gICAgXHJcbiAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJhY2N1cmFjeUJyZWFjaFwiIGNsYXNzPVwiY2FyZCBwLTQgbWItMyBzdG9yZS1yZXF1ZXN0cy1zZWN0aW9uXCI+XHJcbiAgICAgICAgPCEtLSBzdG9yZSByZXF1ZXN0IEhlYWRlciBTZWN0aW9uIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtc3RhcnQgbWItNFwiPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiZnctc2VtaWJvbGQgbWItMlwiPlN0b3JlIFJlcXVlc3RzPC9oNT5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGwgbWItMCB0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQmVsb3cgc3RvcmVzIGhhdmUgcmVxdWVzdGVkIHRvIHJhaXNlIGEgdGlja2V0IGFmdGVyIGJyZWFjaGluZyB0aGUgY29uZmlndXJlZCBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5mby1pY29uXCI+aTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJlc2V0LWJ0biBkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0VkaXRcIiBbZGlzYWJsZWRdPVwiaXNSZXNldERpc2FibGVkXCIgKGNsaWNrKT1cIm9wZW5SZXNldENvbmZpcm1hdGlvbk1vZGFsKClcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlJlc2V0PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBSZXN0cmljdGlvbiBDcml0ZXJpYSBTZWN0aW9uIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXN0cmljdGlvbi1jcml0ZXJpYSBtYi00XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTMgZC1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgUmVzdHJpY3QgdGlja2V0IGNyZWF0aW9uIGZvciBhbnkgc3RvcmUgdGhhdDpcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1ub3dyYXAgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gVGlja2V0IENvdW50IERyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+SGFzIHJhaXNlZCBtb3JlIHRoYW48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdFwiIFtjbGFzcy5vcGVuXT1cImlzVGlja2V0Q291bnREcm9wZG93bk9wZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIiAoY2xpY2spPVwidG9nZ2xlVGlja2V0Q291bnREcm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoLnRpY2tldENvdW50Jyk/LnZhbHVlIHx8IDEgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc1RpY2tldENvdW50RHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBjIG9mIFsxLCAyLCAzLCA0LCA1XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGlja2V0Q291bnQoJGV2ZW50LCBjKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+dGlja2V0cyBpbiB0aGUgY2FsZW5kZXI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8IS0tIERheXMgRHJvcGRvd24gKE1vbnRoPTMwLCBXZWVrPTcpIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIGZmLXNlbGVjdC13cmFwcGVyIGNvbXBhY3Qgc3RvcmUtZGF5cy1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cImlzU3RvcmVEYXlzRHJvcGRvd25PcGVuXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZSBzbWFsbFwiIChjbGljayk9XCJ0b2dnbGVTdG9yZURheXNEcm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHNlbGVjdGVkRGF5c0xhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc1N0b3JlRGF5c0Ryb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgb3B0IG9mIGRheXNPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTdG9yZURheXMoJGV2ZW50LCBvcHQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHQubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYm9sZFwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDtcIj5BTkQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5oYXMgZm9vdGZhbGwgYWNjdXJhY3k8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8IS0tIEFjY3VyYWN5IERyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIGZmLXNlbGVjdC13cmFwcGVyIGNvbXBhY3RcIiBbY2xhc3Mub3Blbl09XCJpc1N0b3JlQWNjdXJhY3lEcm9wZG93bk9wZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIiAoY2xpY2spPVwidG9nZ2xlU3RvcmVBY2N1cmFjeURyb3Bkb3duKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PXt7IGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC5hY2N1cmFjeScpPy52YWx1ZSB8fCAnOTUlJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzU3RvcmVBY2N1cmFjeURyb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgcCBvZiBbOTUsIDk2LCA5NywgOTgsIDk5XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U3RvcmVBY2N1cmFjeSgkZXZlbnQsIHApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PXt7IHAgfX0lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFN0b3JlIFJlcXVlc3RzIFRhYmxlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1yZXF1ZXN0cy10YWJsZVwiIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIlxyXG4gICAgICAgICAgICAqbmdJZj1cInN0b3JlTGlzdD8ubGVuZ3RoID4gMDsgZWxzZSBlbXB0eVN0b3JlUmVxdWVzdHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIiBbbmdDbGFzc109XCJ7J3N0b3JlLXRhYmxlLXNjcm9sbCc6IHN0b3JlTGlzdD8ubGVuZ3RoID4gNX1cIj5cclxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWhvdmVyIHN0b3JlLXJlcXVlc3RzLXRhYmxlLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNoZWNrYm94LWNvbHVtblwiPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzb3J0YWJsZSBzdG9yZS1uYW1lLWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1zZWxlY3QgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNBbGxTZWxlY3RlZFwiIFtkaXNhYmxlZF09XCJpc0VkaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKCRldmVudClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja21hcmstc2VsZWN0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+U2VsZWN0IGFsbCBzdG9yZXMgKHt7IHN0b3JlTGlzdD8ubGVuZ3RoIHx8IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1zLTIgZHJvcGRvd24tYXJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFpc2VkIG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtcy0xIHNvcnQtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNC41TDYgMS41TDkgNC41TTMgNy41TDYgMTAuNUw5IDcuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzb3J0YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3QgcmFpc2VkKEFwcHJvdmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIGNsYXNzPVwibXMtMSBzb3J0LWljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDEuNUw5IDQuNU0zIDcuNUw2IDEwLjVMOSA3LjVcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic29ydGFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBvZiBUaW1lIFJhaXNlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIGNsYXNzPVwibXMtMSBzb3J0LWljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDEuNUw5IDQuNU0zIDcuNUw2IDEwLjVMOSA3LjVcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHN0b3JlIG9mIHN0b3JlTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2hlY2tib3gtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94LXNlbGVjdCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNjYiB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc1N0b3JlU2VsZWN0ZWQoc3RvcmUpXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVN0b3JlU2VsZWN0aW9uKHN0b3JlLCBjYi5jaGVja2VkKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hlY2ttYXJrLXNlbGVjdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBzdG9yZS5zdG9yZU5hbWUgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLnJhaXNlZE9uIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBzdG9yZS5sYXN0QXBwcm92ZWQgfHwgJy0nIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBzdG9yZS50b3RhbFJhaXNlZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlTdG9yZVJlcXVlc3RzPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RvcmUtc3RhdGUgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdG9yZS1pY29uIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHZpZXdCb3g9XCIwIDAgNDAgNDBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC45NDYyOSAyMS4xOTk1QzguNjQ1IDIxLjIzMTMgOC4zMzgyOCAyMS4yNTAyIDguMDI3MzQgMjEuMjUwMkM3Ljg1NzgyIDIxLjI1MDIgNy42OTA1MiAyMS4yNDM0IDcuNTI1MzkgMjEuMjMzNlYzMS42MDY3QzcuNTI1MzkgMzMuMDM0NyA4LjcwODM3IDM0LjIyNTggMTAuMTk2MyAzNC4yMjU4SDI5LjgwMDhDMzEuMjg4OCAzNC4yMjU4IDMyLjQ3MTcgMzMuMDM0NyAzMi40NzE3IDMxLjYwNjdWMjEuMjM0NkMzMi4zMDk4IDIxLjI0MzggMzIuMTQ1OSAyMS4yNTAyIDMxLjk4MTQgMjEuMjUwMkMzMS42Njc1IDIxLjI1MDIgMzEuMzU2OSAyMS4yMzIzIDMxLjA1MDggMjEuMTk5NVYyOC45ODc1SDguOTQ2MjlWMjEuMTk5NVpNMzAuOTI3NyA1Ljc3MzY4SDkuMDY5MzRDOC44OTE5NyA1Ljc3MzY4IDguNzM2NzEgNS44NjY0NyA4LjY1OTE4IDUuOTg3NTVMOC42NTcyMyA1Ljk4OTVMNS4xNDc0NiAxMS40NzI5TDUuMDUyNzMgMTEuNjIwNEMzLjgyNzE5IDEzLjc0MDIgNS4wOTE4IDE2LjQ2NzEgNy40NDMzNiAxNi43NzY2QzcuNjQ0MjggMTYuODAxMSA3LjgzNDAzIDE2LjgxNTcgOC4wMjE0OCAxNi44MTU3QzkuMjUxNTYgMTYuODE1NyAxMC4zMzk1IDE2LjI4NyAxMS4wOTY3IDE1LjQ2NTFMMTIuMDE4NiAxNC40NjQxTDEyLjkzNzUgMTUuNDY4QzEzLjY4NjQgMTYuMjg2MSAxNC43NzMxIDE2LjgxNTcgMTYuMDEwNyAxNi44MTU3QzE3LjI0MjggMTYuODE1NiAxOC4zMzQ3IDE2LjI4NTQgMTkuMDgzIDE1LjQ2OEwyMC4wMDQ5IDE0LjQ2MTJMMjAuOTI2OCAxNS40NjhDMjEuNjc1MSAxNi4yODU1IDIyLjc2NjggMTYuODE1NyAyMy45OTkgMTYuODE1N0MyNS4yMzEyIDE2LjgxNTcgMjYuMzIyOSAxNi4yODU0IDI3LjA3MTMgMTUuNDY4TDI3Ljk5MzIgMTQuNDYxMkwyOC45MTUgMTUuNDY4QzI5LjY2MzQgMTYuMjg1NSAzMC43NTYgMTYuODE1NyAzMS45ODgzIDE2LjgxNTdDMzIuMTY5NyAxNi44MTU3IDMyLjM2NDggMTYuODAxOCAzMi41NjQ1IDE2Ljc3NzZIMzIuNTYzNUMzNC45NTcyIDE2LjQ1NzEgMzYuMjI1NCAxMy42MDc1IDM0Ljg1NzQgMTEuNDcyOUwzNC44NTY0IDExLjQ3MzlMMzEuMzM5OCA1Ljk5MDQ4TDMxLjMzODkgNS45ODc1NUMzMS4yNjE0IDUuODY2MjggMzEuMTA1MyA1Ljc3MzY4IDMwLjkyNzcgNS43NzM2OFpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwOUJGM1wiIHN0cm9rZS13aWR0aD1cIjIuNVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMCBmdy1zZW1pYm9sZCB0ZXh0LW11dGVkXCI+Tm8gcmVzZXQgcmVxdWVzdCBmcm9tIHN0b3JlPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8aHIgY2xhc3M9XCJtcy00IG1lLTRcIiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiPlxyXG4gICAgPCEtLSBUYW5nbyBSZXZpZXcgLS0+XHJcbiAgICA8IS0tIDxkaXYgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8udXNlclR5cGUgPT09ICd0YW5nbydcIiBjbGFzcz1cImNhcmQgcC0zIG1iLTNcIj5cclxuICAgICAgICA8bGFiZWw+U2VuZCBUaWNrZXQgdG8gVGFuZ28gaWYgYWNjdXJhY3kgZmFsbHMgYmVsb3c8L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHctMjVcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YW5nb1Jldmlld1wiPlxyXG4gICAgPC9kaXY+IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LnVzZXJUeXBlID09PSAndGFuZ28nXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC00IG1iLTQgdGFuZ28tcmV2aWV3LWNhcmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgbWItMVwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiZnctYm9sZCBtLTBcIj5TZW5kIFRpY2tldCB0byBUYW5nbzwvaDU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWUtMiBtYi0wIHRhbmdvLWxhYmVsXCI+U2VuZCB0aWNrZXQgdG8gVGFuZ28gaWYgYWNjdXJhY3kgZmFsbHMgYmVsb3c8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIGZmLXNlbGVjdC13cmFwcGVyIGNvbXBhY3QgbXMtMFwiIFtjbGFzcy5vcGVuXT1cImlzc2VuZFRhbmdvRHJvcGRvd25PcGVuXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCIgKGNsaWNrKT1cInRvZ2dsZVNlbmRUYW5nb0Nsb3NlRHJvcGRvd24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBmb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgndGFuZ29SZXZpZXcnKT8udmFsdWUgfHwgJzElJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwiaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IHAgb2Ygc2VuZFRpY2tldFRhbmdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTZW5kVGlja2V0VGFuZ28oJGV2ZW50LCBwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcCB9fSVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi01IHctMTAwIGZvb3Rlci1zZXBlcmF0b3JcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgPGEgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIG10LTEgbWUtNFwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+Q2FuY2VsPC9hPlxyXG4gICAgICAgICAgICA8YSB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcHgtNFwiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+PHNwYW4+U2F2ZSBDaGFuZ2VzPC9zcGFuPjwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQ2F0ZWdvcnkgTW9kYWwgLS0+XHJcbiAgICA8bmctdGVtcGxhdGUgI2NhdGVnb3J5TW9kYWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBib3JkZXItMCBwYi0wXCI+XHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBjYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcgPyAnQWRkIE5ldyBDYXRlZ29yeScgOiAnRWRpdCBDYXRlZ29yeScgfX1cclxuICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwiY2xvc2VDYXRlZ29yeU1vZGFsKClcIj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBjYXRlZ29yeS1tb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY2F0ZWdvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgdGV4dC1tdXRlZFwiPkljb248L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3Qtd3JhcHBlciBpY29uLXNlbGVjdFwiIFtjbGFzcy5vcGVuXT1cImlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZVwiIChjbGljayk9XCJ0b2dnbGVDYXRlZ29yeUljb25Ecm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeS1pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY2F0ZWdvcnlGb3JtLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgfHwgYmFzZUNhdGVnb3J5SWNvbnNbMF0/LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNhdGVnb3J5Rm9ybS5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlIHx8IGJhc2VDYXRlZ29yeUljb25zWzBdPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCbHVlIFRhZyBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidibHVlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQdXJwbGUgVGFnIFNWRyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidwdXJwbGVUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3JhbmdlIFRhZyBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInb3JhbmdlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhvdXNlIEtlZXBpbmcgVGFnIFNWRyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidob3VzZUtlZXBpbmdUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF9pY29uX2hvdXNla2VlcGluZylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjA0OTgzIDAuNTQ0OTQ3QzcuNzQ3MzggLTAuMTgxNjQ5IDguODc4MjkgLTAuMTgxNjQ5IDkuNTc1ODQgMC41NDQ5NDdMMTUuNDY5NyA2LjY4NDRDMTYuMTY3MiA3LjQxMTAxIDE2LjE2NzIgOC41ODkwNCAxNS40Njk3IDkuMzE1NjVMOS41NzU4NCAxNS40NTUxQzguODc4MjkgMTYuMTgxNiA3Ljc0NzM4IDE2LjE4MTYgNy4wNDk4MyAxNS40NTUxTDUuMzY1NjIgMTMuNzAwN0wzLjgyMTc5IDE1LjMwODhDMy4xMjQyNiAxNi4wMzU0IDEuOTkzMzQgMTYuMDM1NCAxLjI5NTggMTUuMzA4OEMwLjU5ODI3MiAxNC41ODIzIDAuNTk4MjcyIDEzLjQwNDIgMS4yOTU4IDEyLjY3NzdMMi44Mzk2NCAxMS4wNjk1TDEuMTU1OTYgOS4zMTU2NUMwLjQ1ODQyOSA4LjU4OTA0IDAuNDU4NDI5IDcuNDExMDEgMS4xNTU5NiA2LjY4NDRMNy4wNDk4MyAwLjU0NDk0N1pNOC43MzM4MSAxLjQyMjAzQzguNTAxMjkgMS4xNzk4MyA4LjEyNDMgMS4xNzk4MyA3Ljg5MTc4IDEuNDIyMDNMMy42ODE2NSA1LjgwNzYyTDEwLjQxNzUgMTIuODI0MkwxNC42Mjc3IDguNDM4NTRDMTQuODYwMiA4LjE5NjM0IDE0Ljg2MDIgNy44MDM2MyAxNC42Mjc3IDcuNTYxNTFMMTEuNjgwNSA0LjQ5MTQzTDEwLjY5ODEgNS41MTQ2OUMxMC40NjU2IDUuNzU2ODkgMTAuMDg4NyA1Ljc1Njg5IDkuODU2MTQgNS41MTQ2OUM5LjYyMzYzIDUuMjcyNDkgOS42MjM2MyA0Ljg3OTgxIDkuODU2MTQgNC42Mzc2MUwxMC44Mzg0IDMuNjE0MzVMOS45OTY2NSAyLjczNzQ2TDcuNjExIDUuMjIyNTJDNy4zNzg0OSA1LjQ2NDcxIDcuMDAxNDkgNS40NjQ3MSA2Ljc2ODk3IDUuMjIyNTJDNi41MzY0NiA0Ljk4MDMyIDYuNTM2NDYgNC41ODc2MyA2Ljc2ODk3IDQuMzQ1NDRMOS4xNTQ2MiAxLjg2MDM4TDguNzMzODEgMS40MjIwM1pNOS41NzU1MiAxMy43MDEyTDIuODM5NjYgNi42ODQ3TDEuOTk3OTYgNy41NjE1MUMxLjc2NTQ0IDcuODAzNjMgMS43NjU0NCA4LjE5NjM0IDEuOTk3OTYgOC40Mzg1NEw3Ljg5MTc4IDE0LjU3OEM4LjEyNDMgMTQuODIwMiA4LjUwMTI5IDE0LjgyMDIgOC43MzM4MSAxNC41NzhMOS41NzU1MiAxMy43MDEyWk0zLjY4MTU2IDExLjk0NjZMMi4xMzc4IDEzLjU1NDdDMS45MDUyOSAxMy43OTY5IDEuOTA1MjkgMTQuMTg5NiAyLjEzNzggMTQuNDMxOEMyLjM3MDMxIDE0LjY3NCAyLjc0NzI5IDE0LjY3NCAyLjk3OTggMTQuNDMxOEw0LjUyMzU1IDEyLjgyMzdMMy42ODE1NiAxMS45NDY2WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwX2ljb25faG91c2VrZWVwaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBKdW5rIFRhZyBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInanVua1RhZydcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yIDQuMDAwMDRIMy4zMzMzM00zLjMzMzMzIDQuMDAwMDRIMTRNMy4zMzMzMyA0LjAwMDA0VjEzLjMzMzRDMy4zMzMzMyAxMy42ODcgMy40NzM4MSAxNC4wMjYxIDMuNzIzODYgMTQuMjc2MkMzLjk3MzkxIDE0LjUyNjIgNC4zMTMwNCAxNC42NjY3IDQuNjY2NjcgMTQuNjY2N0gxMS4zMzMzQzExLjY4NyAxNC42NjY3IDEyLjAyNjEgMTQuNTI2MiAxMi4yNzYxIDE0LjI3NjJDMTIuNTI2MiAxNC4wMjYxIDEyLjY2NjcgMTMuNjg3IDEyLjY2NjcgMTMuMzMzNFY0LjAwMDA0SDMuMzMzMzNaTTUuMzMzMzMgNC4wMDAwNFYyLjY2NjcxQzUuMzMzMzMgMi4zMTMwOSA1LjQ3MzgxIDEuOTczOTUgNS43MjM4NiAxLjcyMzlDNS45NzM5MSAxLjQ3Mzg1IDYuMzEzMDQgMS4zMzMzNyA2LjY2NjY3IDEuMzMzMzdIOS4zMzMzM0M5LjY4Njk2IDEuMzMzMzcgMTAuMDI2MSAxLjQ3Mzg1IDEwLjI3NjEgMS43MjM5QzEwLjUyNjIgMS45NzM5NSAxMC42NjY3IDIuMzEzMDkgMTAuNjY2NyAyLjY2NjcxVjQuMDAwMDRNNi42NjY2NyA3LjMzMzM3VjExLjMzMzRNOS4zMzMzMyA3LjMzMzM3VjExLjMzMzRcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tbGFiZWxcIj57eyBzZWxlY3RlZENhdGVnb3J5SWNvbkxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc0NhdGVnb3J5SWNvbkRyb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpY29uIG9mIGNhdGVnb3J5SWNvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDYXRlZ29yeUljb25Gcm9tRHJvcGRvd24oJGV2ZW50LCBpY29uLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktaWNvblwiIFtuZ0NsYXNzXT1cImljb24udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiaWNvbi52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCbHVlIFRhZyBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidibHVlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQdXJwbGUgVGFnIFNWRyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidwdXJwbGVUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3JhbmdlIFRhZyBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInb3JhbmdlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhvdXNlIEtlZXBpbmcgVGFnIFNWRyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidob3VzZUtlZXBpbmdUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xMTYyXzI0NjUwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMDQ5ODMgMC41NDQ5NDdDNy43NDczOCAtMC4xODE2NDkgOC44NzgyOSAtMC4xODE2NDkgOS41NzU4NCAwLjU0NDk0N0wxNS40Njk3IDYuNjg0NEMxNi4xNjcyIDcuNDExMDEgMTYuMTY3MiA4LjU4OTA0IDE1LjQ2OTcgOS4zMTU2NUw5LjU3NTg0IDE1LjQ1NTFDOC44NzgyOSAxNi4xODE2IDcuNzQ3MzggMTYuMTgxNiA3LjA0OTgzIDE1LjQ1NTFMNS4zNjU2MiAxMy43MDA3TDMuODIxNzkgMTUuMzA4OEMzLjEyNDI2IDE2LjAzNTQgMS45OTMzNCAxNi4wMzU0IDEuMjk1OCAxNS4zMDg4QzAuNTk4MjcyIDE0LjU4MjMgMC41OTgyNzIgMTMuNDA0MiAxLjI5NTggMTIuNjc3N0wyLjgzOTY0IDExLjA2OTVMMS4xNTU5NiA5LjMxNTY1QzAuNDU4NDI5IDguNTg5MDQgMC40NTg0MjkgNy40MTEwMSAxLjE1NTk2IDYuNjg0NEw3LjA0OTgzIDAuNTQ0OTQ3Wk04LjczMzgxIDEuNDIyMDNDOC41MDEyOSAxLjE3OTgzIDguMTI0MyAxLjE3OTgzIDcuODkxNzggMS40MjIwM0wzLjY4MTY1IDUuODA3NjJMMTAuNDE3NSAxMi44MjQyTDE0LjYyNzcgOC40Mzg1NEMxNC44NjAyIDguMTk2MzQgMTQuODYwMiA3LjgwMzYzIDE0LjYyNzcgNy41NjE1MUwxMS42ODA1IDQuNDkxNDNMMTAuNjk4MSA1LjUxNDY5QzEwLjQ2NTYgNS43NTY4OSAxMC4wODg3IDUuNzU2ODkgOS44NTYxNCA1LjUxNDY5QzkuNjIzNjMgNS4yNzI0OSA5LjYyMzYzIDQuODc5ODEgOS44NTYxNCA0LjYzNzYxTDEwLjgzODQgMy42MTQzNUw5Ljk5NjY1IDIuNzM3NDZMNy42MTEgNS4yMjI1MkM3LjM3ODQ5IDUuNDY0NzEgNy4wMDE0OSA1LjQ2NDcxIDYuNzY4OTcgNS4yMjI1MkM2LjUzNjQ2IDQuOTgwMzIgNi41MzY0NiA0LjU4NzYzIDYuNzY4OTcgNC4zNDU0NEw5LjE1NDYyIDEuODYwMzhMOC43MzM4MSAxLjQyMjAzWk05LjU3NTUyIDEzLjcwMTJMMi44Mzk2NiA2LjY4NDdMMS45OTc5NiA3LjU2MTUxQzEuNzY1NDQgNy44MDM2MyAxLjc2NTQ0IDguMTk2MzQgMS45OTc5NiA4LjQzODU0TDcuODkxNzggMTQuNTc4QzguMTI0MyAxNC44MjAyIDguNTAxMjkgMTQuODIwMiA4LjczMzgxIDE0LjU3OEw5LjU3NTUyIDEzLjcwMTJaTTMuNjgxNTYgMTEuOTQ2NkwyLjEzNzggMTMuNTU0N0MxLjkwNTI5IDEzLjc5NjkgMS45MDUyOSAxNC4xODk2IDIuMTM3OCAxNC40MzE4QzIuMzcwMzEgMTQuNjc0IDIuNzQ3MjkgMTQuNjc0IDIuOTc5OCAxNC40MzE4TDQuNTIzNTUgMTIuODIzN0wzLjY4MTU2IDExLjk0NjZaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMzQ0MDU0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzExNjJfMjQ2NTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEp1bmsgVGFnIFNWRyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidqdW5rVGFnJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIgNC4wMDAwNEgzLjMzMzMzTTMuMzMzMzMgNC4wMDAwNEgxNE0zLjMzMzMzIDQuMDAwMDRWMTMuMzMzNEMzLjMzMzMzIDEzLjY4NyAzLjQ3MzgxIDE0LjAyNjEgMy43MjM4NiAxNC4yNzYyQzMuOTczOTEgMTQuNTI2MiA0LjMxMzA0IDE0LjY2NjcgNC42NjY2NyAxNC42NjY3SDExLjMzMzNDMTEuNjg3IDE0LjY2NjcgMTIuMDI2MSAxNC41MjYyIDEyLjI3NjEgMTQuMjc2MkMxMi41MjYyIDE0LjAyNjEgMTIuNjY2NyAxMy42ODcgMTIuNjY2NyAxMy4zMzM0VjQuMDAwMDRIMy4zMzMzM1pNNS4zMzMzMyA0LjAwMDA0VjIuNjY2NzFDNS4zMzMzMyAyLjMxMzA5IDUuNDczODEgMS45NzM5NSA1LjcyMzg2IDEuNzIzOUM1Ljk3MzkxIDEuNDczODUgNi4zMTMwNCAxLjMzMzM3IDYuNjY2NjcgMS4zMzMzN0g5LjMzMzMzQzkuNjg2OTYgMS4zMzMzNyAxMC4wMjYxIDEuNDczODUgMTAuMjc2MSAxLjcyMzlDMTAuNTI2MiAxLjk3Mzk1IDEwLjY2NjcgMi4zMTMwOSAxMC42NjY3IDIuNjY2NzFWNC4wMDAwNE02LjY2NjY3IDcuMzMzMzdWMTEuMzMzNE05LjMzMzMzIDcuMzMzMzdWMTEuMzMzNFwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpY29uLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHRleHQtbXV0ZWRcIj5DYXRlZ29yeSBOYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/LmludmFsaWQgJiYgY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpPy50b3VjaGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIG5ldyBjYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIGNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKT8uaGFzRXJyb3IoJ2R1cGxpY2F0ZScpICYmIGNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSBuYW1lIGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgdGV4dC1tdXRlZFwiPkxpbWl0YXRpb248L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3Qtd3JhcHBlclwiIFtjbGFzcy5vcGVuXT1cImlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGVcIiAoY2xpY2spPVwidG9nZ2xlQ2F0ZWdvcnlMaW1pdERyb3Bkb3duKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNhdGVnb3J5Rm9ybS5nZXQoJ2xpbWl0Jyk/LnZhbHVlIHx8IHBlcmNlbnRhZ2VMaXN0WzBdIH19JTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwiaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgcCBvZiBwZXJjZW50YWdlTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhdGVnb3J5TGltaXRWYWx1ZSgkZXZlbnQsIHApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcCB9fSVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlciBib3JkZXItMCBwdC0wXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cImNsb3NlQ2F0ZWdvcnlNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInN1Ym1pdENhdGVnb3J5Rm9ybSgpXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBjYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcgPyAnQ3JlYXRlJyA6ICdTYXZlJyB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPCEtLSBEZWxldGUgQ29uZmlybWF0aW9uIE1vZGFsIC0tPlxyXG4gICAgPG5nLXRlbXBsYXRlICNkZWxldGVDYXRlZ29yeU1vZGFsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHRleHQtY2VudGVyIHAtNFwiPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJmdy1zZW1pYm9sZCBtYi0yXCI+Q29uZmlybWF0aW9uPC9oNT5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi00IHRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgIFlvdSdyZSBhYm91dCB0byBkZWxldGUgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7IGNhdGVnb3J5UGVuZGluZ0RlbGV0ZU5hbWUgfX08L3NwYW4+IGNhdGVnb3J5LlxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiY2xvc2VEZWxldGVNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgKGNsaWNrKT1cImNvbmZpcm1EZWxldGVDYXRlZ29yeSgpXCI+RGVsZXRlPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8IS0tIFJlc2V0IFN0b3JlIFJlcXVlc3RzIENvbmZpcm1hdGlvbiBNb2RhbCAtLT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjcmVzZXRDb25maXJtYXRpb25Nb2RhbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSB0ZXh0LWNlbnRlciBwLTRcIj5cclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwiZnctc2VtaWJvbGQgbWItMlwiPlJlc2V0IFN0b3JlIFJlcXVlc3RzPC9oNT5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi00IHRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkIHdpdGggcmVzZXR0aW5nIHRoZSBzZWxlY3RlZCA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICByZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5sZW5ndGggfX08L3NwYW4+IHN0b3JlKHMpIHJlcXVlc3RzP1xyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiY2xvc2VSZXNldE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImNvbmZpcm1SZXNldFN0b3JlUmVxdWVzdCgpXCI+UmVzZXQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuPC9mb3JtPiJdfQ==