@rangertechnologies/ngnxt 2.1.254 → 2.1.255

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/fesm2022/rangertechnologies-ngnxt.mjs +138 -169
  2. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  3. package/lib/components/pick-location/pick-location.component.d.ts +0 -1
  4. package/package.json +4 -6
  5. package/rangertechnologies-ngnxt-2.1.255.tgz +0 -0
  6. package/esm2022/environments/version.mjs +0 -15
  7. package/esm2022/lib/components/button/nxt-button.component.mjs +0 -154
  8. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +0 -360
  9. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +0 -263
  10. package/esm2022/lib/components/custom-model/custom-model.component.mjs +0 -53
  11. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +0 -158
  12. package/esm2022/lib/components/datatable/datatable.component.mjs +0 -1744
  13. package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -292
  14. package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +0 -106
  15. package/esm2022/lib/components/image-cropper/component/cropper.state.mjs +0 -208
  16. package/esm2022/lib/components/image-cropper/component/image-cropper.component.mjs +0 -562
  17. package/esm2022/lib/components/image-cropper/interfaces/basic-event.interface.mjs +0 -2
  18. package/esm2022/lib/components/image-cropper/interfaces/cropper-options.interface.mjs +0 -2
  19. package/esm2022/lib/components/image-cropper/interfaces/cropper-position.interface.mjs +0 -2
  20. package/esm2022/lib/components/image-cropper/interfaces/dimensions.interface.mjs +0 -2
  21. package/esm2022/lib/components/image-cropper/interfaces/exif-transform.interface.mjs +0 -2
  22. package/esm2022/lib/components/image-cropper/interfaces/image-cropped-event.interface.mjs +0 -2
  23. package/esm2022/lib/components/image-cropper/interfaces/image-transform.interface.mjs +0 -2
  24. package/esm2022/lib/components/image-cropper/interfaces/index.mjs +0 -2
  25. package/esm2022/lib/components/image-cropper/interfaces/loaded-image.interface.mjs +0 -2
  26. package/esm2022/lib/components/image-cropper/interfaces/move-start.interface.mjs +0 -8
  27. package/esm2022/lib/components/image-cropper/services/crop.service.mjs +0 -139
  28. package/esm2022/lib/components/image-cropper/services/load-image.service.mjs +0 -194
  29. package/esm2022/lib/components/image-cropper/utils/cropper-position.utils.mjs +0 -239
  30. package/esm2022/lib/components/image-cropper/utils/exif.utils.mjs +0 -79
  31. package/esm2022/lib/components/image-cropper/utils/keyboard.utils.mjs +0 -40
  32. package/esm2022/lib/components/image-cropper/utils/percentage.utils.mjs +0 -4
  33. package/esm2022/lib/components/image-cropper/utils/resize.utils.mjs +0 -75
  34. package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +0 -392
  35. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +0 -2972
  36. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -105
  37. package/esm2022/lib/components/pick-location/pick-location.component.mjs +0 -220
  38. package/esm2022/lib/components/search-box/search-box.component.mjs +0 -470
  39. package/esm2022/lib/country.json +0 -43237
  40. package/esm2022/lib/interfaces/actionMeta.mjs +0 -2
  41. package/esm2022/lib/interfaces/dependencyMeta.mjs +0 -2
  42. package/esm2022/lib/model/bookletWrapper.mjs +0 -7
  43. package/esm2022/lib/model/changeWrapper.mjs +0 -10
  44. package/esm2022/lib/model/errorWrapper.mjs +0 -6
  45. package/esm2022/lib/nxt-app.component.mjs +0 -22
  46. package/esm2022/lib/nxt-app.module.mjs +0 -115
  47. package/esm2022/lib/nxt-app.service.mjs +0 -14
  48. package/esm2022/lib/pages/booklet/booklet.component.mjs +0 -616
  49. package/esm2022/lib/pages/builder/element/element.component.mjs +0 -483
  50. package/esm2022/lib/pages/builder/form/form.component.mjs +0 -48
  51. package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +0 -97
  52. package/esm2022/lib/pages/builder/properties/properties.component.mjs +0 -1121
  53. package/esm2022/lib/pages/builder/templates/templates.component.mjs +0 -35
  54. package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +0 -639
  55. package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +0 -1114
  56. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -784
  57. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2206
  58. package/esm2022/lib/pipe/button-styles.pipe.mjs +0 -26
  59. package/esm2022/lib/pipe/custom-translate.pipe.mjs +0 -37
  60. package/esm2022/lib/pipe/get-value.pipe.mjs +0 -54
  61. package/esm2022/lib/pipe/question-by-row.pipe.mjs +0 -51
  62. package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +0 -40
  63. package/esm2022/lib/pipe/svg/svg.pipe.mjs +0 -26
  64. package/esm2022/lib/sample.mjs +0 -3715
  65. package/esm2022/lib/services/change/change.service.mjs +0 -46
  66. package/esm2022/lib/services/country/country.service.mjs +0 -135
  67. package/esm2022/lib/services/data/data.service.mjs +0 -100
  68. package/esm2022/lib/services/form-builder/form-builder.service.mjs +0 -474
  69. package/esm2022/lib/services/pdf-designer/pdf-designer.service.mjs +0 -395
  70. package/esm2022/lib/services/salesforce/salesforce.service.mjs +0 -41
  71. package/esm2022/lib/services/shared/shared.service.mjs +0 -100
  72. package/esm2022/lib/services/storage/storage.service.mjs +0 -59
  73. package/esm2022/lib/services/template/template.service.mjs +0 -335
  74. package/esm2022/lib/services/translation/translation.service.mjs +0 -121
  75. package/esm2022/lib/wrapper.mjs +0 -175
  76. package/esm2022/public-api.mjs +0 -22
  77. package/esm2022/rangertechnologies-ngnxt.mjs +0 -5
  78. package/rangertechnologies-ngnxt-2.1.254.tgz +0 -0
