@smarterplan/ngx-smarterplan-core 0.3.11
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.
- package/README.md +24 -0
- package/esm2020/lib/components/csv-export/csv-export.component.mjs +59 -0
- package/esm2020/lib/components/loader/loader.component.mjs +14 -0
- package/esm2020/lib/components/menu-bar/avatar/avatar.component.mjs +75 -0
- package/esm2020/lib/components/menu-bar/menu-bar.component.mjs +115 -0
- package/esm2020/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +254 -0
- package/esm2020/lib/components/menu-bar/range-date-picker/range-date-picker.component.mjs +81 -0
- package/esm2020/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +39 -0
- package/esm2020/lib/components/search-bar/search-bar.component.mjs +63 -0
- package/esm2020/lib/components/support-modal/support-modal.component.mjs +59 -0
- package/esm2020/lib/config.mjs +4 -0
- package/esm2020/lib/helpers.service.mjs +468 -0
- package/esm2020/lib/mattertagData.mjs +177 -0
- package/esm2020/lib/ngx-smarterplan-core.module.mjs +117 -0
- package/esm2020/lib/ngx-smarterplan-core.service.mjs +14 -0
- package/esm2020/lib/pipes/duration-to-string.pipe.mjs +66 -0
- package/esm2020/lib/pipes/hashtag-from-id.pipe.mjs +26 -0
- package/esm2020/lib/pipes/safe-url.pipe.mjs +20 -0
- package/esm2020/lib/pipes/time-date-to-local-string.pipe.mjs +104 -0
- package/esm2020/lib/pipes/username-from-id.pipe.mjs +29 -0
- package/esm2020/lib/services/base-tab.service.mjs +24 -0
- package/esm2020/lib/services/baseVisibility.service.mjs +17 -0
- package/esm2020/lib/services/booking.service.mjs +161 -0
- package/esm2020/lib/services/content.service.mjs +135 -0
- package/esm2020/lib/services/filter.service.mjs +560 -0
- package/esm2020/lib/services/intervention.service.mjs +236 -0
- package/esm2020/lib/services/locale.service.mjs +45 -0
- package/esm2020/lib/services/matterport-import.service.mjs +339 -0
- package/esm2020/lib/services/matterport.service.mjs +876 -0
- package/esm2020/lib/services/models/affectation.service.mjs +60 -0
- package/esm2020/lib/services/models/base-object.service.mjs +70 -0
- package/esm2020/lib/services/models/capture.service.mjs +34 -0
- package/esm2020/lib/services/models/comment.service.mjs +98 -0
- package/esm2020/lib/services/models/domain.service.mjs +77 -0
- package/esm2020/lib/services/models/equipment.service.mjs +629 -0
- package/esm2020/lib/services/models/event.service.mjs +128 -0
- package/esm2020/lib/services/models/feature.service.mjs +339 -0
- package/esm2020/lib/services/models/hashtag.service.mjs +38 -0
- package/esm2020/lib/services/models/layer.service.mjs +33 -0
- package/esm2020/lib/services/models/measurement.service.mjs +158 -0
- package/esm2020/lib/services/models/mission.service.mjs +185 -0
- package/esm2020/lib/services/models/navigation.service.mjs +76 -0
- package/esm2020/lib/services/models/node.service.mjs +31 -0
- package/esm2020/lib/services/models/operation.service.mjs +59 -0
- package/esm2020/lib/services/models/organisation.service.mjs +73 -0
- package/esm2020/lib/services/models/plan.service.mjs +573 -0
- package/esm2020/lib/services/models/poi.service.mjs +48 -0
- package/esm2020/lib/services/models/profile.service.mjs +54 -0
- package/esm2020/lib/services/models/property.service.mjs +34 -0
- package/esm2020/lib/services/models/space.service.mjs +184 -0
- package/esm2020/lib/services/models/template.service.mjs +41 -0
- package/esm2020/lib/services/models/ticket.service.mjs +454 -0
- package/esm2020/lib/services/models/visit.service.mjs +130 -0
- package/esm2020/lib/services/models/zone.service.mjs +184 -0
- package/esm2020/lib/services/navigator.service.mjs +165 -0
- package/esm2020/lib/services/s3.service.mjs +124 -0
- package/esm2020/lib/services/search.service.mjs +124 -0
- package/esm2020/lib/services/support.service.mjs +42 -0
- package/esm2020/lib/services/tag.service.mjs +101 -0
- package/esm2020/lib/services/user.service.mjs +444 -0
- package/esm2020/lib/services/viewer.service.mjs +395 -0
- package/esm2020/lib/services/zone-drawer.service.mjs +76 -0
- package/esm2020/lib/types.service.mjs +266 -0
- package/esm2020/public-api.mjs +63 -0
- package/esm2020/smarterplan-ngx-smarterplan-core.mjs +5 -0
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs +10057 -0
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -0
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +9371 -0
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs.map +1 -0
- package/lib/components/csv-export/csv-export.component.d.ts +18 -0
- package/lib/components/loader/loader.component.d.ts +8 -0
- package/lib/components/menu-bar/avatar/avatar.component.d.ts +18 -0
- package/lib/components/menu-bar/menu-bar.component.d.ts +35 -0
- package/lib/components/menu-bar/navigation-bar/navigation-bar.component.d.ts +66 -0
- package/lib/components/menu-bar/range-date-picker/range-date-picker.component.d.ts +24 -0
- package/lib/components/modal-switch-visit/modal-switch-visit.component.d.ts +22 -0
- package/lib/components/search-bar/search-bar.component.d.ts +16 -0
- package/lib/components/support-modal/support-modal.component.d.ts +24 -0
- package/lib/config.d.ts +17 -0
- package/lib/helpers.service.d.ts +79 -0
- package/lib/mattertagData.d.ts +65 -0
- package/lib/ngx-smarterplan-core.module.d.ts +28 -0
- package/lib/ngx-smarterplan-core.service.d.ts +6 -0
- package/lib/pipes/duration-to-string.pipe.d.ts +12 -0
- package/lib/pipes/hashtag-from-id.pipe.d.ts +10 -0
- package/lib/pipes/safe-url.pipe.d.ts +10 -0
- package/lib/pipes/time-date-to-local-string.pipe.d.ts +16 -0
- package/lib/pipes/username-from-id.pipe.d.ts +11 -0
- package/lib/services/base-tab.service.d.ts +10 -0
- package/lib/services/baseVisibility.service.d.ts +8 -0
- package/lib/services/booking.service.d.ts +21 -0
- package/lib/services/content.service.d.ts +28 -0
- package/lib/services/filter.service.d.ts +58 -0
- package/lib/services/intervention.service.d.ts +25 -0
- package/lib/services/locale.service.d.ts +23 -0
- package/lib/services/matterport-import.service.d.ts +46 -0
- package/lib/services/matterport.service.d.ts +141 -0
- package/lib/services/models/affectation.service.d.ts +14 -0
- package/lib/services/models/base-object.service.d.ts +20 -0
- package/lib/services/models/capture.service.d.ts +13 -0
- package/lib/services/models/comment.service.d.ts +26 -0
- package/lib/services/models/domain.service.d.ts +19 -0
- package/lib/services/models/equipment.service.d.ts +88 -0
- package/lib/services/models/event.service.d.ts +43 -0
- package/lib/services/models/feature.service.d.ts +71 -0
- package/lib/services/models/hashtag.service.d.ts +13 -0
- package/lib/services/models/layer.service.d.ts +11 -0
- package/lib/services/models/measurement.service.d.ts +43 -0
- package/lib/services/models/mission.service.d.ts +32 -0
- package/lib/services/models/navigation.service.d.ts +22 -0
- package/lib/services/models/node.service.d.ts +12 -0
- package/lib/services/models/operation.service.d.ts +15 -0
- package/lib/services/models/organisation.service.d.ts +19 -0
- package/lib/services/models/plan.service.d.ts +117 -0
- package/lib/services/models/poi.service.d.ts +15 -0
- package/lib/services/models/profile.service.d.ts +15 -0
- package/lib/services/models/property.service.d.ts +13 -0
- package/lib/services/models/space.service.d.ts +38 -0
- package/lib/services/models/template.service.d.ts +15 -0
- package/lib/services/models/ticket.service.d.ts +86 -0
- package/lib/services/models/visit.service.d.ts +24 -0
- package/lib/services/models/zone.service.d.ts +25 -0
- package/lib/services/navigator.service.d.ts +55 -0
- package/lib/services/s3.service.d.ts +13 -0
- package/lib/services/search.service.d.ts +20 -0
- package/lib/services/support.service.d.ts +17 -0
- package/lib/services/tag.service.d.ts +45 -0
- package/lib/services/user.service.d.ts +104 -0
- package/lib/services/viewer.service.d.ts +113 -0
- package/lib/services/zone-drawer.service.d.ts +7 -0
- package/lib/types.service.d.ts +723 -0
- package/package.json +41 -0
- package/public-api.d.ts +56 -0
- package/smarterplan-ngx-smarterplan-core.d.ts +5 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { Validators } from "@angular/forms";
|
|
3
|
+
import { Auth } from "aws-amplify";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../../services/support.service";
|
|
6
|
+
import * as i2 from "@ng-bootstrap/ng-bootstrap";
|
|
7
|
+
import * as i3 from "@angular/forms";
|
|
8
|
+
import * as i4 from "../../services/user.service";
|
|
9
|
+
import * as i5 from "../loader/loader.component";
|
|
10
|
+
import * as i6 from "@ngx-translate/core";
|
|
11
|
+
import * as i7 from "@angular/common";
|
|
12
|
+
export class SupportModalComponent {
|
|
13
|
+
constructor(supportService, activeModal, formBuilder, userService) {
|
|
14
|
+
this.supportService = supportService;
|
|
15
|
+
this.activeModal = activeModal;
|
|
16
|
+
this.formBuilder = formBuilder;
|
|
17
|
+
this.userService = userService;
|
|
18
|
+
this.status = 'new';
|
|
19
|
+
this.loading = true;
|
|
20
|
+
}
|
|
21
|
+
ngOnInit() {
|
|
22
|
+
this.iniForm();
|
|
23
|
+
}
|
|
24
|
+
onClose() {
|
|
25
|
+
this.activeModal.close();
|
|
26
|
+
}
|
|
27
|
+
async getCurrentUser() {
|
|
28
|
+
return new Promise(async (resolve) => {
|
|
29
|
+
try {
|
|
30
|
+
const cau = await Auth.currentAuthenticatedUser();
|
|
31
|
+
resolve(await this.userService.current(cau));
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
resolve(undefined);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async iniForm() {
|
|
39
|
+
this.currentUser = await this.getCurrentUser();
|
|
40
|
+
this.supportForm = this.formBuilder.group({
|
|
41
|
+
description: ['', [Validators.required]],
|
|
42
|
+
title: ['', [Validators.required]],
|
|
43
|
+
email: [(this.currentUser ? this.currentUser.email : ''), [Validators.required, Validators.email]]
|
|
44
|
+
});
|
|
45
|
+
this.loading = false;
|
|
46
|
+
}
|
|
47
|
+
async onSubmit() {
|
|
48
|
+
this.loading = true;
|
|
49
|
+
this.status = await this.supportService.sendSupport(this.supportForm.value);
|
|
50
|
+
this.loading = false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
SupportModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SupportModalComponent, deps: [{ token: i1.SupportService }, { token: i2.NgbActiveModal }, { token: i3.FormBuilder }, { token: i4.BaseUserService }], target: i0.ɵɵFactoryTarget.Component });
|
|
54
|
+
SupportModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SupportModalComponent, selector: "app-support-modal", ngImport: i0, template: "<div class=\"modal-header\">\r\n <h5 class=\"modal-title\" translate=\"Help\"></h5>\r\n <!-- <button (click)=\"onClose()\" type=\"button\" class=\"btn rounded-pill btn-museum\" data-dismiss=\"modal\" aria-label=\"Close\" [title]=\"'Close'|translate\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button> -->\r\n</div>\r\n<div class=\"modal-body\">\r\n <div class=\"support-loader-container\">\r\n <lib-loader *ngIf=\"loading\"></lib-loader>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"supportForm\" style=\"margin-top:1rem;\" *ngIf=\"!loading && status==='new'\">\r\n <div>\r\n <label>{{'Title' | translate}} *</label>\r\n <div>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" data-testid=\"new-support-title\">\r\n </div>\r\n </div>\r\n <div *ngIf=\"!currentUser\">\r\n <label>{{'Email' | translate}} *</label>\r\n <div>\r\n <input type=\"email\" class=\"form-control\" formControlName=\"email\" data-testid=\"new-support-email\">\r\n </div>\r\n </div>\r\n <div>\r\n <label>{{'Description' | translate}} *</label>\r\n <div>\r\n <textarea id=\"comment-text\" name=\"comment\" formControlName=\"description\" class=\"form-control\"\r\n data-testid=\"new-support-comment\"></textarea>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div *ngIf=\"status ==='send'\" translate=\"Your request has been registered\" data-testid=\"new-support-send-info\">\r\n </div>\r\n <div *ngIf=\"status ==='error'\" translate=\"An error has occurred, please renew your request\" data-testid=\"new-support-error-info\">\r\n\r\n </div>\r\n</div>\r\n<div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn rounded-pill btn-museum\" data-dismiss=\"modal\" translate=\"Close\" (click)=\"onClose()\"\r\n data-testid=\"new-support-close-btn\"></button>\r\n <button *ngIf=\"!loading && status==='new'\" type=\"button\" class=\"btn rounded-pill btn-museum\" translate=\"Submit\"\r\n (click)=\"onSubmit()\" [disabled]=\"!supportForm.valid\" data-testid=\"new-support-submit-btn\"></button>\r\n</div>", styles: [".support-loader-container{width:88px;margin:auto}\n"], components: [{ type: i5.LoaderComponent, selector: "lib-loader" }], directives: [{ type: i6.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], pipes: { "translate": i6.TranslatePipe } });
|
|
55
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SupportModalComponent, decorators: [{
|
|
56
|
+
type: Component,
|
|
57
|
+
args: [{ selector: 'app-support-modal', template: "<div class=\"modal-header\">\r\n <h5 class=\"modal-title\" translate=\"Help\"></h5>\r\n <!-- <button (click)=\"onClose()\" type=\"button\" class=\"btn rounded-pill btn-museum\" data-dismiss=\"modal\" aria-label=\"Close\" [title]=\"'Close'|translate\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button> -->\r\n</div>\r\n<div class=\"modal-body\">\r\n <div class=\"support-loader-container\">\r\n <lib-loader *ngIf=\"loading\"></lib-loader>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"supportForm\" style=\"margin-top:1rem;\" *ngIf=\"!loading && status==='new'\">\r\n <div>\r\n <label>{{'Title' | translate}} *</label>\r\n <div>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" data-testid=\"new-support-title\">\r\n </div>\r\n </div>\r\n <div *ngIf=\"!currentUser\">\r\n <label>{{'Email' | translate}} *</label>\r\n <div>\r\n <input type=\"email\" class=\"form-control\" formControlName=\"email\" data-testid=\"new-support-email\">\r\n </div>\r\n </div>\r\n <div>\r\n <label>{{'Description' | translate}} *</label>\r\n <div>\r\n <textarea id=\"comment-text\" name=\"comment\" formControlName=\"description\" class=\"form-control\"\r\n data-testid=\"new-support-comment\"></textarea>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div *ngIf=\"status ==='send'\" translate=\"Your request has been registered\" data-testid=\"new-support-send-info\">\r\n </div>\r\n <div *ngIf=\"status ==='error'\" translate=\"An error has occurred, please renew your request\" data-testid=\"new-support-error-info\">\r\n\r\n </div>\r\n</div>\r\n<div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn rounded-pill btn-museum\" data-dismiss=\"modal\" translate=\"Close\" (click)=\"onClose()\"\r\n data-testid=\"new-support-close-btn\"></button>\r\n <button *ngIf=\"!loading && status==='new'\" type=\"button\" class=\"btn rounded-pill btn-museum\" translate=\"Submit\"\r\n (click)=\"onSubmit()\" [disabled]=\"!supportForm.valid\" data-testid=\"new-support-submit-btn\"></button>\r\n</div>", styles: [".support-loader-container{width:88px;margin:auto}\n"] }]
|
|
58
|
+
}], ctorParameters: function () { return [{ type: i1.SupportService }, { type: i2.NgbActiveModal }, { type: i3.FormBuilder }, { type: i4.BaseUserService }]; } });
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcG9ydC1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc3VwcG9ydC1tb2RhbC9zdXBwb3J0LW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9zdXBwb3J0LW1vZGFsL3N1cHBvcnQtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUVsRCxPQUFPLEVBQTBCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7Ozs7OztBQVFuQyxNQUFNLE9BQU8scUJBQXFCO0lBU2hDLFlBQ1UsY0FBOEIsRUFDL0IsV0FBMkIsRUFDMUIsV0FBd0IsRUFDeEIsV0FBNEI7UUFINUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQy9CLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMxQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFadEMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQU1mLFlBQU8sR0FBWSxJQUFJLENBQUM7SUFPcEIsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYztRQUNsQixPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUNuQyxJQUFJO2dCQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7Z0JBQ2xELE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDOUM7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDZCxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDcEI7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTztRQUNYLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUN4QyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkcsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQzs7a0hBakRVLHFCQUFxQjtzR0FBckIscUJBQXFCLHlEQ1psQyw4dkVBMkNNOzJGRC9CTyxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQmFzZVVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aCB9IGZyb20gXCJhd3MtYW1wbGlmeVwiO1xyXG5pbXBvcnQgeyBTdXBwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N1cHBvcnQuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1zdXBwb3J0LW1vZGFsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3VwcG9ydC1tb2RhbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3VwcG9ydC1tb2RhbC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdXBwb3J0TW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHN0YXR1cyA9ICduZXcnO1xyXG5cclxuICBzdXBwb3J0Rm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBjdXJyZW50VXNlcjogYW55O1xyXG5cclxuICBsb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHN1cHBvcnRTZXJ2aWNlOiBTdXBwb3J0U2VydmljZSxcclxuICAgIHB1YmxpYyBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgb25DbG9zZSgpIHtcclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldEN1cnJlbnRVc2VyKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBjYXUgPSBhd2FpdCBBdXRoLmN1cnJlbnRBdXRoZW50aWNhdGVkVXNlcigpO1xyXG4gICAgICAgIHJlc29sdmUoYXdhaXQgdGhpcy51c2VyU2VydmljZS5jdXJyZW50KGNhdSkpO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGFzeW5jIGluaUZvcm0oKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXNlcigpO1xyXG4gICAgdGhpcy5zdXBwb3J0Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBkZXNjcmlwdGlvbjogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICB0aXRsZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBlbWFpbDogWyh0aGlzLmN1cnJlbnRVc2VyID8gdGhpcy5jdXJyZW50VXNlci5lbWFpbCA6ICcnKSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdXVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICB9XHJcbiAgXHJcbiAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGF0dXMgPSBhd2FpdCB0aGlzLnN1cHBvcnRTZXJ2aWNlLnNlbmRTdXBwb3J0KHRoaXMuc3VwcG9ydEZvcm0udmFsdWUpO1xyXG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxufSIsIjxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgdHJhbnNsYXRlPVwiSGVscFwiPjwvaDU+XHJcbiAgICA8IS0tIDxidXR0b24gKGNsaWNrKT1cIm9uQ2xvc2UoKVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biByb3VuZGVkLXBpbGwgYnRuLW11c2V1bVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgW3RpdGxlXT1cIidDbG9zZSd8dHJhbnNsYXRlXCI+XHJcbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPiAtLT5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic3VwcG9ydC1sb2FkZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGxpYi1sb2FkZXIgKm5nSWY9XCJsb2FkaW5nXCI+PC9saWItbG9hZGVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiIFtmb3JtR3JvdXBdPVwic3VwcG9ydEZvcm1cIiBzdHlsZT1cIm1hcmdpbi10b3A6MXJlbTtcIiAqbmdJZj1cIiFsb2FkaW5nICYmIHN0YXR1cz09PSduZXcnXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGxhYmVsPnt7J1RpdGxlJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIGRhdGEtdGVzdGlkPVwibmV3LXN1cHBvcnQtdGl0bGVcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiFjdXJyZW50VXNlclwiPlxyXG4gICAgICAgICAgICA8bGFiZWw+e3snRW1haWwnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiIGRhdGEtdGVzdGlkPVwibmV3LXN1cHBvcnQtZW1haWxcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGxhYmVsPnt7J0Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiY29tbWVudC10ZXh0XCIgbmFtZT1cImNvbW1lbnRcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cIm5ldy1zdXBwb3J0LWNvbW1lbnRcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZm9ybT5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwic3RhdHVzID09PSdzZW5kJ1wiIHRyYW5zbGF0ZT1cIllvdXIgcmVxdWVzdCBoYXMgYmVlbiByZWdpc3RlcmVkXCIgZGF0YS10ZXN0aWQ9XCJuZXctc3VwcG9ydC1zZW5kLWluZm9cIj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cInN0YXR1cyA9PT0nZXJyb3InXCIgdHJhbnNsYXRlPVwiQW4gZXJyb3IgaGFzIG9jY3VycmVkLCBwbGVhc2UgcmVuZXcgeW91ciByZXF1ZXN0XCIgZGF0YS10ZXN0aWQ9XCJuZXctc3VwcG9ydC1lcnJvci1pbmZvXCI+XHJcblxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biByb3VuZGVkLXBpbGwgYnRuLW11c2V1bVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgdHJhbnNsYXRlPVwiQ2xvc2VcIiAoY2xpY2spPVwib25DbG9zZSgpXCJcclxuICAgICAgICBkYXRhLXRlc3RpZD1cIm5ldy1zdXBwb3J0LWNsb3NlLWJ0blwiPjwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiAqbmdJZj1cIiFsb2FkaW5nICYmIHN0YXR1cz09PSduZXcnXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIHJvdW5kZWQtcGlsbCBidG4tbXVzZXVtXCIgdHJhbnNsYXRlPVwiU3VibWl0XCJcclxuICAgICAgICAoY2xpY2spPVwib25TdWJtaXQoKVwiIFtkaXNhYmxlZF09XCIhc3VwcG9ydEZvcm0udmFsaWRcIiBkYXRhLXRlc3RpZD1cIm5ldy1zdXBwb3J0LXN1Ym1pdC1idG5cIj48L2J1dHRvbj5cclxuPC9kaXY+Il19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export class Config {
|
|
2
|
+
constructor() { }
|
|
3
|
+
}
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsTUFBTSxPQUFPLE1BQU07SUFlZixnQkFBZ0IsQ0FBQztDQUNwQiIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5leHBvcnQgY2xhc3MgQ29uZmlnIHtcclxuICAgIG15X2NvbmZpZzogeyBcclxuICAgICAgICBpY29uX3RpY2tldDogc3RyaW5nOyBcclxuICAgICAgICBpY29uX2VxdWlwbWVudDogc3RyaW5nO1xyXG4gICAgICAgIGljb25fbWVhc3VyZTogc3RyaW5nO1xyXG4gICAgICAgIGljb25fZGF0YTogc3RyaW5nO1xyXG4gICAgICAgIGljb25fcG9zaXRpb246IHN0cmluZztcclxuICAgICAgICBNQVhfQ0hBUkFDVEVSX0RFU0NSSVBUSU9OX1RBRzogbnVtYmVyO1xyXG4gICAgICAgIERFRkFVTFRfSEVJR0hUX0hUTUxfVEFHOiBudW1iZXI7XHJcbiAgICAgICAgREVGQVVMVF9PUEFDSVRZX1RBRzogbnVtYmVyO1xyXG4gICAgICAgIENPTERfTElNSVQ6IG51bWJlcjtcclxuICAgICAgICBIT1RfTElNSVQ6IG51bWJlcjtcclxuICAgICAgICBERUZBVUxUX1dJRFRIX0hUTUxfVEFHOiBudW1iZXI7XHJcbiAgICAgICAgTUFYX0lNQUdFX0hFSUdIVF9IVE1MX1RBRzogbnVtYmVyfTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
import { ModalSwitchVisitComponent } from "./components/modal-switch-visit/modal-switch-visit.component";
|
|
2
|
+
import { downloadFileAsObject } from "./services/s3.service";
|
|
3
|
+
import { LevelStatus, Locale, PoiType, RoleStatus } from "./types.service";
|
|
4
|
+
export function getDistanceBetweenTwoPoints(startPoint, endPoint) {
|
|
5
|
+
const dx = endPoint.x - startPoint.x;
|
|
6
|
+
const dy = endPoint.y - startPoint.y;
|
|
7
|
+
const dz = endPoint.z - startPoint.z;
|
|
8
|
+
const distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
9
|
+
return Math.round(distance * 100) / 100;
|
|
10
|
+
}
|
|
11
|
+
export function poiTypeToString(type) {
|
|
12
|
+
switch (type) {
|
|
13
|
+
case PoiType.EQUIPMENT:
|
|
14
|
+
return "equipment";
|
|
15
|
+
case PoiType.TICKET:
|
|
16
|
+
return "ticket";
|
|
17
|
+
case PoiType.DATA:
|
|
18
|
+
return "data";
|
|
19
|
+
case PoiType.DESK:
|
|
20
|
+
return "data";
|
|
21
|
+
case PoiType.INFORMATION:
|
|
22
|
+
return "information";
|
|
23
|
+
case PoiType.MEASURE:
|
|
24
|
+
return "measure";
|
|
25
|
+
case PoiType.PEOPLE:
|
|
26
|
+
return "people";
|
|
27
|
+
default:
|
|
28
|
+
return "ticket";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function wait(timeout) {
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
timeout = timeout || 2000;
|
|
34
|
+
setTimeout(() => {
|
|
35
|
+
resolve();
|
|
36
|
+
}, timeout);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export const waitUntil = (condition) => {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
const intervalId = setInterval(() => {
|
|
42
|
+
if (condition()) {
|
|
43
|
+
clearInterval(intervalId);
|
|
44
|
+
resolve();
|
|
45
|
+
}
|
|
46
|
+
}, 30);
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
export function enumToArray(enumerable) {
|
|
50
|
+
return Object.keys(enumerable)
|
|
51
|
+
.filter((value) => isNaN(Number(value)) === true)
|
|
52
|
+
.map((key) => enumerable[key]);
|
|
53
|
+
}
|
|
54
|
+
export function getLevelsBelow(level) {
|
|
55
|
+
const all = [
|
|
56
|
+
LevelStatus.MINIMUM,
|
|
57
|
+
LevelStatus.LOW,
|
|
58
|
+
LevelStatus.MEDIUM,
|
|
59
|
+
LevelStatus.HIGH,
|
|
60
|
+
LevelStatus.MAXIMUM,
|
|
61
|
+
];
|
|
62
|
+
switch (level) {
|
|
63
|
+
case LevelStatus.MAXIMUM:
|
|
64
|
+
return all;
|
|
65
|
+
case LevelStatus.HIGH:
|
|
66
|
+
all.splice(4, 1);
|
|
67
|
+
return all;
|
|
68
|
+
case LevelStatus.MEDIUM:
|
|
69
|
+
all.splice(3, 2);
|
|
70
|
+
return all;
|
|
71
|
+
case LevelStatus.LOW:
|
|
72
|
+
return [LevelStatus.MINIMUM, LevelStatus.LOW];
|
|
73
|
+
case LevelStatus.MINIMUM:
|
|
74
|
+
return [LevelStatus.MINIMUM];
|
|
75
|
+
default:
|
|
76
|
+
return [LevelStatus.MINIMUM];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export function getHighestLevelForMissions(missions) {
|
|
80
|
+
let latestVisibleLevels = [LevelStatus.MINIMUM];
|
|
81
|
+
for (const m of missions) {
|
|
82
|
+
const visibleLevels = getLevelsBelow(m.level);
|
|
83
|
+
if (visibleLevels.length > latestVisibleLevels.length) {
|
|
84
|
+
latestVisibleLevels = visibleLevels;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
switch (latestVisibleLevels.length) {
|
|
88
|
+
case 1:
|
|
89
|
+
return LevelStatus.MINIMUM;
|
|
90
|
+
case 2:
|
|
91
|
+
return LevelStatus.LOW;
|
|
92
|
+
case 3:
|
|
93
|
+
return LevelStatus.MEDIUM;
|
|
94
|
+
case 4:
|
|
95
|
+
return LevelStatus.HIGH;
|
|
96
|
+
case 5:
|
|
97
|
+
return LevelStatus.MAXIMUM;
|
|
98
|
+
default:
|
|
99
|
+
return LevelStatus.MINIMUM;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export function getHighestRoleForMissions(missions) {
|
|
103
|
+
let highestRole = RoleStatus.VISITOR;
|
|
104
|
+
for (const m of missions) {
|
|
105
|
+
if (m.role === RoleStatus.ADMIN) {
|
|
106
|
+
return RoleStatus.ADMIN;
|
|
107
|
+
}
|
|
108
|
+
if (highestRole === RoleStatus.OWNER) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (m.role === RoleStatus.OWNER) {
|
|
112
|
+
highestRole = RoleStatus.OWNER;
|
|
113
|
+
}
|
|
114
|
+
if (m.role === RoleStatus.MANAGER) {
|
|
115
|
+
highestRole = RoleStatus.MANAGER;
|
|
116
|
+
}
|
|
117
|
+
if (m.role === RoleStatus.SERVICE &&
|
|
118
|
+
highestRole !== RoleStatus.MANAGER) {
|
|
119
|
+
highestRole = RoleStatus.SERVICE;
|
|
120
|
+
}
|
|
121
|
+
if (m.role === RoleStatus.OCCUPANT &&
|
|
122
|
+
highestRole === RoleStatus.VISITOR) {
|
|
123
|
+
highestRole = RoleStatus.OCCUPANT;
|
|
124
|
+
}
|
|
125
|
+
if (m.role === RoleStatus.GUIDE_MUSEUM) {
|
|
126
|
+
highestRole = RoleStatus.GUIDE_MUSEUM;
|
|
127
|
+
}
|
|
128
|
+
if (m.role === RoleStatus.VISITOR_MUSEUM) {
|
|
129
|
+
highestRole = RoleStatus.VISITOR_MUSEUM;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return highestRole;
|
|
133
|
+
}
|
|
134
|
+
export function getRolesBelowForManager(role) {
|
|
135
|
+
const all = [
|
|
136
|
+
RoleStatus.VISITOR,
|
|
137
|
+
RoleStatus.OCCUPANT,
|
|
138
|
+
RoleStatus.SERVICE,
|
|
139
|
+
RoleStatus.MANAGER,
|
|
140
|
+
RoleStatus.OWNER,
|
|
141
|
+
RoleStatus.ADMIN,
|
|
142
|
+
];
|
|
143
|
+
const museum = [RoleStatus.VISITOR_MUSEUM, RoleStatus.GUIDE_MUSEUM];
|
|
144
|
+
switch (role) {
|
|
145
|
+
case RoleStatus.ADMIN:
|
|
146
|
+
return [...all, ...museum];
|
|
147
|
+
case RoleStatus.OWNER:
|
|
148
|
+
all.splice(5, 1);
|
|
149
|
+
return all;
|
|
150
|
+
case RoleStatus.MANAGER:
|
|
151
|
+
all.splice(4, 2);
|
|
152
|
+
return all;
|
|
153
|
+
case RoleStatus.GUIDE_MUSEUM:
|
|
154
|
+
return museum;
|
|
155
|
+
default:
|
|
156
|
+
return all.splice(4, 2);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export function filterUniqueArrayByID(arrayOfObjects) {
|
|
160
|
+
return arrayOfObjects.filter((v, index, a) => a.findIndex((t) => t.id === v.id) === index);
|
|
161
|
+
}
|
|
162
|
+
export function removeNullKeysFromObject(object) {
|
|
163
|
+
for (const key of Object.keys(object)) {
|
|
164
|
+
if (object[key] === null) {
|
|
165
|
+
delete object[key];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Test if a date has expired
|
|
171
|
+
* @param date
|
|
172
|
+
* @returns true if the date has expired, false otherwise
|
|
173
|
+
*/
|
|
174
|
+
export function dateHasExpired(date) {
|
|
175
|
+
if (date) {
|
|
176
|
+
return new Date(date) <= new Date();
|
|
177
|
+
}
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
export function stringLocaleToEnum(locale) {
|
|
181
|
+
switch (locale) {
|
|
182
|
+
case "en":
|
|
183
|
+
return Locale.EN;
|
|
184
|
+
case "fr":
|
|
185
|
+
return Locale.FR;
|
|
186
|
+
default:
|
|
187
|
+
return Locale.EN;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export function getMetaForImage(url) {
|
|
191
|
+
return new Promise((resolve, reject) => {
|
|
192
|
+
const img = new Image();
|
|
193
|
+
img.addEventListener("load", () => {
|
|
194
|
+
resolve(img);
|
|
195
|
+
});
|
|
196
|
+
img.addEventListener("error", () => reject());
|
|
197
|
+
img.src = url;
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
export function sortAlphabeticallyOnName(array) {
|
|
201
|
+
return array.sort((a, b) => a.name.localeCompare(b.name));
|
|
202
|
+
}
|
|
203
|
+
export function validEmail(email) {
|
|
204
|
+
const re = /^(([^\s"(),.:;<>@[\\\]]+(\.[^\s"(),.:;<>@[\\\]]+)*)|(".+"))@((\[(?:\d{1,3}\.){3}\d{1,3}])|(([\dA-Za-z\-]+\.)+[A-Za-z]{2,}))$/;
|
|
205
|
+
return re.test(email);
|
|
206
|
+
}
|
|
207
|
+
export function downloadBlob(blob, filename) {
|
|
208
|
+
const url = URL.createObjectURL(blob);
|
|
209
|
+
const a = document.createElement("a");
|
|
210
|
+
a.href = url;
|
|
211
|
+
a.download = filename || "download";
|
|
212
|
+
const clickHandler = () => {
|
|
213
|
+
setTimeout(() => {
|
|
214
|
+
URL.revokeObjectURL(url);
|
|
215
|
+
a.removeEventListener("click", clickHandler);
|
|
216
|
+
}, 150);
|
|
217
|
+
};
|
|
218
|
+
a.addEventListener("click", clickHandler, false);
|
|
219
|
+
a.click();
|
|
220
|
+
return a;
|
|
221
|
+
}
|
|
222
|
+
/*
|
|
223
|
+
Open modal if one has to switch virtual visit
|
|
224
|
+
*/
|
|
225
|
+
export function openModalForVisitSwitch(modalService, model3D, spaceID, dataToMove = null) {
|
|
226
|
+
const modalReference = modalService.open(ModalSwitchVisitComponent);
|
|
227
|
+
modalReference.componentInstance.content =
|
|
228
|
+
"This object belongs to another 3D visit. Are you sure you want to switch the visit?";
|
|
229
|
+
modalReference.componentInstance.model3D = model3D;
|
|
230
|
+
modalReference.componentInstance.spaceID = spaceID;
|
|
231
|
+
if (dataToMove) {
|
|
232
|
+
modalReference.componentInstance.dataToMove = dataToMove;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Return a string of a given date time in local format.
|
|
237
|
+
* The format is determined by the current language.
|
|
238
|
+
*/
|
|
239
|
+
export function dateTimeToLocalString(date, translate, mode) {
|
|
240
|
+
let lang = "en-EN";
|
|
241
|
+
if (translate) {
|
|
242
|
+
/** Get current language */
|
|
243
|
+
lang = translate.currentLang
|
|
244
|
+
? translate.currentLang
|
|
245
|
+
: translate.defaultLang;
|
|
246
|
+
/** Transforme '_fr' to 'fr' */
|
|
247
|
+
if (lang) {
|
|
248
|
+
lang = lang.slice(1);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
let options;
|
|
252
|
+
switch (mode) {
|
|
253
|
+
case "day_numeric":
|
|
254
|
+
options = { day: "numeric" };
|
|
255
|
+
break;
|
|
256
|
+
case "day":
|
|
257
|
+
options = { weekday: "long" };
|
|
258
|
+
break;
|
|
259
|
+
case "date":
|
|
260
|
+
options = { dateStyle: "long" };
|
|
261
|
+
break;
|
|
262
|
+
case "short_date_time":
|
|
263
|
+
options = {
|
|
264
|
+
year: "2-digit",
|
|
265
|
+
month: "2-digit",
|
|
266
|
+
day: "2-digit",
|
|
267
|
+
hour: "2-digit",
|
|
268
|
+
minute: "2-digit",
|
|
269
|
+
};
|
|
270
|
+
break;
|
|
271
|
+
case "time":
|
|
272
|
+
options = { hour: "numeric", minute: "numeric" };
|
|
273
|
+
break;
|
|
274
|
+
case "day_time_zone":
|
|
275
|
+
options = {
|
|
276
|
+
weekday: "long",
|
|
277
|
+
year: "numeric",
|
|
278
|
+
month: "long",
|
|
279
|
+
day: "numeric",
|
|
280
|
+
hour: "numeric",
|
|
281
|
+
minute: "numeric",
|
|
282
|
+
timeZoneName: "shortOffset",
|
|
283
|
+
};
|
|
284
|
+
break;
|
|
285
|
+
default:
|
|
286
|
+
options = {
|
|
287
|
+
dateStyle: "long",
|
|
288
|
+
timeStyle: "short",
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
return new Date(date).toLocaleString(lang, options);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Compares two string arrays
|
|
295
|
+
* @param array1
|
|
296
|
+
* @param array2
|
|
297
|
+
* @returns
|
|
298
|
+
*/
|
|
299
|
+
export function arraysContainSameElements(array1, array2) {
|
|
300
|
+
return JSON.stringify(array1) === JSON.stringify(array2);
|
|
301
|
+
}
|
|
302
|
+
export function getVisitUrl(currentUrl) {
|
|
303
|
+
const path = currentUrl.split("/");
|
|
304
|
+
path.splice(3, path.length - 2);
|
|
305
|
+
return path.join("/");
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Extract spaceID from url when in visit 3D
|
|
309
|
+
*/
|
|
310
|
+
export function getSpaceIDFromUrl(url) {
|
|
311
|
+
const visitUrl = getVisitUrl(url);
|
|
312
|
+
return visitUrl.split("/")[2];
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Download related
|
|
316
|
+
*/
|
|
317
|
+
import FileSaver from "file-saver";
|
|
318
|
+
export function downloadFile(fileUrl, fileName) {
|
|
319
|
+
FileSaver.saveAs(fileUrl + fileName, fileName);
|
|
320
|
+
}
|
|
321
|
+
export function openDocument(fileUrl, fileName, id) {
|
|
322
|
+
window.open(`${fileUrl + fileName}#doc=${id}`, "_blank", "");
|
|
323
|
+
}
|
|
324
|
+
export const downloadEquipmentDocument = async (document_) => {
|
|
325
|
+
const signedFile = await downloadFileAsObject(document_.url);
|
|
326
|
+
if (signedFile) {
|
|
327
|
+
// @ts-ignore
|
|
328
|
+
downloadBlob(signedFile.Body, document_.filename);
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
export async function checkElementById(selector) {
|
|
332
|
+
let querySelector = null;
|
|
333
|
+
while (querySelector === null) {
|
|
334
|
+
await rafAsync();
|
|
335
|
+
querySelector = document.getElementById(selector);
|
|
336
|
+
}
|
|
337
|
+
return querySelector;
|
|
338
|
+
}
|
|
339
|
+
function rafAsync() {
|
|
340
|
+
return new Promise((resolve) => {
|
|
341
|
+
requestAnimationFrame(resolve); // faster than set time out
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
/* @param {Array} numbers An array of numbers.
|
|
345
|
+
* @return {Number} The calculated average (or mean) value from the specified
|
|
346
|
+
* numbers.
|
|
347
|
+
*/
|
|
348
|
+
export function mean(numbers) {
|
|
349
|
+
let total = 0;
|
|
350
|
+
for (const number of numbers) {
|
|
351
|
+
total += number;
|
|
352
|
+
}
|
|
353
|
+
return total / numbers.length;
|
|
354
|
+
}
|
|
355
|
+
export function convertTimestampToLocalZone(timestamp) {
|
|
356
|
+
const selectedDate = new Date(timestamp);
|
|
357
|
+
const localOffset = -1 * selectedDate.getTimezoneOffset() * 60000;
|
|
358
|
+
const stamp = timestamp + localOffset;
|
|
359
|
+
return stamp;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Return string for period of time. Parameters are DateTime objects of luxon library.
|
|
363
|
+
*/
|
|
364
|
+
export function translateDatePeriod(translateService, dateStartPeriod, dateEndPeriod) {
|
|
365
|
+
const locale = getLocaleLong(translateService);
|
|
366
|
+
return `${dateStartPeriod.toLocaleString({
|
|
367
|
+
locale,
|
|
368
|
+
month: "long",
|
|
369
|
+
day: "2-digit",
|
|
370
|
+
})} - ${dateEndPeriod.toLocaleString({
|
|
371
|
+
locale,
|
|
372
|
+
month: "long",
|
|
373
|
+
day: "2-digit",
|
|
374
|
+
})} `;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Return local in the canonical form: "en-GB", "fr-FR"
|
|
378
|
+
*/
|
|
379
|
+
export function getLocaleLong(translate) {
|
|
380
|
+
let lang = translate.currentLang
|
|
381
|
+
? translate.currentLang
|
|
382
|
+
: translate.defaultLang;
|
|
383
|
+
/** Transform '_fr' to 'fr' */
|
|
384
|
+
lang = lang.slice(1);
|
|
385
|
+
if (lang === "en") {
|
|
386
|
+
return "en-GB";
|
|
387
|
+
}
|
|
388
|
+
return `${lang}-${lang.toUpperCase()}`;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Return local in the short form: "en", "fr"
|
|
392
|
+
*/
|
|
393
|
+
export function getLocaleShort(translate) {
|
|
394
|
+
let lang = translate.currentLang
|
|
395
|
+
? translate.currentLang
|
|
396
|
+
: translate.defaultLang;
|
|
397
|
+
/** Transform '_fr' to 'fr' */
|
|
398
|
+
lang = lang.slice(1);
|
|
399
|
+
return lang;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Format string to lowercase, no spaces
|
|
403
|
+
*/
|
|
404
|
+
export function stringToLowercaseNoSpaces(input) {
|
|
405
|
+
const words = input.toLowerCase().split(/\s+/);
|
|
406
|
+
return words.join("");
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Test if the object === {}
|
|
410
|
+
* @param obj object {key:value}
|
|
411
|
+
* @returns boolean
|
|
412
|
+
*/
|
|
413
|
+
export function isEmptyObject(object) {
|
|
414
|
+
for (const x in object) {
|
|
415
|
+
return false;
|
|
416
|
+
}
|
|
417
|
+
return true;
|
|
418
|
+
}
|
|
419
|
+
export function shuffleArray(array) {
|
|
420
|
+
const newArray = [...array];
|
|
421
|
+
for (let index = array.length - 1; index > 0; index--) {
|
|
422
|
+
const indexNew = Math.floor(Math.random() * (index + 1));
|
|
423
|
+
// eslint-disable-next-line no-param-reassign
|
|
424
|
+
[newArray[index], newArray[indexNew]] = [
|
|
425
|
+
newArray[indexNew],
|
|
426
|
+
newArray[index],
|
|
427
|
+
];
|
|
428
|
+
}
|
|
429
|
+
return newArray;
|
|
430
|
+
}
|
|
431
|
+
export function numberToDateString(timestamp) {
|
|
432
|
+
const jsDate = new Date(timestamp);
|
|
433
|
+
return jsDate.toLocaleString("fr-FR");
|
|
434
|
+
}
|
|
435
|
+
export function durationToString(duration, translate) {
|
|
436
|
+
const days = Math.floor(duration / 3600 / 24);
|
|
437
|
+
const hours = Math.floor((duration - days * 24 * 3600) / 3600);
|
|
438
|
+
const minutes = Math.floor((duration % 3600) / 60);
|
|
439
|
+
const seconds = Math.floor(duration % 60);
|
|
440
|
+
const daysString = translate.instant("day(s)");
|
|
441
|
+
const hoursString = translate.instant("hour(s)");
|
|
442
|
+
const oneHourString = translate.instant("hour");
|
|
443
|
+
const minutesString = translate.instant("minute(s)");
|
|
444
|
+
const secondsString = translate.instant("second(s)");
|
|
445
|
+
if (duration > 3600 * 24 * 7) {
|
|
446
|
+
return `${days} ${daysString}`;
|
|
447
|
+
}
|
|
448
|
+
if (duration > 3600 * 24) {
|
|
449
|
+
return `${days} ${daysString} ${hours} ${hoursString}`;
|
|
450
|
+
}
|
|
451
|
+
if (duration === 3600) {
|
|
452
|
+
return `${hours} ${oneHourString}`;
|
|
453
|
+
}
|
|
454
|
+
if (duration > 3600) {
|
|
455
|
+
if (minutes === 0) {
|
|
456
|
+
return `${hours} ${hoursString}`;
|
|
457
|
+
}
|
|
458
|
+
return `${hours} ${hoursString} ${minutes} ${minutesString}`;
|
|
459
|
+
}
|
|
460
|
+
if (duration >= 60) {
|
|
461
|
+
if (seconds === 0) {
|
|
462
|
+
return `${minutes} ${minutesString}`;
|
|
463
|
+
}
|
|
464
|
+
return `${minutes} ${minutesString} ${seconds} ${secondsString}`;
|
|
465
|
+
}
|
|
466
|
+
return `${seconds} ${secondsString}`;
|
|
467
|
+
}
|
|
468
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9oZWxwZXJzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDekcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFxQixXQUFXLEVBQUUsTUFBTSxFQUFXLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV2RyxNQUFNLFVBQVUsMkJBQTJCLENBQUMsVUFBVSxFQUFFLFFBQVE7SUFDNUQsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNyQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDckMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQWE7SUFDekMsUUFBUSxJQUFJLEVBQUU7UUFDVixLQUFLLE9BQU8sQ0FBQyxTQUFTO1lBQ2xCLE9BQU8sV0FBVyxDQUFDO1FBQ3ZCLEtBQUssT0FBTyxDQUFDLE1BQU07WUFDZixPQUFPLFFBQVEsQ0FBQztRQUNwQixLQUFLLE9BQU8sQ0FBQyxJ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QUUsR0FBRyxDQUFDLEVBQUU7UUFDMUIsT0FBTyxHQUFHLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztLQUNsQztJQUNELElBQUksUUFBUSxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUU7UUFDdEIsT0FBTyxHQUFHLElBQUksSUFBSSxVQUFVLElBQUksS0FBSyxJQUFJLFdBQVcsRUFBRSxDQUFDO0tBQzFEO0lBQ0QsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO1FBQ25CLE9BQU8sR0FBRyxLQUFLLElBQUksYUFBYSxFQUFFLENBQUM7S0FDdEM7SUFDRCxJQUFJLFFBQVEsR0FBRyxJQUFJLEVBQUU7UUFDakIsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO1lBQ2YsT0FBTyxHQUFHLEtBQUssSUFBSSxXQUFXLEVBQUUsQ0FBQztTQUNwQztRQUNELE9BQU8sR0FBRyxLQUFLLElBQUksV0FBVyxJQUFJLE9BQU8sSUFBSSxhQUFhLEVBQUUsQ0FBQztLQUNoRTtJQUNELElBQUksUUFBUSxJQUFJLEVBQUUsRUFBRTtRQUNoQixJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUU7WUFDZixPQUFPLEdBQUcsT0FBTyxJQUFJLGFBQWEsRUFBRSxDQUFDO1NBQ3hDO1FBQ0QsT0FBTyxHQUFHLE9BQU8sSUFBSSxhQUFhLElBQUksT0FBTyxJQUFJLGFBQWEsRUFBRSxDQUFDO0tBQ3BFO0lBQ0QsT0FBTyxHQUFHLE9BQU8sSUFBSSxhQUFhLEVBQUUsQ0FBQztBQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7IE1vZGFsU3dpdGNoVmlzaXRDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL21vZGFsLXN3aXRjaC12aXNpdC9tb2RhbC1zd2l0Y2gtdmlzaXQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IGRvd25sb2FkRmlsZUFzT2JqZWN0IH0gZnJvbSBcIi4vc2VydmljZXMvczMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBFcXVpcG1lbnREb2N1bWVudCwgTGV2ZWxTdGF0dXMsIExvY2FsZSwgTWlzc2lvbiwgUG9pVHlwZSwgUm9sZVN0YXR1cyB9IGZyb20gXCIuL3R5cGVzLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREaXN0YW5jZUJldHdlZW5Ud29Qb2ludHMoc3RhcnRQb2ludCwgZW5kUG9pbnQpIHtcclxuICAgIGNvbnN0IGR4ID0gZW5kUG9pbnQueCAtIHN0YXJ0UG9pbnQueDtcclxuICAgIGNvbnN0IGR5ID0gZW5kUG9pbnQueSAtIHN0YXJ0UG9pbnQueTtcclxuICAgIGNvbnN0IGR6ID0gZW5kUG9pbnQueiAtIHN0YXJ0UG9pbnQuejtcclxuICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkeik7XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChkaXN0YW5jZSAqIDEwMCkgLyAxMDA7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwb2lUeXBlVG9TdHJpbmcodHlwZTogUG9pVHlwZSk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICBjYXNlIFBvaVR5cGUuRVFVSVBNRU5UOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJlcXVpcG1lbnRcIjtcclxuICAgICAgICBjYXNlIFBvaVR5cGUuVElDS0VUOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJ0aWNrZXRcIjtcclxuICAgICAgICBjYXNlIFBvaVR5cGUuREFUQTpcclxuICAgICAgICAgICAgcmV0dXJuIFwiZGF0YVwiO1xyXG4gICAgICAgIGNhc2UgUG9pVHlwZS5ERVNLOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJkYXRhXCI7XHJcbiAgICAgICAgY2FzZSBQb2lUeXBlLklORk9STUFUSU9OOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJpbmZvcm1hdGlvblwiO1xyXG4gICAgICAgIGNhc2UgUG9pVHlwZS5NRUFTVVJFOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJtZWFzdXJlXCI7XHJcbiAgICAgICAgY2FzZSBQb2lUeXBlLlBFT1BMRTpcclxuICAgICAgICAgICAgcmV0dXJuIFwicGVvcGxlXCI7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIFwidGlja2V0XCI7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB3YWl0KHRpbWVvdXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgfHwgMjAwMDtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0sIHRpbWVvdXQpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCB3YWl0VW50aWwgPSAoY29uZGl0aW9uOiAoKSA9PiBib29sZWFuKSA9PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb25kaXRpb24oKSkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDMwKTtcclxuICAgIH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGVudW1Ub0FycmF5KGVudW1lcmFibGU6IGFueSkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGVudW1lcmFibGUpXHJcbiAgICAgICAgLmZpbHRlcigodmFsdWUpID0+IGlzTmFOKE51bWJlcih2YWx1ZSkpID09PSB0cnVlKVxyXG4gICAgICAgIC5tYXAoKGtleSkgPT4gZW51bWVyYWJsZVtrZXldKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExldmVsc0JlbG93KGxldmVsOiBMZXZlbFN0YXR1cyk6IExldmVsU3RhdHVzW10ge1xyXG4gICAgY29uc3QgYWxsID0gW1xyXG4gICAgICAgIExldmVsU3RhdHVzLk1JTklNVU0sXHJcbiAgICAgICAgTGV2ZWxTdGF0dXMuTE9XLFxyXG4gICAgICAgIExldmVsU3RhdHVzLk1FRElVTSxcclxuICAgICAgICBMZXZlbFN0YXR1cy5ISUdILFxyXG4gICAgICAgIExldmVsU3RhdHVzLk1BWElNVU0sXHJcbiAgICBdO1xyXG4gICAgc3dpdGNoIChsZXZlbCkge1xyXG4gICAgICAgIGNhc2UgTGV2ZWxTdGF0dXMuTUFYSU1VTTpcclxuICAgICAgICAgICAgcmV0dXJuIGFsbDtcclxuICAgICAgICBjYXNlIExldmVsU3RhdHVzLkhJR0g6XHJcbiAgICAgICAgICAgIGFsbC5zcGxpY2UoNCwgMSk7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGw7XHJcbiAgICAgICAgY2FzZSBMZXZlbFN0YXR1cy5NRURJVU06XHJcbiAgICAgICAgICAgIGFsbC5zcGxpY2UoMywgMik7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGw7XHJcbiAgICAgICAgY2FzZSBMZXZlbFN0YXR1cy5MT1c6XHJcbiAgICAgICAgICAgIHJldHVybiBbTGV2ZWxTdGF0dXMuTUlOSU1VTSwgTGV2ZWxTdGF0dXMuTE9XXTtcclxuICAgICAgICBjYXNlIExldmVsU3RhdHVzLk1JTklNVU06XHJcbiAgICAgICAgICAgIHJldHVybiBbTGV2ZWxTdGF0dXMuTUlOSU1VTV07XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIFtMZXZlbFN0YXR1cy5NSU5JTVVNXTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhpZ2hlc3RMZXZlbEZvck1pc3Npb25zKG1pc3Npb25zOiBNaXNzaW9uW10pOiBMZXZlbFN0YXR1cyB7XHJcbiAgICBsZXQgbGF0ZXN0VmlzaWJsZUxldmVscyA9IFtMZXZlbFN0YXR1cy5NSU5JTVVNXTtcclxuICAgIGZvciAoY29uc3QgbSBvZiBtaXNzaW9ucykge1xyXG4gICAgICAgIGNvbnN0IHZpc2libGVMZXZlbHMgPSBnZXRMZXZlbHNCZWxvdyhtLmxldmVsKTtcclxuICAgICAgICBpZiAodmlzaWJsZUxldmVscy5sZW5ndGggPiBsYXRlc3RWaXNpYmxlTGV2ZWxzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsYXRlc3RWaXNpYmxlTGV2ZWxzID0gdmlzaWJsZUxldmVscztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKGxhdGVzdFZpc2libGVMZXZlbHMubGVuZ3RoKSB7XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICByZXR1cm4gTGV2ZWxTdGF0dXMuTUlOSU1VTTtcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgIHJldHVybiBMZXZlbFN0YXR1cy5MT1c7XHJcbiAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICByZXR1cm4gTGV2ZWxTdGF0dXMuTUVESVVNO1xyXG4gICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgcmV0dXJuIExldmVsU3RhdHVzLkhJR0g7XHJcbiAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgICByZXR1cm4gTGV2ZWxTdGF0dXMuTUFYSU1VTTtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4gTGV2ZWxTdGF0dXMuTUlOSU1VTTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhpZ2hlc3RSb2xlRm9yTWlzc2lvbnMobWlzc2lvbnM6IE1pc3Npb25bXSk6IFJvbGVTdGF0dXMge1xyXG4gICAgbGV0IGhpZ2hlc3RSb2xlID0gUm9sZVN0YXR1cy5WSVNJVE9SO1xyXG4gICAgZm9yIChjb25zdCBtIG9mIG1pc3Npb25zKSB7XHJcbiAgICAgICAgaWYgKG0ucm9sZSA9PT0gUm9sZVN0YXR1cy5BRE1JTikge1xyXG4gICAgICAgICAgICByZXR1cm4gUm9sZVN0YXR1cy5BRE1JTjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGhpZ2hlc3RSb2xlID09PSBSb2xlU3RhdHVzLk9XTkVSKSB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobS5yb2xlID09PSBSb2xlU3RhdHVzLk9XTkVSKSB7XHJcbiAgICAgICAgICAgIGhpZ2hlc3RSb2xlID0gUm9sZVN0YXR1cy5PV05FUjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG0ucm9sZSA9PT0gUm9sZVN0YXR1cy5NQU5BR0VSKSB7XHJcbiAgICAgICAgICAgIGhpZ2hlc3RSb2xlID0gUm9sZVN0YXR1cy5NQU5BR0VSO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIG0ucm9sZSA9PT0gUm9sZVN0YXR1cy5TRVJWSUNFICYmXHJcbiAgICAgICAgICAgIGhpZ2hlc3RSb2xlICE9PSBSb2xlU3RhdHVzLk1BTkFHRVJcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgaGlnaGVzdFJvbGUgPSBSb2xlU3RhdHVzLlNFUlZJQ0U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgbS5yb2xlID09PSBSb2xlU3RhdHVzLk9DQ1VQQU5UICYmXHJcbiAgICAgICAgICAgIGhpZ2hlc3RSb2xlID09PSBSb2xlU3RhdHVzLlZJU0lUT1JcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgaGlnaGVzdFJvbGUgPSBSb2xlU3RhdHVzLk9DQ1VQQU5UO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobS5yb2xlID09PSBSb2xlU3RhdHVzLkdVSURFX01VU0VVTSkge1xyXG4gICAgICAgICAgICBoaWdoZXN0Um9sZSA9IFJvbGVTdGF0dXMuR1VJREVfTVVTRVVNO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobS5yb2xlID09PSBSb2xlU3RhdHVzLlZJU0lUT1JfTVVTRVVNKSB7XHJcbiAgICAgICAgICAgIGhpZ2hlc3RSb2xlID0gUm9sZVN0YXR1cy5WSVNJVE9SX01VU0VVTTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaGlnaGVzdFJvbGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRSb2xlc0JlbG93Rm9yTWFuYWdlcihyb2xlOiBSb2xlU3RhdHVzKTogUm9sZVN0YXR1c1tdIHtcclxuICAgIGNvbnN0IGFsbCA9IFtcclxuICAgICAgICBSb2xlU3RhdHVzLlZJU0lUT1IsXHJcbiAgICAgICAgUm9sZVN0YXR1cy5PQ0NVUEFOVCxcclxuICAgICAgICBSb2xlU3RhdHVzLlNFUlZJQ0UsXHJcbiAgICAgICAgUm9sZVN0YXR1cy5NQU5BR0VSLFxyXG4gICAgICAgIFJvbGVTdGF0dXMuT1dORVIsXHJcbiAgICAgICAgUm9sZVN0YXR1cy5BRE1JTixcclxuICAgIF07XHJcbiAgICBjb25zdCBtdXNldW0gPSBbUm9sZVN0YXR1cy5WSVNJVE9SX01VU0VVTSwgUm9sZVN0YXR1cy5HVUlERV9NVVNFVU1dO1xyXG4gICAgc3dpdGNoIChyb2xlKSB7XHJcbiAgICAgICAgY2FzZSBSb2xlU3RhdHVzLkFETUlOOlxyXG4gICAgICAgICAgICByZXR1cm4gWy4uLmFsbCwgLi4ubXVzZXVtXTtcclxuICAgICAgICBjYXNlIFJvbGVTdGF0dXMuT1dORVI6XHJcbiAgICAgICAgICAgIGFsbC5zcGxpY2UoNSwgMSk7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGw7XHJcbiAgICAgICAgY2FzZSBSb2xlU3RhdHVzLk1BTkFHRVI6XHJcbiAgICAgICAgICAgIGFsbC5zcGxpY2UoNCwgMik7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGw7XHJcbiAgICAgICAgY2FzZSBSb2xlU3RhdHVzLkdVSURFX01VU0VVTTpcclxuICAgICAgICAgICAgcmV0dXJuIG11c2V1bTtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4gYWxsLnNwbGljZSg0LCAyKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclVuaXF1ZUFycmF5QnlJRChhcnJheU9mT2JqZWN0czogYW55W10pOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gYXJyYXlPZk9iamVjdHMuZmlsdGVyKFxyXG4gICAgICAgICh2LCBpbmRleCwgYSkgPT4gYS5maW5kSW5kZXgoKHQpID0+IHQuaWQgPT09IHYuaWQpID09PSBpbmRleCxcclxuICAgICk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOdWxsS2V5c0Zyb21PYmplY3Qob2JqZWN0OiBPYmplY3QpIHtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iamVjdCkpIHtcclxuICAgICAgICBpZiAob2JqZWN0W2tleV0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRlc3QgaWYgYSBkYXRlIGhhcyBleHBpcmVkXHJcbiAqIEBwYXJhbSBkYXRlXHJcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGRhdGUgaGFzIGV4cGlyZWQsIGZhbHNlIG90aGVyd2lzZVxyXG4gKi9cclxuIGV4cG9ydCBmdW5jdGlvbiBkYXRlSGFzRXhwaXJlZChcclxuICAgIGRhdGU6IHN0cmluZyB8IERhdGUgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4pOiBib29sZWFuIHtcclxuICAgIGlmIChkYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUpIDw9IG5ldyBEYXRlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdMb2NhbGVUb0VudW0obG9jYWxlOiBzdHJpbmcpOiBMb2NhbGUge1xyXG4gICAgc3dpdGNoIChsb2NhbGUpIHtcclxuICAgICAgICBjYXNlIFwiZW5cIjpcclxuICAgICAgICAgICAgcmV0dXJuIExvY2FsZS5FTjtcclxuICAgICAgICBjYXNlIFwiZnJcIjpcclxuICAgICAgICAgICAgcmV0dXJuIExvY2FsZS5GUjtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4gTG9jYWxlLkVOO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldE1ldGFGb3JJbWFnZSh1cmwpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZShpbWcpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKCkgPT4gcmVqZWN0KCkpO1xyXG4gICAgICAgIGltZy5zcmMgPSB1cmw7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRBbHBoYWJldGljYWxseU9uTmFtZShhcnJheTogeyBuYW1lOiBzdHJpbmcgfVtdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIGFycmF5LnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRFbWFpbChlbWFpbDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCByZSA9XHJcbiAgICAgICAgL14oKFteXFxzXCIoKSwuOjs8PkBbXFxcXFxcXV0rKFxcLlteXFxzXCIoKSwuOjs8PkBbXFxcXFxcXV0rKSopfChcIi4rXCIpKUAoKFxcWyg/OlxcZHsxLDN9XFwuKXszfVxcZHsxLDN9XSl8KChbXFxkQS1aYS16XFwtXStcXC4pK1tBLVphLXpdezIsfSkpJC87XHJcbiAgICByZXR1cm4gcmUudGVzdChlbWFpbCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEJsb2IoYmxvYiwgZmlsZW5hbWUpIHtcclxuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICBhLmhyZWYgPSB1cmw7XHJcbiAgICBhLmRvd25sb2FkID0gZmlsZW5hbWUgfHwgXCJkb3dubG9hZFwiO1xyXG4gICAgY29uc3QgY2xpY2tIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcbiAgICAgICAgICAgIGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGNsaWNrSGFuZGxlcik7XHJcbiAgICAgICAgfSwgMTUwKTtcclxuICAgIH07XHJcbiAgICBhLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBjbGlja0hhbmRsZXIsIGZhbHNlKTtcclxuICAgIGEuY2xpY2soKTtcclxuICAgIHJldHVybiBhO1xyXG59XHJcblxyXG4vKlxyXG4gICAgT3BlbiBtb2RhbCBpZiBvbmUgaGFzIHRvIHN3aXRjaCB2aXJ0dWFsIHZpc2l0XHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBvcGVuTW9kYWxGb3JWaXNpdFN3aXRjaChcclxuICAgIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICBtb2RlbDNEOiBzdHJpbmcsXHJcbiAgICBzcGFjZUlEOiBzdHJpbmcsXHJcbiAgICBkYXRhVG9Nb3ZlOiB7c3dlZXBUb01vdmU6c3RyaW5nLCByb3RhdGlvbjphbnl9IHwgbnVsbCA9IG51bGxcclxuKSB7XHJcbiAgICBjb25zdCBtb2RhbFJlZmVyZW5jZSA9IG1vZGFsU2VydmljZS5vcGVuKE1vZGFsU3dpdGNoVmlzaXRDb21wb25lbnQpO1xyXG4gICAgbW9kYWxSZWZlcmVuY2UuY29tcG9uZW50SW5zdGFuY2UuY29udGVudCA9XHJcbiAgICAgICAgXCJUaGlzIG9iamVjdCBiZWxvbmdzIHRvIGFub3RoZXIgM0QgdmlzaXQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBzd2l0Y2ggdGhlIHZpc2l0P1wiO1xyXG4gICAgbW9kYWxSZWZlcmVuY2UuY29tcG9uZW50SW5zdGFuY2UubW9kZWwzRCA9IG1vZGVsM0Q7XHJcbiAgICBtb2RhbFJlZmVyZW5jZS5jb21wb25lbnRJbnN0YW5jZS5zcGFjZUlEID0gc3BhY2VJRDtcclxuICAgIGlmIChkYXRhVG9Nb3ZlKSB7XHJcbiAgICAgICAgbW9kYWxSZWZlcmVuY2UuY29tcG9uZW50SW5zdGFuY2UuZGF0YVRvTW92ZSA9IGRhdGFUb01vdmU7XHJcbiAgICB9XHJcbiAgICBcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBhIHN0cmluZyBvZiBhIGdpdmVuIGRhdGUgdGltZSBpbiBsb2NhbCBmb3JtYXQuXHJcbiAqIFRoZSBmb3JtYXQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY3VycmVudCBsYW5ndWFnZS5cclxuICovXHJcbiBleHBvcnQgZnVuY3Rpb24gZGF0ZVRpbWVUb0xvY2FsU3RyaW5nKFxyXG4gICAgZGF0ZTogbnVtYmVyIHwgc3RyaW5nIHwgRGF0ZSxcclxuICAgIHRyYW5zbGF0ZT86IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBtb2RlPyxcclxuKTogc3RyaW5nIHtcclxuICAgIGxldCBsYW5nID0gXCJlbi1FTlwiO1xyXG4gICAgaWYgKHRyYW5zbGF0ZSkge1xyXG4gICAgICAgIC8qKiBHZXQgY3VycmVudCBsYW5ndWFnZSAqL1xyXG4gICAgICAgIGxhbmcgPSB0cmFuc2xhdGUuY3VycmVudExhbmdcclxuICAgICAgICAgICAgPyB0cmFuc2xhdGUuY3VycmVudExhbmdcclxuICAgICAgICAgICAgOiB0cmFuc2xhdGUuZGVmYXVsdExhbmc7XHJcbiAgICAgICAgLyoqIFRyYW5zZm9ybWUgJ19mcicgdG8gJ2ZyJyAqL1xyXG4gICAgICAgIGlmIChsYW5nKSB7XHJcbiAgICAgICAgICAgIGxhbmcgPSBsYW5nLnNsaWNlKDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGxldCBvcHRpb25zOiB7XHJcbiAgICAgICAgbW9udGg/O1xyXG4gICAgICAgIHllYXI/O1xyXG4gICAgICAgIGRheT87XHJcbiAgICAgICAgaG91cj87XHJcbiAgICAgICAgbWludXRlPztcclxuICAgICAgICBzZWNvbmQ/O1xyXG4gICAgICAgIGRhdGVTdHlsZT87XHJcbiAgICAgICAgdGltZVN0eWxlPztcclxuICAgICAgICB3ZWVrZGF5PztcclxuICAgICAgICB0aW1lWm9uZT87XHJcbiAgICAgICAgdGltZVpvbmVOYW1lPztcclxuICAgIH07XHJcbiAgICBzd2l0Y2ggKG1vZGUpIHtcclxuICAgICAgICBjYXNlIFwiZGF5X251bWVyaWNcIjpcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHsgZGF5OiBcIm51bWVyaWNcIiB9O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiZGF5XCI6XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7IHdlZWtkYXk6IFwibG9uZ1wiIH07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJkYXRlXCI6XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7IGRhdGVTdHlsZTogXCJsb25nXCIgfTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcInNob3J0X2RhdGVfdGltZVwiOlxyXG4gICAgICAgICAgICBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgeWVhcjogXCIyLWRpZ2l0XCIsXHJcbiAgICAgICAgICAgICAgICBtb250aDogXCIyLWRpZ2l0XCIsXHJcbiAgICAgICAgICAgICAgICBkYXk6IFwiMi1kaWdpdFwiLFxyXG4gICAgICAgICAgICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXHJcbiAgICAgICAgICAgICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwidGltZVwiOlxyXG4gICAgICAgICAgICBvcHRpb25zID0geyBob3VyOiBcIm51bWVyaWNcIiwgbWludXRlOiBcIm51bWVyaWNcIiB9O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiZGF5X3RpbWVfem9uZVwiOlxyXG4gICAgICAgICAgICBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgd2Vla2RheTogXCJsb25nXCIsXHJcbiAgICAgICAgICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIixcclxuICAgICAgICAgICAgICAgIG1vbnRoOiBcImxvbmdcIixcclxuICAgICAgICAgICAgICAgIGRheTogXCJudW1lcmljXCIsXHJcbiAgICAgICAgICAgICAgICBob3VyOiBcIm51bWVyaWNcIixcclxuICAgICAgICAgICAgICAgIG1pbnV0ZTogXCJudW1lcmljXCIsXHJcbiAgICAgICAgICAgICAgICB0aW1lWm9uZU5hbWU6IFwic2hvcnRPZmZzZXRcIixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIGRhdGVTdHlsZTogXCJsb25nXCIsXHJcbiAgICAgICAgICAgICAgICB0aW1lU3R5bGU6IFwic2hvcnRcIixcclxuICAgICAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlKS50b0xvY2FsZVN0cmluZyhsYW5nLCBvcHRpb25zKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbXBhcmVzIHR3byBzdHJpbmcgYXJyYXlzXHJcbiAqIEBwYXJhbSBhcnJheTFcclxuICogQHBhcmFtIGFycmF5MlxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuIGV4cG9ydCBmdW5jdGlvbiBhcnJheXNDb250YWluU2FtZUVsZW1lbnRzKFxyXG4gICAgYXJyYXkxOiBzdHJpbmdbXSxcclxuICAgIGFycmF5Mjogc3RyaW5nW10sXHJcbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFycmF5MSkgPT09IEpTT04uc3RyaW5naWZ5KGFycmF5Mik7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmlzaXRVcmwoY3VycmVudFVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50VXJsLnNwbGl0KFwiL1wiKTtcclxuICAgIHBhdGguc3BsaWNlKDMsIHBhdGgubGVuZ3RoIC0gMik7XHJcbiAgICByZXR1cm4gcGF0aC5qb2luKFwiL1wiKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEV4dHJhY3Qgc3BhY2VJRCBmcm9tIHVybCB3aGVuIGluIHZpc2l0IDNEXHJcbiAqL1xyXG4gZXhwb3J0IGZ1bmN0aW9uIGdldFNwYWNlSURGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHZpc2l0VXJsID0gZ2V0VmlzaXRVcmwodXJsKTtcclxuICAgIHJldHVybiB2aXNpdFVybC5zcGxpdChcIi9cIilbMl07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEb3dubG9hZCByZWxhdGVkXHJcbiAqL1xyXG4gaW1wb3J0IEZpbGVTYXZlciBmcm9tIFwiZmlsZS1zYXZlclwiO1xyXG5cclxuIGV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEZpbGUoZmlsZVVybDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgRmlsZVNhdmVyLnNhdmVBcyhmaWxlVXJsICsgZmlsZU5hbWUsIGZpbGVOYW1lKTtcclxuIH1cclxuIFxyXG4gZXhwb3J0IGZ1bmN0aW9uIG9wZW5Eb2N1bWVudChmaWxlVXJsOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIGlkOiBudW1iZXIpIHtcclxuICAgICB3aW5kb3cub3BlbihgJHtmaWxlVXJsICsgZmlsZU5hbWV9I2RvYz0ke2lkfWAsIFwiX2JsYW5rXCIsIFwiXCIpO1xyXG4gfVxyXG4gXHJcbiBleHBvcnQgY29uc3QgZG93bmxvYWRFcXVpcG1lbnREb2N1bWVudCA9IGFzeW5jIChcclxuICAgICBkb2N1bWVudF86IEVxdWlwbWVudERvY3VtZW50LFxyXG4gKTogUHJvbWlzZTxPYmplY3QgfCB2b2lkPiA9PiB7XHJcbiAgICAgY29uc3Qgc2lnbmVkRmlsZSA9IGF3YWl0IGRvd25sb2FkRmlsZUFzT2JqZWN0KGRvY3VtZW50Xy51cmwpO1xyXG4gICAgIGlmIChzaWduZWRGaWxlKSB7XHJcbiAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgZG93bmxvYWRCbG9iKHNpZ25lZEZpbGUuQm9keSwgZG9jdW1lbnRfLmZpbGVuYW1lKTtcclxuICAgICB9XHJcbiB9O1xyXG5cclxuIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0VsZW1lbnRCeUlkKHNlbGVjdG9yKSB7XHJcbiAgICBsZXQgcXVlcnlTZWxlY3RvciA9IG51bGw7XHJcbiAgICB3aGlsZSAocXVlcnlTZWxlY3RvciA9PT0gbnVsbCkge1xyXG4gICAgICAgIGF3YWl0IHJhZkFzeW5jKCk7XHJcbiAgICAgICAgcXVlcnlTZWxlY3RvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGVjdG9yKTtcclxuICAgIH1cclxuICAgIHJldHVybiBxdWVyeVNlbGVjdG9yO1xyXG59XHJcblxyXG5mdW5jdGlvbiByYWZBc3luYygpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlKTsgLy8gZmFzdGVyIHRoYW4gc2V0IHRpbWUgb3V0XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyogQHBhcmFtIHtBcnJheX0gbnVtYmVycyBBbiBhcnJheSBvZiBudW1iZXJzLlxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBjYWxjdWxhdGVkIGF2ZXJhZ2UgKG9yIG1lYW4pIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZFxyXG4gKiAgICAgbnVtYmVycy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtZWFuKG51bWJlcnM6IG51bWJlcltdKSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgZm9yIChjb25zdCBudW1iZXIgb2YgbnVtYmVycykge1xyXG4gICAgICAgIHRvdGFsICs9IG51bWJlcjtcclxuICAgIH1cclxuICAgIHJldHVybiB0b3RhbCAvIG51bWJlcnMubGVuZ3RoO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRpbWVzdGFtcFRvTG9jYWxab25lKHRpbWVzdGFtcDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7XHJcbiAgICBjb25zdCBsb2NhbE9mZnNldCA9IC0xICogc2VsZWN0ZWREYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMDtcclxuICAgIGNvbnN0IHN0YW1wID0gdGltZXN0YW1wICsgbG9jYWxPZmZzZXQ7XHJcbiAgICByZXR1cm4gc3RhbXA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gc3RyaW5nIGZvciBwZXJpb2Qgb2YgdGltZS4gUGFyYW1ldGVycyBhcmUgRGF0ZVRpbWUgb2JqZWN0cyBvZiBsdXhvbiBsaWJyYXJ5LlxyXG4gKi9cclxuIGV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVEYXRlUGVyaW9kKFxyXG4gICAgdHJhbnNsYXRlU2VydmljZTogYW55LFxyXG4gICAgZGF0ZVN0YXJ0UGVyaW9kOiBhbnksXHJcbiAgICBkYXRlRW5kUGVyaW9kOiBhbnksXHJcbik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBsb2NhbGUgPSBnZXRMb2NhbGVMb25nKHRyYW5zbGF0ZVNlcnZpY2UpO1xyXG4gICAgcmV0dXJuIGAke2RhdGVTdGFydFBlcmlvZC50b0xvY2FsZVN0cmluZyh7XHJcbiAgICAgICAgbG9jYWxlLFxyXG4gICAgICAgIG1vbnRoOiBcImxvbmdcIixcclxuICAgICAgICBkYXk6IFwiMi1kaWdpdFwiLFxyXG4gICAgfSl9IC0gJHtkYXRlRW5kUGVyaW9kLnRvTG9jYWxlU3RyaW5nKHtcclxuICAgICAgICBsb2NhbGUsXHJcbiAgICAgICAgbW9udGg6IFwibG9uZ1wiLFxyXG4gICAgICAgIGRheTogXCIyLWRpZ2l0XCIsXHJcbiAgICB9KX0gYDtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4qIFJldHVybiBsb2NhbCBpbiB0aGUgY2Fub25pY2FsIGZvcm06IFwiZW4tR0JcIiwgXCJmci1GUlwiXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbGVMb25nKHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSk6IHN0cmluZyB7XHJcbiAgICBsZXQgbGFuZyA9IHRyYW5zbGF0ZS5jdXJyZW50TGFuZ1xyXG4gICAgICAgID8gdHJhbnNsYXRlLmN1cnJlbnRMYW5nXHJcbiAgICAgICAgOiB0cmFuc2xhdGUuZGVmYXVsdExhbmc7XHJcblxyXG4gICAgLyoqIFRyYW5zZm9ybSAnX2ZyJyB0byAnZnInICovXHJcbiAgICBsYW5nID0gbGFuZy5zbGljZSgxKTtcclxuICAgIGlmIChsYW5nID09PSBcImVuXCIpIHtcclxuICAgICAgICByZXR1cm4gXCJlbi1HQlwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGAke2xhbmd9LSR7bGFuZy50b1VwcGVyQ2FzZSgpfWA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gbG9jYWwgaW4gdGhlIHNob3J0IGZvcm06IFwiZW5cIiwgXCJmclwiXHJcbiAqL1xyXG4gZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsZVNob3J0KHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSk6IHN0cmluZyB7XHJcbiAgICBsZXQgbGFuZyA9IHRyYW5zbGF0ZS5jdXJyZW50TGFuZ1xyXG4gICAgICAgID8gdHJhbnNsYXRlLmN1cnJlbnRMYW5nXHJcbiAgICAgICAgOiB0cmFuc2xhdGUuZGVmYXVsdExhbmc7XHJcblxyXG4gICAgLyoqIFRyYW5zZm9ybSAnX2ZyJyB0byAnZnInICovXHJcbiAgICBsYW5nID0gbGFuZy5zbGljZSgxKTtcclxuICAgIHJldHVybiBsYW5nO1xyXG59XHJcblxyXG4vKipcclxuICogRm9ybWF0IHN0cmluZyB0byBsb3dlcmNhc2UsIG5vIHNwYWNlc1xyXG4gKi9cclxuIGV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb0xvd2VyY2FzZU5vU3BhY2VzKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgd29yZHMgPSBpbnB1dC50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XHJcbiAgICByZXR1cm4gd29yZHMuam9pbihcIlwiKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRlc3QgaWYgdGhlIG9iamVjdCA9PT0ge31cclxuICogQHBhcmFtIG9iaiBvYmplY3Qge2tleTp2YWx1ZX1cclxuICogQHJldHVybnMgYm9vbGVhblxyXG4gKi9cclxuIGV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5T2JqZWN0KG9iamVjdCk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCB4IGluIG9iamVjdCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2h1ZmZsZUFycmF5KGFycmF5OiBhbnlbXSkge1xyXG4gICAgY29uc3QgbmV3QXJyYXkgPSBbLi4uYXJyYXldO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSBhcnJheS5sZW5ndGggLSAxOyBpbmRleCA+IDA7IGluZGV4LS0pIHtcclxuICAgICAgICBjb25zdCBpbmRleE5ldyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpbmRleCArIDEpKTtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgICAgICBbbmV3QXJyYXlbaW5kZXhdLCBuZXdBcnJheVtpbmRleE5ld11dID0gW1xyXG4gICAgICAgICAgICBuZXdBcnJheVtpbmRleE5ld10sXHJcbiAgICAgICAgICAgIG5ld0FycmF5W2luZGV4XSxcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld0FycmF5O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyVG9EYXRlU3RyaW5nKHRpbWVzdGFtcDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGpzRGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7XHJcbiAgICByZXR1cm4ganNEYXRlLnRvTG9jYWxlU3RyaW5nKFwiZnItRlJcIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkdXJhdGlvblRvU3RyaW5nKFxyXG4gICAgZHVyYXRpb246IG51bWJlcixcclxuICAgIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKGR1cmF0aW9uIC8gMzYwMCAvIDI0KTtcclxuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcigoZHVyYXRpb24gLSBkYXlzICogMjQgKiAzNjAwKSAvIDM2MDApO1xyXG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKGR1cmF0aW9uICUgMzYwMCkgLyA2MCk7XHJcbiAgICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihkdXJhdGlvbiAlIDYwKTtcclxuXHJcbiAgICBjb25zdCBkYXlzU3RyaW5nID0gdHJhbnNsYXRlLmluc3RhbnQoXCJkYXkocylcIik7XHJcbiAgICBjb25zdCBob3Vyc1N0cmluZyA9IHRyYW5zbGF0ZS5pbnN0YW50KFwiaG91cihzKVwiKTtcclxuICAgIGNvbnN0IG9uZUhvdXJTdHJpbmcgPSB0cmFuc2xhdGUuaW5zdGFudChcImhvdXJcIik7XHJcbiAgICBjb25zdCBtaW51dGVzU3RyaW5nID0gdHJhbnNsYXRlLmluc3RhbnQoXCJtaW51dGUocylcIik7XHJcbiAgICBjb25zdCBzZWNvbmRzU3RyaW5nID0gdHJhbnNsYXRlLmluc3RhbnQoXCJzZWNvbmQocylcIik7XHJcblxyXG4gICAgaWYgKGR1cmF0aW9uID4gMzYwMCAqIDI0ICogNykge1xyXG4gICAgICAgIHJldHVybiBgJHtkYXlzfSAke2RheXNTdHJpbmd9YDtcclxuICAgIH1cclxuICAgIGlmIChkdXJhdGlvbiA+IDM2MDAgKiAyNCkge1xyXG4gICAgICAgIHJldHVybiBgJHtkYXlzfSAke2RheXNTdHJpbmd9ICR7aG91cnN9ICR7aG91cnNTdHJpbmd9YDtcclxuICAgIH1cclxuICAgIGlmIChkdXJhdGlvbiA9PT0gMzYwMCkge1xyXG4gICAgICAgIHJldHVybiBgJHtob3Vyc30gJHtvbmVIb3VyU3RyaW5nfWA7XHJcbiAgICB9XHJcbiAgICBpZiAoZHVyYXRpb24gPiAzNjAwKSB7XHJcbiAgICAgICAgaWYgKG1pbnV0ZXMgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke2hvdXJzfSAke2hvdXJzU3RyaW5nfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBgJHtob3Vyc30gJHtob3Vyc1N0cmluZ30gJHttaW51dGVzfSAke21pbnV0ZXNTdHJpbmd9YDtcclxuICAgIH1cclxuICAgIGlmIChkdXJhdGlvbiA+PSA2MCkge1xyXG4gICAgICAgIGlmIChzZWNvbmRzID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHttaW51dGVzfSAke21pbnV0ZXNTdHJpbmd9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGAke21pbnV0ZXN9ICR7bWludXRlc1N0cmluZ30gJHtzZWNvbmRzfSAke3NlY29uZHNTdHJpbmd9YDtcclxuICAgIH1cclxuICAgIHJldHVybiBgJHtzZWNvbmRzfSAke3NlY29uZHNTdHJpbmd9YDtcclxufVxyXG4iXX0=
|