@@ -1,105 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, EventEmitter, Input, Output } from '@angular/core';
3
- import { FormsModule } from '@angular/forms';
4
- import { NxtCustomTranslatePipe } from '../../pipe/custom-translate.pipe';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- import * as i2 from "@angular/forms";
8
- export class NxtPagination {
9
- event = new EventEmitter;
10
- // page size Options
11
- pageSizeOptions = [5, 10, 15, 20, 50];
12
- /** The total number of records */
13
- collectionSize = 0;
14
- /** The number of records to display */
15
- pageSize = 10;
16
- /** Current page */
17
- currentPage = 1;
18
- /** The number of buttons to show either side of the current page */
19
- maxSize = 2;
20
- /** Display the First/Last buttons */
21
- firstLastButtons = false;
22
- /** Display the Next/Previous buttons */
23
- nextPreviousButtons = true;
24
- /** Display small pagination buttons */
25
- small = false;
26
- totalPages = [];
27
- startIndex = 0;
28
- endIndex = 0;
29
- constructor() { }
30
- ngOnInit() {
31
- this.pageSize = this.pageSize ?? 10; // Ensure a default value
32
- this.currentPage = this.currentPage === 0 ? 1 : this.currentPage;
33
- if (this.collectionSize) {
34
- this.totalPages = new Array(Math.ceil(this.collectionSize / Number(this.pageSize)));
35
- }
36
- this.updateIndexes();
37
- }
38
- ngOnChanges(changes) {
39
- this.pageSize = this.pageSize ?? 10; // Ensure a default value
40
- this.currentPage = this.currentPage === 0 ? 1 : this.currentPage ?? 1;
41
- if (this.collectionSize) {
42
- this.totalPages = new Array(Math.ceil(this.collectionSize / Number(this.pageSize)));
43
- }
44
- this.updateIndexes();
45
- }
46
- updateIndexes() {
47
- this.startIndex = (this.currentPage - 1) * Number(this.pageSize);
48
- this.endIndex = Math.min(this.startIndex + Number(this.pageSize), this.collectionSize);
49
- }
50
- /** Set page number */
51
- selectPageNumber(pageNumber) {
52
- this.currentPage = pageNumber;
53
- this.updateIndexes();
54
- this.emit();
55
- }
56
- /** Set next page number */
57
- next() {
58
- const nextPage = this.currentPage + 1;
59
- nextPage <= this.totalPages.length && this.selectPageNumber(nextPage);
60
- }
61
- /** Set previous page number */
62
- previous() {
63
- const previousPage = this.currentPage - 1;
64
- previousPage >= 1 && this.selectPageNumber(previousPage);
65
- }
66
- onPageSizeChange(newSize) {
67
- this.pageSize = newSize; // Update the pageSize
68
- this.totalPages = new Array(Math.ceil(this.collectionSize / this.pageSize));
69
- // Ensure the current page is within bounds
70
- // if (this.currentPage > this.totalPages.length) {
71
- // this.currentPage = this.totalPages.length;
72
- // }
73
- this.currentPage = 1;
74
- this.updateIndexes();
75
- this.emit(); // Emit an event if necessary
76
- }
77
- emit() {
78
- this.event.emit({ "length": this.collectionSize, "pageSize": this.pageSize, "pageIndex": this.currentPage });
79
- }
80
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtPagination, deps: [], target: i0.ɵɵFactoryTarget.Component });
81
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NxtPagination, isStandalone: true, selector: "nxt-pagination", inputs: { pageSizeOptions: "pageSizeOptions", collectionSize: "collectionSize", pageSize: "pageSize", currentPage: "currentPage", maxSize: "maxSize", firstLastButtons: "firstLastButtons", nextPreviousButtons: "nextPreviousButtons", small: "small" }, outputs: { event: "event" }, usesOnChanges: true, ngImport: i0, template: "<!-- SKS24JAN25 -->\n<div class=\"flex content-space-between main-cont\">\n <div class=\"info\">\n <div *ngIf=\"endIndex\">\n {{'SHOWING_DATA' | nxtCustomTranslate : 'Showing data'}} {{ startIndex + 1 }} {{'TO' | nxtCustomTranslate : 'to'}} {{ endIndex }} {{'OF' | nxtCustomTranslate : 'of'}} {{ collectionSize }} {{'ENTRIES' | nxtCustomTranslate : 'entries'}} \n </div>\n </div>\n <div>\n <ul [class]=\"small ? 'pagination pagination-sm' : 'pagination'\" style=\"align-items: center; padding-top: 18px;\">\n <!-- select button -->\n <div style=\"font-size: 14px; font-weight: 400; padding-right: 10px; align-items: center;\" for=\"perPage\">{{'RESULT_PER_PAGE' | nxtCustomTranslate : 'Result per page'}}</div>\n <div class=\"dropdown-wrapper\">\n <select id=\"perPage\" [ngModel]=\"pageSize\" (ngModelChange)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n <svg class=\"dropdown-arrow\" width=\"9\" height=\"6\" viewBox=\"0 0 9 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M0.684136 0.767477C0.922999 0.5378 1.30282 0.545248 1.5325 0.784111L4.5 3.93431L7.4675 0.784111C7.69718 0.545248 8.077 0.5378 8.31587 0.767477C8.55473 0.997153 8.56218 1.37698 8.3325 1.61584L4.9325 5.21584C4.81938 5.33349 4.66321 5.39998 4.5 5.39998C4.33679 5.39998 4.18062 5.33349 4.0675 5.21584L0.667501 1.61584C0.437825 1.37698 0.445272 0.997153 0.684136 0.767477Z\" fill=\"#626262\"/>\n </svg> \n </div> \n <!-- first button -->\n <li [class]=\"currentPage === 1 ? 'page-item disabled' : 'page-item'\" *ngIf=\"firstLastButtons\" >\n <button class=\"page-link\" (click)=\"selectPageNumber(1)\">\u00AB\u00AB</button>\n </li>\n <!-- last button -->\n <li [class]=\"currentPage === totalPages.length ? 'page-item disabled' : 'page-item'\" *ngIf=\"firstLastButtons\">\n <button class=\"page-link\" (click)=\"selectPageNumber(totalPages.length)\">\u00BB\u00BB</button>\n </li>\n <!-- previous button -->\n <li [class]=\"currentPage === 1 ? 'page-item disabled' : 'page-item'\" *ngIf=\"nextPreviousButtons\" >\n <button class=\"page-link\" (click)=\"previous()\">\u00AB</button>\n </li>\n <!-- page numbers -->\n <ng-container *ngFor=\"let p of totalPages; index as i\">\n <li *ngIf=\"i + 1 >= currentPage - maxSize && i + 1 <= currentPage + maxSize\" [class]=\"currentPage === i + 1 ? 'page-item active' : 'page-item'\">\n <button class=\"page-link\" (click)=\"selectPageNumber(i + 1)\">\n {{ i + 1 }}\n </button>\n </li>\n </ng-container>\n <!-- next button -->\n <li [class]=\"currentPage === totalPages.length ? 'page-item disabled' : 'page-item'\" *ngIf=\"nextPreviousButtons\">\n <button class=\"page-link\" (click)=\"next()\">\u00BB</button>\n </li>\n </ul>\n </div>\n </div>\n ", styles: [".info{color:#b5b7c0;font-size:14px;font-weight:500}button{background:#f5f5f5;border:1px solid #E9E9E9;padding:2px 10px;cursor:pointer;transition:.3s}button:hover{border:1px solid #E9E9E9;background:#fff;color:#404b52!important}button:disabled{opacity:.5;color:#73797d;cursor:not-allowed}button.active{background:#5088ff;color:#fff;border-color:#5088ff}select{margin-right:10px}select.value{font-size:2px;margin-right:10px}.main-cont{align-items:center}#perPage{font-size:14px;color:#313131;background-color:#fff;border:1px solid #E9E9E9;border-radius:4px;padding-top:2px;padding-left:7px;padding-bottom:2px;font-weight:400;appearance:none;-webkit-appearance:none;-moz-appearance:none;position:relative}#perPage:hover{background-color:#f5f5f5;color:#404b52!important}.dropdown-wrapper{position:relative;display:inline-block;width:60px;margin-right:10px}.dropdown-wrapper select{width:88%;padding:7px;font-size:16px;border:1px solid #ccc;border-radius:4px;appearance:none;-webkit-appearance:none;-moz-appearance:none;background:none}.dropdown-wrapper .dropdown-arrow{position:absolute;right:15px;top:50%;transform:translateY(-50%);pointer-events:none;color:#333}li{color:#404b52!important;font-family:inter,sans-serif!important;font-size:12px!important;padding:6px!important}::ng-deep .pagination{--bs-pagination-font-size: none !important}::ng-deep .page-item:not(:first-child) .page-link{border-radius:4px!important}.page-link{color:#404b52!important}::ng-deep .page-link.active,.active>.page-link{color:#fff!important}::ng-deep .page-link.active:hover,.active>.page-link:hover{color:#000!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }] });
82
- }
83
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtPagination, decorators: [{
84
- type: Component,
85
- args: [{ selector: 'nxt-pagination', standalone: true, imports: [CommonModule, FormsModule, NxtCustomTranslatePipe], template: "<!-- SKS24JAN25 -->\n<div class=\"flex content-space-between main-cont\">\n <div class=\"info\">\n <div *ngIf=\"endIndex\">\n {{'SHOWING_DATA' | nxtCustomTranslate : 'Showing data'}} {{ startIndex + 1 }} {{'TO' | nxtCustomTranslate : 'to'}} {{ endIndex }} {{'OF' | nxtCustomTranslate : 'of'}} {{ collectionSize }} {{'ENTRIES' | nxtCustomTranslate : 'entries'}} \n </div>\n </div>\n <div>\n <ul [class]=\"small ? 'pagination pagination-sm' : 'pagination'\" style=\"align-items: center; padding-top: 18px;\">\n <!-- select button -->\n <div style=\"font-size: 14px; font-weight: 400; padding-right: 10px; align-items: center;\" for=\"perPage\">{{'RESULT_PER_PAGE' | nxtCustomTranslate : 'Result per page'}}</div>\n <div class=\"dropdown-wrapper\">\n <select id=\"perPage\" [ngModel]=\"pageSize\" (ngModelChange)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n <svg class=\"dropdown-arrow\" width=\"9\" height=\"6\" viewBox=\"0 0 9 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M0.684136 0.767477C0.922999 0.5378 1.30282 0.545248 1.5325 0.784111L4.5 3.93431L7.4675 0.784111C7.69718 0.545248 8.077 0.5378 8.31587 0.767477C8.55473 0.997153 8.56218 1.37698 8.3325 1.61584L4.9325 5.21584C4.81938 5.33349 4.66321 5.39998 4.5 5.39998C4.33679 5.39998 4.18062 5.33349 4.0675 5.21584L0.667501 1.61584C0.437825 1.37698 0.445272 0.997153 0.684136 0.767477Z\" fill=\"#626262\"/>\n </svg> \n </div> \n <!-- first button -->\n <li [class]=\"currentPage === 1 ? 'page-item disabled' : 'page-item'\" *ngIf=\"firstLastButtons\" >\n <button class=\"page-link\" (click)=\"selectPageNumber(1)\">\u00AB\u00AB</button>\n </li>\n <!-- last button -->\n <li [class]=\"currentPage === totalPages.length ? 'page-item disabled' : 'page-item'\" *ngIf=\"firstLastButtons\">\n <button class=\"page-link\" (click)=\"selectPageNumber(totalPages.length)\">\u00BB\u00BB</button>\n </li>\n <!-- previous button -->\n <li [class]=\"currentPage === 1 ? 'page-item disabled' : 'page-item'\" *ngIf=\"nextPreviousButtons\" >\n <button class=\"page-link\" (click)=\"previous()\">\u00AB</button>\n </li>\n <!-- page numbers -->\n <ng-container *ngFor=\"let p of totalPages; index as i\">\n <li *ngIf=\"i + 1 >= currentPage - maxSize && i + 1 <= currentPage + maxSize\" [class]=\"currentPage === i + 1 ? 'page-item active' : 'page-item'\">\n <button class=\"page-link\" (click)=\"selectPageNumber(i + 1)\">\n {{ i + 1 }}\n </button>\n </li>\n </ng-container>\n <!-- next button -->\n <li [class]=\"currentPage === totalPages.length ? 'page-item disabled' : 'page-item'\" *ngIf=\"nextPreviousButtons\">\n <button class=\"page-link\" (click)=\"next()\">\u00BB</button>\n </li>\n </ul>\n </div>\n </div>\n ", styles: [".info{color:#b5b7c0;font-size:14px;font-weight:500}button{background:#f5f5f5;border:1px solid #E9E9E9;padding:2px 10px;cursor:pointer;transition:.3s}button:hover{border:1px solid #E9E9E9;background:#fff;color:#404b52!important}button:disabled{opacity:.5;color:#73797d;cursor:not-allowed}button.active{background:#5088ff;color:#fff;border-color:#5088ff}select{margin-right:10px}select.value{font-size:2px;margin-right:10px}.main-cont{align-items:center}#perPage{font-size:14px;color:#313131;background-color:#fff;border:1px solid #E9E9E9;border-radius:4px;padding-top:2px;padding-left:7px;padding-bottom:2px;font-weight:400;appearance:none;-webkit-appearance:none;-moz-appearance:none;position:relative}#perPage:hover{background-color:#f5f5f5;color:#404b52!important}.dropdown-wrapper{position:relative;display:inline-block;width:60px;margin-right:10px}.dropdown-wrapper select{width:88%;padding:7px;font-size:16px;border:1px solid #ccc;border-radius:4px;appearance:none;-webkit-appearance:none;-moz-appearance:none;background:none}.dropdown-wrapper .dropdown-arrow{position:absolute;right:15px;top:50%;transform:translateY(-50%);pointer-events:none;color:#333}li{color:#404b52!important;font-family:inter,sans-serif!important;font-size:12px!important;padding:6px!important}::ng-deep .pagination{--bs-pagination-font-size: none !important}::ng-deep .page-item:not(:first-child) .page-link{border-radius:4px!important}.page-link{color:#404b52!important}::ng-deep .page-link.active,.active>.page-link{color:#fff!important}::ng-deep .page-link.active:hover,.active>.page-link:hover{color:#000!important}\n"] }]
86
- }], ctorParameters: () => [], propDecorators: { event: [{
87
- type: Output
88
- }], pageSizeOptions: [{
89
- type: Input
90
- }], collectionSize: [{
91
- type: Input
92
- }], pageSize: [{
93
- type: Input
94
- }], currentPage: [{
95
- type: Input
96
- }], maxSize: [{
97
- type: Input
98
- }], firstLastButtons: [{
99
- type: Input
100
- }], nextPreviousButtons: [{
101
- type: Input
102
- }], small: [{
103
- type: Input
104
- }] } });
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7QUFVMUUsTUFBTSxPQUFPLGFBQWE7SUFDZCxLQUFLLEdBQUcsSUFBSSxZQUFpQixDQUFDO0lBQ3hDLG9CQUFvQjtJQUNYLGVBQWUsR0FBYSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RCxrQ0FBa0M7SUFDekIsY0FBYyxHQUFHLENBQUMsQ0FBQztJQUU1Qix1Q0FBdUM7SUFDOUIsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUV2QixtQkFBbUI7SUFDVixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBRXpCLG9FQUFvRTtJQUMzRCxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBRXJCLHFDQUFxQztJQUM1QixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFFbEMsd0NBQXdDO0lBQy9CLG1CQUFtQixHQUFHLElBQUksQ0FBQztJQUVwQyx1Q0FBdUM7SUFDOUIsS0FBSyxHQUFHLEtBQUssQ0FB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QzVFLDJDQUEyQztRQUMzQyxtREFBbUQ7UUFDbkQsK0NBQStDO1FBQy9DLElBQUk7UUFDSixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQTtRQUNwQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsNkJBQTZCO0lBQzVDLENBQUM7SUFDRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxRQUFRLEVBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUcsSUFBSSxDQUFDLFdBQVcsRUFBQyxDQUFDLENBQUE7SUFDNUcsQ0FBQzt3R0FwRlUsYUFBYTs0RkFBYixhQUFhLHNYQ2IxQix1aEdBOENHLDBuRERyQ1MsWUFBWSwrUEFBRSxXQUFXLHF2QkFBRSxzQkFBc0I7OzRGQUloRCxhQUFhO2tCQVB6QixTQUFTOytCQUNFLGdCQUFnQixjQUNkLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsc0JBQXNCLENBQUM7d0RBS2xELEtBQUs7c0JBQWQsTUFBTTtnQkFFRSxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE54dEN1c3RvbVRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlL2N1c3RvbS10cmFuc2xhdGUucGlwZSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnh0LXBhZ2luYXRpb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgTnh0UGFnaW5hdGlvbiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBPdXRwdXQoKSBldmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLy8gcGFnZSBzaXplIE9wdGlvbnNcbiAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMTUsIDIwLCA1MF07XG4gIC8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgKi9cbiAgQElucHV0KCkgY29sbGVjdGlvblNpemUgPSAwO1xuXG4gIC8qKiBUaGUgbnVtYmVyIG9mIHJlY29yZHMgdG8gZGlzcGxheSAqL1xuICBASW5wdXQoKSBwYWdlU2l6ZSA9IDEwO1xuXG4gIC8qKiBDdXJyZW50IHBhZ2UgKi9cbiAgQElucHV0KCkgY3VycmVudFBhZ2UgPSAxO1xuXG4gIC8qKiBUaGUgbnVtYmVyIG9mIGJ1dHRvbnMgdG8gc2hvdyBlaXRoZXIgc2lkZSBvZiB0aGUgY3VycmVudCBwYWdlICovXG4gIEBJbnB1dCgpIG1heFNpemUgPSAyO1xuXG4gIC8qKiBEaXNwbGF5IHRoZSBGaXJzdC9MYXN0IGJ1dHRvbnMgKi9cbiAgQElucHV0KCkgZmlyc3RMYXN0QnV0dG9ucyA9IGZhbHNlO1xuXG4gIC8qKiBEaXNwbGF5IHRoZSBOZXh0L1ByZXZpb3VzIGJ1dHRvbnMgKi9cbiAgQElucHV0KCkgbmV4dFByZXZpb3VzQnV0dG9ucyA9IHRydWU7XG5cbiAgLyoqIERpc3BsYXkgc21hbGwgcGFnaW5hdGlvbiBidXR0b25zICovXG4gIEBJbnB1dCgpIHNtYWxsID0gZmFsc2U7XG5cbiAgdG90YWxQYWdlczogYW55W10gPSBbXTtcbiAgc3RhcnRJbmRleCA9IDA7XG4gIGVuZEluZGV4ID0gMDtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemUgPz8gMTA7IC8vIEVuc3VyZSBhIGRlZmF1bHQgdmFsdWVcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5jdXJyZW50UGFnZSA9PT0gMCA/IDEgOiB0aGlzLmN1cnJlbnRQYWdlXG4gICAgaWYgKHRoaXMuY29sbGVjdGlvblNpemUpIHtcbiAgICAgIHRoaXMudG90YWxQYWdlcyA9IG5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5jb2xsZWN0aW9uU2l6ZSAvIE51bWJlcih0aGlzLnBhZ2VTaXplKSkpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUluZGV4ZXMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZSA/PyAxMDsgLy8gRW5zdXJlIGEgZGVmYXVsdCB2YWx1ZVxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlID09PSAwID8gMSA6IHRoaXMuY3VycmVudFBhZ2UgPz8gMVxuICAgIGlmICh0aGlzLmNvbGxlY3Rpb25TaXplKSB7XG4gICAgICB0aGlzLnRvdGFsUGFnZXMgPSBuZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMuY29sbGVjdGlvblNpemUgLyBOdW1iZXIodGhpcy5wYWdlU2l6ZSkpKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVJbmRleGVzKCk7XG4gIH1cbiAgdXBkYXRlSW5kZXhlcygpIHtcbiAgICB0aGlzLnN0YXJ0SW5kZXggPSAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogTnVtYmVyKHRoaXMucGFnZVNpemUpO1xuICAgIHRoaXMuZW5kSW5kZXggPSBNYXRoLm1pbih0aGlzLnN0YXJ0SW5kZXggKyBOdW1iZXIodGhpcy5wYWdlU2l6ZSksIHRoaXMuY29sbGVjdGlvblNpemUpO1xuICB9XG5cbiAgLyoqIFNldCBwYWdlIG51bWJlciAqL1xuICBzZWxlY3RQYWdlTnVtYmVyKHBhZ2VOdW1iZXI6IG51bWJlcikge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlTnVtYmVyO1xuICAgIHRoaXMudXBkYXRlSW5kZXhlcygpO1xuICAgIHRoaXMuZW1pdCgpXG4gIH1cblxuICAvKiogU2V0IG5leHQgcGFnZSBudW1iZXIgKi9cbiAgbmV4dCgpIHtcbiAgICBjb25zdCBuZXh0UGFnZSA9IHRoaXMuY3VycmVudFBhZ2UgKyAxO1xuICAgIG5leHRQYWdlIDw9IHRoaXMudG90YWxQYWdlcy5sZW5ndGggJiYgdGhpcy5zZWxlY3RQYWdlTnVtYmVyKG5leHRQYWdlKTtcbiAgfVxuXG4gIC8qKiBTZXQgcHJldmlvdXMgcGFnZSBudW1iZXIgKi9cbiAgcHJldmlvdXMoKSB7XG4gICAgY29uc3QgcHJldmlvdXNQYWdlID0gdGhpcy5jdXJyZW50UGFnZSAtIDE7XG4gICAgcHJldmlvdXNQYWdlID49IDEgJiYgdGhpcy5zZWxlY3RQYWdlTnVtYmVyKHByZXZpb3VzUGFnZSk7XG4gIH1cbiAgb25QYWdlU2l6ZUNoYW5nZShuZXdTaXplOmFueSk6IHZvaWQge1xuICAgIHRoaXMucGFnZVNpemUgPSBuZXdTaXplOyAvLyBVcGRhdGUgdGhlIHBhZ2VTaXplXG4gICAgdGhpcy50b3RhbFBhZ2VzID0gbmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLmNvbGxlY3Rpb25TaXplIC8gdGhpcy5wYWdlU2l6ZSkpO1xuICAgIC8vIEVuc3VyZSB0aGUgY3VycmVudCBwYWdlIGlzIHdpdGhpbiBib3VuZHNcbiAgICAvLyBpZiAodGhpcy5jdXJyZW50UGFnZSA+IHRoaXMudG90YWxQYWdlcy5sZW5ndGgpIHtcbiAgICAvLyAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnRvdGFsUGFnZXMubGVuZ3RoO1xuICAgIC8vIH1cbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMVxuICAgIHRoaXMudXBkYXRlSW5kZXhlcygpO1xuICAgIHRoaXMuZW1pdCgpOyAvLyBFbWl0IGFuIGV2ZW50IGlmIG5lY2Vzc2FyeVxuICB9ICAgIFxuICBlbWl0KCl7XG4gICAgdGhpcy5ldmVudC5lbWl0KHtcImxlbmd0aFwiOnRoaXMuY29sbGVjdGlvblNpemUsIFwicGFnZVNpemVcIjogdGhpcy5wYWdlU2l6ZSwgXCJwYWdlSW5kZXhcIiA6IHRoaXMuY3VycmVudFBhZ2V9KVxuICB9XG59IiwiPCEtLSBTS1MyNEpBTjI1IC0tPlxuPGRpdiBjbGFzcz1cImZsZXggY29udGVudC1zcGFjZS1iZXR3ZWVuIG1haW4tY29udFwiPlxuICAgIDxkaXYgY2xhc3M9XCJpbmZvXCI+XG4gICAgIDxkaXYgKm5nSWY9XCJlbmRJbmRleFwiPlxuICAgICB7eydTSE9XSU5HX0RBVEEnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1Nob3dpbmcgZGF0YSd9fSAge3sgc3RhcnRJbmRleCArIDEgfX0ge3snVE8nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ3RvJ319IHt7IGVuZEluZGV4IH19IHt7J09GJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdvZid9fSAge3sgY29sbGVjdGlvblNpemUgfX0ge3snRU5UUklFUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnZW50cmllcyd9fSBcbiAgICA8L2Rpdj5cbiAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgIDx1bCBbY2xhc3NdPVwic21hbGwgPyAncGFnaW5hdGlvbiBwYWdpbmF0aW9uLXNtJyA6ICdwYWdpbmF0aW9uJ1wiIHN0eWxlPVwiYWxpZ24taXRlbXM6IGNlbnRlcjsgcGFkZGluZy10b3A6IDE4cHg7XCI+XG4gICAgICAgIDwhLS0gc2VsZWN0IGJ1dHRvbiAtLT5cbiAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNDAwOyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiIGZvcj1cInBlclBhZ2VcIj57eydSRVNVTFRfUEVSX1BBR0UnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1Jlc3VsdCBwZXIgcGFnZSd9fTwvZGl2PlxuICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi13cmFwcGVyXCI+XG4gICAgICAgICA8c2VsZWN0IGlkPVwicGVyUGFnZVwiIFtuZ01vZGVsXT1cInBhZ2VTaXplXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHNpemUgb2YgcGFnZVNpemVPcHRpb25zXCIgW3ZhbHVlXT1cInNpemVcIj57eyBzaXplIH19PC9vcHRpb24+XG4gICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgIDxzdmcgY2xhc3M9XCJkcm9wZG93bi1hcnJvd1wiIHdpZHRoPVwiOVwiIGhlaWdodD1cIjZcIiB2aWV3Qm94PVwiMCAwIDkgNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMC42ODQxMzYgMC43Njc0NzdDMC45MjI5OTkgMC41Mzc4IDEuMzAyODIgMC41NDUyNDggMS41MzI1IDAuNzg0MTExTDQuNSAzLjkzNDMxTDcuNDY3NSAwLjc4NDExMUM3LjY5NzE4IDAuNTQ1MjQ4IDguMDc3IDAuNTM3OCA4LjMxNTg3IDAuNzY3NDc3QzguNTU0NzMgMC45OTcxNTMgOC41NjIxOCAxLjM3Njk4IDguMzMyNSAxLjYxNTg0TDQuOTMyNSA1LjIxNTg0QzQuODE5MzggNS4zMzM0OSA0LjY2MzIxIDUuMzk5OTggNC41IDUuMzk5OThDNC4zMzY3OSA1LjM5OTk4IDQuMTgwNjIgNS4zMzM0OSA0LjA2NzUgNS4yMTU4NEwwLjY2NzUwMSAxLjYxNTg0QzAuNDM3ODI1IDEuMzc2OTggMC40NDUyNzIgMC45OTcxNTMgMC42ODQxMzYgMC43Njc0NzdaXCIgZmlsbD1cIiM2MjYyNjJcIi8+XG4gICAgICAgICAgPC9zdmc+ICAgXG4gICAgICAgPC9kaXY+ICAgICBcbiAgICAgICA8IS0tIGZpcnN0IGJ1dHRvbiAtLT5cbiAgICAgICA8bGkgW2NsYXNzXT1cImN1cnJlbnRQYWdlID09PSAxID8gJ3BhZ2UtaXRlbSBkaXNhYmxlZCcgOiAncGFnZS1pdGVtJ1wiICpuZ0lmPVwiZmlyc3RMYXN0QnV0dG9uc1wiID5cbiAgICAgICAgIDxidXR0b24gY2xhc3M9XCJwYWdlLWxpbmtcIiAoY2xpY2spPVwic2VsZWN0UGFnZU51bWJlcigxKVwiPsKrwqs8L2J1dHRvbj5cbiAgICAgICA8L2xpPlxuICAgICAgIDwhLS0gbGFzdCBidXR0b24gLS0+XG4gICAgICAgPGxpIFtjbGFzc109XCJjdXJyZW50UGFnZSA9PT0gdG90YWxQYWdlcy5sZW5ndGggPyAncGFnZS1pdGVtIGRpc2FibGVkJyA6ICdwYWdlLWl0ZW0nXCIgKm5nSWY9XCJmaXJzdExhc3RCdXR0b25zXCI+XG4gICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFnZS1saW5rXCIgKGNsaWNrKT1cInNlbGVjdFBhZ2VOdW1iZXIodG90YWxQYWdlcy5sZW5ndGgpXCI+wrvCuzwvYnV0dG9uPlxuICAgICAgIDwvbGk+XG4gICAgICAgPCEtLSBwcmV2aW91cyBidXR0b24gLS0+XG4gICAgICAgPGxpIFtjbGFzc109XCJjdXJyZW50UGFnZSA9PT0gMSA/ICdwYWdlLWl0ZW0gZGlzYWJsZWQnIDogJ3BhZ2UtaXRlbSdcIiAqbmdJZj1cIm5leHRQcmV2aW91c0J1dHRvbnNcIiA+XG4gICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFnZS1saW5rXCIgKGNsaWNrKT1cInByZXZpb3VzKClcIj7CqzwvYnV0dG9uPlxuICAgICAgIDwvbGk+XG4gICAgICAgPCEtLSBwYWdlIG51bWJlcnMgLS0+XG4gICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcCBvZiB0b3RhbFBhZ2VzOyBpbmRleCBhcyBpXCI+XG4gICAgICAgICA8bGkgKm5nSWY9XCJpICsgMSA+PSBjdXJyZW50UGFnZSAtIG1heFNpemUgJiYgaSArIDEgPD0gY3VycmVudFBhZ2UgKyBtYXhTaXplXCIgW2NsYXNzXT1cImN1cnJlbnRQYWdlID09PSBpICsgMSA/ICdwYWdlLWl0ZW0gYWN0aXZlJyA6ICdwYWdlLWl0ZW0nXCI+XG4gICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJwYWdlLWxpbmtcIiAoY2xpY2spPVwic2VsZWN0UGFnZU51bWJlcihpICsgMSlcIj5cbiAgICAgICAgICAgICB7eyBpICsgMSB9fVxuICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgIDwvbGk+XG4gICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgPCEtLSBuZXh0IGJ1dHRvbiAtLT5cbiAgICAgICA8bGkgW2NsYXNzXT1cImN1cnJlbnRQYWdlID09PSB0b3RhbFBhZ2VzLmxlbmd0aCA/ICdwYWdlLWl0ZW0gZGlzYWJsZWQnIDogJ3BhZ2UtaXRlbSdcIiAqbmdJZj1cIm5leHRQcmV2aW91c0J1dHRvbnNcIj5cbiAgICAgICAgIDxidXR0b24gY2xhc3M9XCJwYWdlLWxpbmtcIiAoY2xpY2spPVwibmV4dCgpXCI+wrs8L2J1dHRvbj5cbiAgICAgICA8L2xpPlxuICAgICA8L3VsPlxuICAgIDwvZGl2PlxuIDwvZGl2PlxuICAgIl19
@@ -1,220 +0,0 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { GoogleMapsModule } from '@angular/google-maps';
4
- import { FormsModule } from '@angular/forms';
5
- import { NxtInput } from '../nxt-input/nxt-input.component';
6
- import { NxtCustomTranslatePipe } from '../../pipe/custom-translate.pipe';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/common";
9
- import * as i2 from "@angular/google-maps";
10
- export class PickLocationComponent {
11
- ngZone;
12
- cdr;
13
- latitude = null;
14
- longitude = null;
15
- zoom = 10;
16
- geoCoder;
17
- // public formGroup: FormGroup;
18
- searchElementRef;
19
- showModal = false;
20
- address;
21
- from;
22
- // VD 21DEC23 - dependent field change
23
- question;
24
- mode = 'edit'; // New mode input
25
- locationSelected = new EventEmitter();
26
- navigatorGeolocation;
27
- markerPosition;
28
- center;
29
- markerOptions;
30
- apiKey; // HA10012024 declared Api key to src
31
- constructor(
32
- // private mapsAPILoader: MapsAPILoader,
33
- ngZone, cdr) {
34
- this.ngZone = ngZone;
35
- this.cdr = cdr;
36
- }
37
- ngOnInit() {
38
- // HA-11-01-2024 Changed the map Call from constructor to ngOnInit as it was giving undefined values in the outsourced
39
- if (this.apiKey) {
40
- this.loadGoogleMapsScript().then(() => {
41
- this.geoCoder = new google.maps.Geocoder();
42
- this.markerOptions = new google.maps.Marker({
43
- draggable: true,
44
- animation: google.maps.Animation.DROP
45
- });
46
- this.initAutocomplete();
47
- this.onMarkerDragEnd();
48
- });
49
- }
50
- }
51
- // RS 23JAN2025
52
- ngOnChanges(changes) {
53
- if (changes['mode']) {
54
- this.mode = changes['mode'].currentValue;
55
- }
56
- if (changes['address'] && changes['address'].currentValue !== changes['address'].previousValue) {
57
- // Ensure latitude & longitude update when the address changes
58
- if (this.address) {
59
- this.geoCoder.geocode({ address: this.address }, (results, status) => {
60
- if (status === 'OK' && results[0]?.geometry?.location) {
61
- this.latitude = results[0].geometry.location.lat();
62
- this.longitude = results[0].geometry.location.lng();
63
- this.markerPosition = { lat: this.latitude, lng: this.longitude };
64
- this.center = { lat: this.latitude, lng: this.longitude };
65
- this.zoom = 18;
66
- this.cdr.detectChanges(); // Force Angular to update the UI
67
- }
68
- });
69
- }
70
- else {
71
- // Reset if no address is provided
72
- this.latitude = null;
73
- this.longitude = null;
74
- this.markerPosition = null;
75
- this.center = null;
76
- this.cdr.detectChanges(); // FORCE UI UPDATE
77
- }
78
- }
79
- }
80
- setInputRef(ref) {
81
- this.searchElementRef = ref;
82
- this.initAutocomplete(); // SKS11JUN25 Now that input ref is ready, initialize autocomplete
83
- }
84
- // HA09012024 is to avoid google is undefined error
85
- loadGoogleMapsScript() {
86
- const script = document.createElement('script');
87
- script.type = 'text/javascript';
88
- // HA10012024 Assigned Api key to src
89
- script.src = `https://maps.googleapis.com/maps/api/js?key=${this.apiKey}&libraries=geometry,places`;
90
- script.async = true;
91
- script.defer = true;
92
- document.body.appendChild(script);
93
- return new Promise((resolve, reject) => {
94
- script.onload = () => {
95
- resolve();
96
- };
97
- script.onerror = (error) => {
98
- reject(error);
99
- };
100
- });
101
- }
102
- initAutocomplete() {
103
- if (this.geoCoder) {
104
- const autocomplete = new google.maps.places.Autocomplete(this.searchElementRef?.nativeElement, {
105
- types: []
106
- });
107
- autocomplete.addListener('place_changed', () => {
108
- this.ngZone.run(() => {
109
- const place = autocomplete.getPlace();
110
- if (place.geometry === undefined || place.geometry === null) {
111
- return;
112
- }
113
- this.latitude = place.geometry.location.lat();
114
- this.longitude = place.geometry.location.lng();
115
- this.zoom = 18;
116
- this.address = place.formatted_address;
117
- // VD 21DEC23 - dependent field change
118
- let change = {};
119
- // RS 09DEC24 Changed keys
120
- change['fromQuestionId'] = this.question.id;
121
- let addObj = {};
122
- addObj['address'] = this.address;
123
- addObj['latitude'] = this.latitude;
124
- addObj['longitude'] = this.longitude;
125
- change['valueObj'] = addObj;
126
- change['referenceField'] = this.question.referenceField;
127
- this.locationSelected.emit(change);
128
- });
129
- });
130
- }
131
- }
132
- onMarkerDragEnd() {
133
- google.maps.event.addListener(this.markerOptions, 'dragend', (event) => {
134
- this.latitude = event.latLng.lat();
135
- this.longitude = event.latLng.lng();
136
- this.getAddress(this.latitude, this.longitude);
137
- });
138
- }
139
- onMapClick(event) {
140
- this.latitude = event.latLng.lat();
141
- this.longitude = event.latLng.lng();
142
- this.getAddress(this.latitude, this.longitude);
143
- }
144
- setCurrentLocation() {
145
- if ('geolocation' in navigator) {
146
- navigator.geolocation.getCurrentPosition((position) => {
147
- this.latitude = position.coords.latitude;
148
- this.longitude = position.coords.longitude;
149
- this.markerPosition = { lat: this.latitude, lng: this.longitude };
150
- this.center = { lat: this.latitude, lng: this.longitude };
151
- this.zoom = 8;
152
- this.getAddress(this.latitude, this.longitude);
153
- });
154
- }
155
- }
156
- getAddress(latitude, longitude) {
157
- if (this.geoCoder) {
158
- this.geoCoder.geocode({ location: { lat: latitude, lng: longitude } }, (results, status) => {
159
- if (status === 'OK') {
160
- if (results[0]) {
161
- // this.zoom = 18;
162
- this.address = results[0].formatted_address;
163
- // VD 21DEC23 - dependent field change
164
- let change = {};
165
- // RS 09DEC24 Changed keys
166
- let addObj1 = {};
167
- addObj1['address'] = this.address;
168
- addObj1['latitude'] = latitude;
169
- addObj1['longitude'] = longitude;
170
- change['valueObj'] = addObj1;
171
- change['fromQuestionId'] = this.question.id;
172
- change['referenceField'] = this.question.referenceField;
173
- this.locationSelected.emit(change);
174
- }
175
- }
176
- });
177
- }
178
- }
179
- openMap() {
180
- this.showModal = true;
181
- if (!this.address) {
182
- this.latitude = this.longitude = null;
183
- }
184
- if (!(this.latitude && this.longitude)) {
185
- this.setCurrentLocation();
186
- }
187
- else {
188
- this.markerPosition = { lat: this.latitude, lng: this.longitude };
189
- this.center = { lat: this.latitude, lng: this.longitude };
190
- this.zoom = 8;
191
- }
192
- }
193
- closeModal() {
194
- this.showModal = false;
195
- }
196
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PickLocationComponent, deps: [{ token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
197
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PickLocationComponent, isStandalone: true, selector: "app-pick-location", inputs: { address: "address", from: "from", question: "question", mode: "mode", apiKey: "apiKey" }, outputs: { locationSelected: "locationSelected" }, viewQueries: [{ propertyName: "searchElementRef", first: true, predicate: ["search"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div>\n <nxt-input [type]=\"'location'\" [mode]=\"mode\" [value]=\"address\" [from]=\"from\"\n [labelFont]=\"question?.font\" [label]=\"question?.questionText ? ((question?.id+'.questionText') | nxtCustomTranslate : question?.questionText) : ''\" [labelColor]=\"question?.fontColor\"\n [labelSize]=\"question?.fontSize\" [inputValueSize]=\"question?.fontSize\" [labelWeight]=\"question?.fontWeight\"\n [inputWeight]=\"question?.fontWeight\" [showLabel]=\"question?.style?.showLabel\" inputBorder=\"none\" svgHeight=\"20px\"\n svgWidth=\"20px\" [placeholder]=\"question?.question\" [required]=\"question?.isOptional\" inputBgColor=\"#FAFAFA\"\n [inputId]=\"question?.trackingId\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"question?.iconLeftSrc\" (nativeInputRef)=\"setInputRef($event)\">\n </nxt-input>\n <a *ngIf=\"mode === 'edit' && !question.isReadOnly\" (click)=\"openMap()\" style=\"color:#48B7FF;position:relative;top:5px;cursor: pointer;\">\n {{ 'pickLocation' | nxtCustomTranslate : 'pickLocation' }}</a>\n</div>\n\n<div class=\"map-overlay\" *ngIf=\"showModal\">\n <div class=\"map-modal\">\n <div class=\"map-modal-content\">\n <div class=\"map-modal-header\">\n <!-- HA 19DEC23 For translation -->\n <h4>{{ 'pickYourLocation' | nxtCustomTranslate : 'pickYourLocation' }}</h4>\n <button class=\"close-button\" (click)=\"closeModal()\">X</button>\n </div>\n <google-map [zoom]=\"zoom\" [center]=\"center\" (mapClick)=\"onMapClick($event)\">\n <map-marker [position]=\"markerPosition\" [options]=\"markerOptions\"></map-marker>\n </google-map>\n </div>\n </div>\n</div>", styles: ["google-map .map-container{width:auto!important}.map-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.map-modal{width:600px;background-color:#fff;border-radius:5px;box-shadow:0 2px 4px #0003}.map-modal-header{display:flex;align-items:center;justify-content:space-between;padding:0 0 10px;background-color:#fff;border-bottom:2px solid #e5e5e5}.map-modal-header h3{margin:0}.map-modal-content{padding:20px}.close-button{border:none;cursor:pointer;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: GoogleMapsModule }, { kind: "component", type: i2.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: i2.MapMarker, selector: "map-marker", inputs: ["title", "position", "label", "clickable", "options", "icon", "visible"], outputs: ["animationChanged", "mapClick", "clickableChanged", "cursorChanged", "mapDblclick", "mapDrag", "mapDragend", "draggableChanged", "mapDragstart", "flatChanged", "iconChanged", "mapMousedown", "mapMouseout", "mapMouseover", "mapMouseup", "positionChanged", "mapRightclick", "shapeChanged", "titleChanged", "visibleChanged", "zindexChanged", "markerInitialized"], exportAs: ["mapMarker"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: NxtInput, selector: "nxt-input", inputs: ["label", "labelFont", "labelWeight", "inputWeight", "labelSize", "inputValueSize", "labelColor", "showLabel", "svgHeight", "svgWidth", "type", "inputIconRightSrc", "inputIconLeftSrc", "required", "minLength", "pattern", "errorMessages", "maxLength", "placeholder", "inputBgColor", "inputBorder", "placeholderColor", "placeholderFont", "placeholderWeight", "placeholderSize", "inputTextColor", "inputHeight", "inputWidth", "inputId", "inputBorderSize", "inputConfig", "confPassVal", "confPass", "mode", "value", "question", "showSuggestion", "ariaOwns", "ariaHasPopup", "isLoading", "options", "minDate", "maxDate", "rows", "from", "hyperLink", "size"], outputs: ["valueChange", "inputValue", "onBlur", "onFocus", "toggleEmit", "nativeInputRef", "removeValueEmit", "hyperlinkEmit"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }] });
198
- }
199
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PickLocationComponent, decorators: [{
200
- type: Component,
201
- args: [{ selector: 'app-pick-location', standalone: true, imports: [
202
- CommonModule, GoogleMapsModule, FormsModule, NxtInput, NxtCustomTranslatePipe
203
- ], template: "<div>\n <nxt-input [type]=\"'location'\" [mode]=\"mode\" [value]=\"address\" [from]=\"from\"\n [labelFont]=\"question?.font\" [label]=\"question?.questionText ? ((question?.id+'.questionText') | nxtCustomTranslate : question?.questionText) : ''\" [labelColor]=\"question?.fontColor\"\n [labelSize]=\"question?.fontSize\" [inputValueSize]=\"question?.fontSize\" [labelWeight]=\"question?.fontWeight\"\n [inputWeight]=\"question?.fontWeight\" [showLabel]=\"question?.style?.showLabel\" inputBorder=\"none\" svgHeight=\"20px\"\n svgWidth=\"20px\" [placeholder]=\"question?.question\" [required]=\"question?.isOptional\" inputBgColor=\"#FAFAFA\"\n [inputId]=\"question?.trackingId\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"question?.iconLeftSrc\" (nativeInputRef)=\"setInputRef($event)\">\n </nxt-input>\n <a *ngIf=\"mode === 'edit' && !question.isReadOnly\" (click)=\"openMap()\" style=\"color:#48B7FF;position:relative;top:5px;cursor: pointer;\">\n {{ 'pickLocation' | nxtCustomTranslate : 'pickLocation' }}</a>\n</div>\n\n<div class=\"map-overlay\" *ngIf=\"showModal\">\n <div class=\"map-modal\">\n <div class=\"map-modal-content\">\n <div class=\"map-modal-header\">\n <!-- HA 19DEC23 For translation -->\n <h4>{{ 'pickYourLocation' | nxtCustomTranslate : 'pickYourLocation' }}</h4>\n <button class=\"close-button\" (click)=\"closeModal()\">X</button>\n </div>\n <google-map [zoom]=\"zoom\" [center]=\"center\" (mapClick)=\"onMapClick($event)\">\n <map-marker [position]=\"markerPosition\" [options]=\"markerOptions\"></map-marker>\n </google-map>\n </div>\n </div>\n</div>", styles: ["google-map .map-container{width:auto!important}.map-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.map-modal{width:600px;background-color:#fff;border-radius:5px;box-shadow:0 2px 4px #0003}.map-modal-header{display:flex;align-items:center;justify-content:space-between;padding:0 0 10px;background-color:#fff;border-bottom:2px solid #e5e5e5}.map-modal-header h3{margin:0}.map-modal-content{padding:20px}.close-button{border:none;cursor:pointer;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}\n"] }]
204
- }], ctorParameters: () => [{ type: i0.NgZone }, { type: i0.ChangeDetectorRef }], propDecorators: { searchElementRef: [{
205
- type: ViewChild,
206
- args: ['search', { static: true }]
207
- }], address: [{
208
- type: Input
209
- }], from: [{
210
- type: Input
211
- }], question: [{
212
- type: Input
213
- }], mode: [{
214
- type: Input
215
- }], locationSelected: [{
216
- type: Output
217
- }], apiKey: [{
218
- type: Input
219
- }] } });
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGljay1sb2NhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9waWNrLWxvY2F0aW9uL3BpY2stbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvcGljay1sb2NhdGlvbi9waWNrLWxvY2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBOEMsTUFBTSxFQUFpQixTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFLcEssT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDNUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7QUFZMUUsTUFBTSxPQUFPLHFCQUFxQjtJQXVCdEI7SUFDQTtJQXZCVixRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ2hCLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDakIsSUFBSSxHQUFXLEVBQUUsQ0FBQztJQUNWLFFBQVEsQ0FBQztJQUNsQiwrQkFBK0I7SUFFdkIsZ0JBQWdCLENBQStCO0lBQ3RELFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDbEIsT0FBTyxDQUFRO0lBQ2YsSUFBSSxDQUFNO0lBQ2xCLHNDQUFzQztJQUM5QixRQUFRLENBQUs7SUFDYixJQUFJLEdBQThCLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQjtJQUMxRCxnQkFBZ0IsR0FB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O1FBQ1IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQzt3R0F4TVUscUJBQXFCOzRGQUFyQixxQkFBcUIsbVhDckJsQyxrcURBMEJNLDZyQkRWRixZQUFZLGtJQUFFLGdCQUFnQiw4aUNBQUUsV0FBVywrQkFBRSxRQUFRLHcwQkFBRSxzQkFBc0I7OzRGQUtwRSxxQkFBcUI7a0JBVGpDLFNBQVM7K0JBQ0UsbUJBQW1CLGNBQ2pCLElBQUksV0FDUDt3QkFDUCxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxzQkFBc0I7cUJBQzlFOzJHQVdNLGdCQUFnQjtzQkFEdEIsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUc1QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNJLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFLRSxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsQ2hhbmdlRGV0ZWN0b3JSZWYsIE5nTW9kdWxlLCBOZ1pvbmUsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLy8gSEEgMTlERUMyMyBpbXBvcnRlZCB0cmFuc2xhdGlvbiBzZXJ2aWNlXG4gLy8gVkQgMjFERUMyMyAtIGRlcGVuZGVudCBmaWVsZCBjaGFuZ2VcbmltcG9ydCB7IENoYW5nZVdyYXBwZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9jaGFuZ2VXcmFwcGVyJztcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSAnLi4vLi4vd3JhcHBlcic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgR29vZ2xlTWFwc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2dvb2dsZS1tYXBzJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTnh0SW5wdXQgfSBmcm9tICcuLi9ueHQtaW5wdXQvbnh0LWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeHRDdXN0b21UcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZS9jdXN0b20tdHJhbnNsYXRlLnBpcGUnO1xuZGVjbGFyZSB2YXIgJDogYW55O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcGljay1sb2NhdGlvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsIEdvb2dsZU1hcHNNb2R1bGUsIEZvcm1zTW9kdWxlLCBOeHRJbnB1dCwgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vcGljay1sb2NhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BpY2stbG9jYXRpb24uY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFBpY2tMb2NhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCAsT25DaGFuZ2VzIHtcbiAgbGF0aXR1ZGUgPSBudWxsO1xuICBsb25naXR1ZGUgPSBudWxsO1xuICB6b29tOiBudW1iZXIgPSAxMDtcbiAgcHJpdmF0ZSBnZW9Db2RlcjtcbiAvLyBwdWJsaWMgZm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHB1YmxpYyBzZWFyY2hFbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBzaG93TW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYWRkcmVzczpzdHJpbmc7XG4gIEBJbnB1dCgpIGZyb206IGFueTtcbiAgIC8vIFZEIDIxREVDMjMgLSBkZXBlbmRlbnQgZmllbGQgY2hhbmdlXG4gIEBJbnB1dCgpIHF1ZXN0aW9uOiBhbnlcbiAgQElucHV0KCkgbW9kZTogJ3ZpZXcnIHwgJ2VkaXQnIHwgJ3ByaW50JyA9ICdlZGl0JzsgLy8gTmV3IG1vZGUgaW5wdXRcbiAgQE91dHB1dCgpIGxvY2F0aW9uU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxDaGFuZ2VXcmFwcGVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhbmdlV3JhcHBlcj4oKTtcbiAgbmF2aWdhdG9yR2VvbG9jYXRpb246IGFueTtcbiAgbWFya2VyUG9zaXRpb246IHsgbGF0OiBhbnk7IGxuZzogYW55OyB9O1xuICBjZW50ZXI6IHsgbGF0OiBhbnk7IGxuZzogYW55OyB9O1xuICBtYXJrZXJPcHRpb25zOmFueTtcbiAgQElucHV0KCkgYXBpS2V5OiBhbnk7IC8vIEhBMTAwMTIwMjQgZGVjbGFyZWQgQXBpIGtleSB0byBzcmNcblxuICBjb25zdHJ1Y3RvcihcbiAgIC8vIHByaXZhdGUgbWFwc0FQSUxvYWRlcjogTWFwc0FQSUxvYWRlcixcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gSEEtMTEtMDEtMjAyNCBDaGFuZ2VkIHRoZSBtYXAgQ2FsbCBmcm9tIGNvbnN0cnVjdG9yIHRvIG5nT25Jbml0IGFzIGl0IHdhcyBnaXZpbmcgdW5kZWZpbmVkIHZhbHVlcyBpbiB0aGUgb3V0c291cmNlZFxuICAgIGlmKHRoaXMuYXBpS2V5KXtcbiAgICAgIHRoaXMubG9hZEdvb2dsZU1hcHNTY3JpcHQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5nZW9Db2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuICAgICAgICB0aGlzLm1hcmtlck9wdGlvbnMgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyICh7XG4gICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgICAgIGFuaW1hdGlvbjogZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkRST1BcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5pdEF1dG9jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLm9uTWFya2VyRHJhZ0VuZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4vLyBSUyAyM0pBTjIwMjVcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydtb2RlJ10pIHtcbiAgICAgIHRoaXMubW9kZSA9IGNoYW5nZXNbJ21vZGUnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydhZGRyZXNzJ10gJiYgY2hhbmdlc1snYWRkcmVzcyddLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlc1snYWRkcmVzcyddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIC8vIEVuc3VyZSBsYXRpdHVkZSAmIGxvbmdpdHVkZSB1cGRhdGUgd2hlbiB0aGUgYWRkcmVzcyBjaGFuZ2VzXG4gICAgICBpZiAodGhpcy5hZGRyZXNzKSB7XG4gICAgICAgIHRoaXMuZ2VvQ29kZXIuZ2VvY29kZSh7IGFkZHJlc3M6IHRoaXMuYWRkcmVzcyB9LCAocmVzdWx0cywgc3RhdHVzKSA9PiB7XG4gICAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ09LJyAmJiByZXN1bHRzWzBdPy5nZW9tZXRyeT8ubG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMubGF0aXR1ZGUgPSByZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uLmxhdCgpO1xuICAgICAgICAgICAgdGhpcy5sb25naXR1ZGUgPSByZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uLmxuZygpO1xuICAgICAgICAgICAgdGhpcy5tYXJrZXJQb3NpdGlvbiA9IHsgbGF0OiB0aGlzLmxhdGl0dWRlLCBsbmc6IHRoaXMubG9uZ2l0dWRlIH07XG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IHsgbGF0OiB0aGlzLmxhdGl0dWRlLCBsbmc6IHRoaXMubG9uZ2l0dWRlIH07XG4gICAgICAgICAgICB0aGlzLnpvb20gPSAxODtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgIC8vIEZvcmNlIEFuZ3VsYXIgdG8gdXBkYXRlIHRoZSBVSVxuXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlc2V0IGlmIG5vIGFkZHJlc3MgaXMgcHJvdmlkZWRcbiAgICAgICAgdGhpcy5sYXRpdHVkZSA9IG51bGw7XG4gICAgICAgIHRoaXMubG9uZ2l0dWRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5tYXJrZXJQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuY2VudGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpOyAgLy8gRk9SQ0UgVUkgVVBEQVRFXG5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRJbnB1dFJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4pIHtcbiAgICB0aGlzLnNlYXJjaEVsZW1lbnRSZWYgPSByZWY7XG4gICAgdGhpcy5pbml0QXV0b2NvbXBsZXRlKCk7IC8vIFNLUzExSlVOMjUgTm93IHRoYXQgaW5wdXQgcmVmIGlzIHJlYWR5LCBpbml0aWFsaXplIGF1dG9jb21wbGV0ZVxuICB9XG5cblxuXG4gIC8vIEhBMDkwMTIwMjQgaXMgdG8gYXZvaWQgZ29vZ2xlIGlzIHVuZGVmaW5lZCBlcnJvclxuICBwcml2YXRlIGxvYWRHb29nbGVNYXBzU2NyaXB0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgLy8gSEExMDAxMjAyNCBBc3NpZ25lZCBBcGkga2V5IHRvIHNyY1xuICAgIHNjcmlwdC5zcmMgPSBgaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT0ke3RoaXMuYXBpS2V5fSZsaWJyYXJpZXM9Z2VvbWV0cnkscGxhY2VzYDtcbiAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG4gICAgICBzY3JpcHQub25lcnJvciA9IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgaW5pdEF1dG9jb21wbGV0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZW9Db2Rlcikge1xuICAgICAgY29uc3QgYXV0b2NvbXBsZXRlID0gbmV3IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGUodGhpcy5zZWFyY2hFbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAgIHR5cGVzOiBbXVxuICAgICAgfSk7XG4gICAgICBhdXRvY29tcGxldGUuYWRkTGlzdGVuZXIoJ3BsYWNlX2NoYW5nZWQnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGxhY2U6IGdvb2dsZS5tYXBzLnBsYWNlcy5QbGFjZVJlc3VsdCA9IGF1dG9jb21wbGV0ZS5nZXRQbGFjZSgpO1xuXG4gICAgICAgICAgaWYgKHBsYWNlLmdlb21ldHJ5ID09PSB1bmRlZmluZWQgfHwgcGxhY2UuZ2VvbWV0cnkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sYXRpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxhdCgpO1xuICAgICAgICAgIHRoaXMubG9uZ2l0dWRlID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubG5nKCk7XG4gICAgICAgICAgdGhpcy56b29tID0gMTg7XG4gICAgICAgICAgdGhpcy5hZGRyZXNzID0gcGxhY2UuZm9ybWF0dGVkX2FkZHJlc3M7XG4gICAgICAgICAgLy8gVkQgMjFERUMyMyAtIGRlcGVuZGVudCBmaWVsZCBjaGFuZ2VcbiAgICAgICAgICBsZXQgY2hhbmdlOiBhbnkgPXt9O1xuICAgICAgICAgIC8vIFJTIDA5REVDMjQgQ2hhbmdlZCBrZXlzXG4gICAgICAgICAgY2hhbmdlWydmcm9tUXVlc3Rpb25JZCddID0gdGhpcy5xdWVzdGlvbi5pZDtcbiAgICAgICAgICBsZXQgYWRkT2JqID0ge307XG4gICAgICAgICAgYWRkT2JqWydhZGRyZXNzJ10gPSB0aGlzLmFkZHJlc3M7XG4gICAgICAgICAgYWRkT2JqWydsYXRpdHVkZSddID0gdGhpcy5sYXRpdHVkZTtcbiAgICAgICAgICBhZGRPYmpbJ2xvbmdpdHVkZSddID0gdGhpcy5sb25naXR1ZGU7XG4gICAgICAgICAgY2hhbmdlWyd2YWx1ZU9iaiddID0gYWRkT2JqO1xuICAgICAgICAgIGNoYW5nZVsncmVmZXJlbmNlRmllbGQnXSA9IHRoaXMucXVlc3Rpb24ucmVmZXJlbmNlRmllbGQ7XG4gICAgICAgICB0aGlzLmxvY2F0aW9uU2VsZWN0ZWQuZW1pdChjaGFuZ2UpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uTWFya2VyRHJhZ0VuZCgpOiB2b2lkIHtcbiAgICBnb29nbGUubWFwcy5ldmVudC5hZGRMaXN0ZW5lcih0aGlzLm1hcmtlck9wdGlvbnMsICdkcmFnZW5kJywgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLmxhdGl0dWRlID0gZXZlbnQubGF0TG5nLmxhdCgpO1xuICAgICAgdGhpcy5sb25naXR1ZGUgPSBldmVudC5sYXRMbmcubG5nKCk7XG4gICAgICB0aGlzLmdldEFkZHJlc3ModGhpcy5sYXRpdHVkZSwgdGhpcy5sb25naXR1ZGUpO1xuICB9KTtcbiAgfVxuXG4gIG9uTWFwQ2xpY2soZXZlbnQ6IGdvb2dsZS5tYXBzLk1hcE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmxhdGl0dWRlID0gZXZlbnQubGF0TG5nLmxhdCgpO1xuICAgIHRoaXMubG9uZ2l0dWRlID0gZXZlbnQubGF0TG5nLmxuZygpO1xuICAgIHRoaXMuZ2V0QWRkcmVzcyh0aGlzLmxhdGl0dWRlLCB0aGlzLmxvbmdpdHVkZSk7XG4gIH1cblxuXG4gIHByaXZhdGUgc2V0Q3VycmVudExvY2F0aW9uKCkge1xuICAgIGlmICgnZ2VvbG9jYXRpb24nIGluIG5hdmlnYXRvcikge1xuICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigocG9zaXRpb24pID0+IHtcbiAgICAgICAgdGhpcy5sYXRpdHVkZSA9IHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZTtcbiAgICAgICAgdGhpcy5sb25naXR1ZGUgPSBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlO1xuICAgICAgICB0aGlzLm1hcmtlclBvc2l0aW9uID0geyBsYXQ6IHRoaXMubGF0aXR1ZGUsIGxuZzogdGhpcy5sb25naXR1ZGUgfTtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSB7IGxhdDogdGhpcy5sYXRpdHVkZSwgbG5nOiB0aGlzLmxvbmdpdHVkZSB9O1xuICAgICAgICB0aGlzLnpvb20gPSA4O1xuICAgICAgICB0aGlzLmdldEFkZHJlc3ModGhpcy5sYXRpdHVkZSwgdGhpcy5sb25naXR1ZGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cblxuICBnZXRBZGRyZXNzKGxhdGl0dWRlOiBudW1iZXIsIGxvbmdpdHVkZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZ2VvQ29kZXIpIHtcbiAgICAgIHRoaXMuZ2VvQ29kZXIuZ2VvY29kZSh7IGxvY2F0aW9uOiB7IGxhdDogbGF0aXR1ZGUsIGxuZzogbG9uZ2l0dWRlIH0gfSwgKHJlc3VsdHMsIHN0YXR1cykgPT4ge1xuICAgICAgICBpZiAoc3RhdHVzID09PSAnT0snKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdHNbMF0pIHtcbiAgICAgICAgICAgLy8gdGhpcy56b29tID0gMTg7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3MgPSByZXN1bHRzWzBdLmZvcm1hdHRlZF9hZGRyZXNzO1xuICAgICAgICAgICAgIC8vIFZEIDIxREVDMjMgLSBkZXBlbmRlbnQgZmllbGQgY2hhbmdlXG4gICAgICAgICAgICBsZXQgY2hhbmdlOiBhbnkgPXt9O1xuICAgICAgICAgICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcbiAgICAgICAgICAgIGxldCBhZGRPYmoxID0ge307XG4gICAgICAgICAgICBhZGRPYmoxWydhZGRyZXNzJ10gPSB0aGlzLmFkZHJlc3M7XG4gICAgICAgICAgICBhZGRPYmoxWydsYXRpdHVkZSddID0gbGF0aXR1ZGU7XG4gICAgICAgICAgICBhZGRPYmoxWydsb25naXR1ZGUnXSA9IGxvbmdpdHVkZTtcbiAgICAgICAgICAgIGNoYW5nZVsndmFsdWVPYmonXSA9IGFkZE9iajE7XG4gICAgICAgICAgICBjaGFuZ2VbJ2Zyb21RdWVzdGlvbklkJ10gPSB0aGlzLnF1ZXN0aW9uLmlkO1xuICAgICAgICAgICAgY2hhbmdlWydyZWZlcmVuY2VGaWVsZCddID0gdGhpcy5xdWVzdGlvbi5yZWZlcmVuY2VGaWVsZDtcbiAgICAgICAgICAgIHRoaXMubG9jYXRpb25TZWxlY3RlZC5lbWl0KGNoYW5nZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvcGVuTWFwKCkge1xuICAgIHRoaXMuc2hvd01vZGFsID0gdHJ1ZTtcbiAgICBpZighdGhpcy5hZGRyZXNzKXtcbiAgICAgIHRoaXMubGF0aXR1ZGUgPSB0aGlzLmxvbmdpdHVkZSA9IG51bGw7XG4gICAgfVxuICAgIGlmICghKHRoaXMubGF0aXR1ZGUgJiYgdGhpcy5sb25naXR1ZGUpKSB7XG4gICAgICB0aGlzLnNldEN1cnJlbnRMb2NhdGlvbigpO1xuICAgIH1lbHNle1xuICAgICAgdGhpcy5tYXJrZXJQb3NpdGlvbiA9IHsgbGF0OiB0aGlzLmxhdGl0dWRlLCBsbmc6IHRoaXMubG9uZ2l0dWRlIH07XG4gICAgICB0aGlzLmNlbnRlciA9IHsgbGF0OiB0aGlzLmxhdGl0dWRlLCBsbmc6IHRoaXMubG9uZ2l0dWRlIH07XG4gICAgICB0aGlzLnpvb20gPSA4O1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlTW9kYWwoKSB7XG4gICAgdGhpcy5zaG93TW9kYWwgPSBmYWxzZTtcbiAgfVxufVxuXG4iLCI8ZGl2PlxuICA8bnh0LWlucHV0IFt0eXBlXT1cIidsb2NhdGlvbidcIiBbbW9kZV09XCJtb2RlXCIgW3ZhbHVlXT1cImFkZHJlc3NcIiBbZnJvbV09XCJmcm9tXCJcbiAgICBbbGFiZWxGb250XT1cInF1ZXN0aW9uPy5mb250XCIgW2xhYmVsXT1cInF1ZXN0aW9uPy5xdWVzdGlvblRleHQgPyAoKHF1ZXN0aW9uPy5pZCsnLnF1ZXN0aW9uVGV4dCcpIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcXVlc3Rpb24/LnF1ZXN0aW9uVGV4dCkgOiAnJ1wiIFtsYWJlbENvbG9yXT1cInF1ZXN0aW9uPy5mb250Q29sb3JcIlxuICAgIFtsYWJlbFNpemVdPVwicXVlc3Rpb24/LmZvbnRTaXplXCIgW2lucHV0VmFsdWVTaXplXT1cInF1ZXN0aW9uPy5mb250U2l6ZVwiIFtsYWJlbFdlaWdodF09XCJxdWVzdGlvbj8uZm9udFdlaWdodFwiXG4gICAgW2lucHV0V2VpZ2h0XT1cInF1ZXN0aW9uPy5mb250V2VpZ2h0XCIgW3Nob3dMYWJlbF09XCJxdWVzdGlvbj8uc3R5bGU/LnNob3dMYWJlbFwiIGlucHV0Qm9yZGVyPVwibm9uZVwiIHN2Z0hlaWdodD1cIjIwcHhcIlxuICAgIHN2Z1dpZHRoPVwiMjBweFwiIFtwbGFjZWhvbGRlcl09XCJxdWVzdGlvbj8ucXVlc3Rpb25cIiBbcmVxdWlyZWRdPVwicXVlc3Rpb24/LmlzT3B0aW9uYWxcIiBpbnB1dEJnQ29sb3I9XCIjRkFGQUZBXCJcbiAgICBbaW5wdXRJZF09XCJxdWVzdGlvbj8udHJhY2tpbmdJZFwiIFtlcnJvck1lc3NhZ2VzXT1cInsgcmVxdWlyZWQ6ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkJyB9XCJcbiAgICBbaW5wdXRJY29uTGVmdFNyY109XCJxdWVzdGlvbj8uaWNvbkxlZnRTcmNcIiAobmF0aXZlSW5wdXRSZWYpPVwic2V0SW5wdXRSZWYoJGV2ZW50KVwiPlxuICA8L254dC1pbnB1dD5cbiAgPGEgKm5nSWY9XCJtb2RlID09PSAnZWRpdCcgJiYgIXF1ZXN0aW9uLmlzUmVhZE9ubHlcIiAoY2xpY2spPVwib3Blbk1hcCgpXCIgc3R5bGU9XCJjb2xvcjojNDhCN0ZGO3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDo1cHg7Y3Vyc29yOiBwb2ludGVyO1wiPlxuICAgIHt7ICdwaWNrTG9jYXRpb24nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ3BpY2tMb2NhdGlvbicgfX08L2E+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cIm1hcC1vdmVybGF5XCIgKm5nSWY9XCJzaG93TW9kYWxcIj5cbiAgPGRpdiBjbGFzcz1cIm1hcC1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtYXAtbW9kYWwtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hcC1tb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgPCEtLSBIQSAxOURFQzIzIEZvciB0cmFuc2xhdGlvbiAtLT5cbiAgICAgICAgPGg0Pnt7ICdwaWNrWW91ckxvY2F0aW9uJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdwaWNrWW91ckxvY2F0aW9uJyB9fTwvaDQ+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIiAoY2xpY2spPVwiY2xvc2VNb2RhbCgpXCI+WDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8Z29vZ2xlLW1hcCBbem9vbV09XCJ6b29tXCIgW2NlbnRlcl09XCJjZW50ZXJcIiAobWFwQ2xpY2spPVwib25NYXBDbGljaygkZXZlbnQpXCI+XG4gICAgICAgIDxtYXAtbWFya2VyIFtwb3NpdGlvbl09XCJtYXJrZXJQb3NpdGlvblwiIFtvcHRpb25zXT1cIm1hcmtlck9wdGlvbnNcIj48L21hcC1tYXJrZXI+XG4gICAgICA8L2dvb2dsZS1tYXA+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19