ngx-bimplus-components 0.0.149-28792-3 → 0.0.150
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/assets/languages/strings_cs.json +72 -24
- package/assets/languages/strings_de.json +15 -4
- package/assets/languages/strings_en.json +5 -5
- package/assets/languages/strings_es.json +54 -6
- package/assets/languages/strings_fr.json +50 -6
- package/assets/languages/strings_it.json +50 -2
- package/assets/languages/strings_nl.json +796 -796
- package/assets/languages/strings_ro.json +55 -7
- package/assets/languages/strings_ru.json +93 -45
- package/assets/languages/strings_tr.json +50 -2
- package/assets/languages/strings_us.json +44 -8
- package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.mjs +7 -20
- package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.mjs +2 -5
- package/esm2022/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.mjs +7 -7
- package/esm2022/lib/components/bimplus-connection-designer/bimplus-connection-designer.interface.mjs +1 -1
- package/esm2022/lib/components/bimplus-connection-designer/bimplus-connection-designer.service.mjs +4 -4
- package/esm2022/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.interface.mjs +1 -1
- package/esm2022/lib/components/bimplus-contact/bimplus-contact.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-context-menu/bimplus-context-menu.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-context-menu/bimplus-context-menu.interface.mjs +1 -1
- package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.interface.mjs +1 -1
- package/esm2022/lib/components/bimplus-floating-bar/bimplus-floating-bar.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-floating-bar/bimplus-floating-bar.interface.mjs +1 -1
- package/esm2022/lib/components/bimplus-floating-bar-body/bimplus-floating-bar-body.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.mjs +4 -4
- package/esm2022/lib/components/bimplus-floating-bar-hide-objects/bimplus-floating-bar-hide-objects.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-floating-bar-isolation-objects/bimplus-floating-bar-isolation-objects.component.mjs +4 -4
- package/esm2022/lib/components/bimplus-floating-bar-project-navigator/bimplus-floating-bar-project-navigator.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.mjs +4 -4
- package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service.mjs +3 -3
- package/esm2022/lib/components/bimplus-language-menu/bimplus-language-menu.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-localized-widget/bimplus-localized-widget.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-main-menu/bimplus-main-menu.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-navbar/bimplus-navbar.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-notify/bimplus-notify.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.mjs +6 -5
- package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.mjs +1 -1
- package/esm2022/lib/components/bimplus-object-navigator/filter-criterium/filter-criterium.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-object-structure/bimplus-object-structure.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.mjs +7 -10
- package/esm2022/lib/components/bimplus-panel-toolbar/bimplus-panel-toolbar.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-project-menu/bimplus-project-menu.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-sidenav/bimplus-sidenav.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-storage-info/bimplus-storage-info.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-text-message/bimplus-text-message.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-tool-hub/bimplus-tool-hub.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-tool-hub/svgGenerator.mjs +1 -1
- package/esm2022/lib/components/bimplus-tool-hub/tool-hub-item/tool-hub-item.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-tool-hub/tool-hub-sub-item/tool-hub-sub-item.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-tooltip-message/bimplus-tooltip-message.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-tooltip-message/bimplus-tooltip-message.interface.mjs +1 -1
- package/esm2022/lib/components/bimplus-touch-menu/bimplus-touch-menu.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-user-menu/bimplus-user-menu.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-zoom/bimplus-zoom.component.mjs +5 -5
- package/esm2022/lib/components/expansion-panel/expansion-panel.component.mjs +3 -3
- package/esm2022/lib/components/expansion-panel-header/expansion-panel-header.component.mjs +3 -3
- package/esm2022/lib/components/expansion-panel-header-actions/expansion-panel-header-actions.component.mjs +3 -3
- package/esm2022/lib/components/loading-spinner/loading-spinner.component.mjs +3 -3
- package/esm2022/lib/components/object-properties-header/object-properties-header.component.mjs +6 -21
- package/esm2022/lib/components/object-properties-header/object-properties-header.interface.mjs +1 -1
- package/esm2022/lib/components/project-models/project-models.component.mjs +3 -3
- package/esm2022/lib/components/project-models/project-models.interface.mjs +1 -1
- package/esm2022/lib/components/resizable-panel/resizable-panel.component.mjs +5 -5
- package/esm2022/lib/directives/click-outside/click-outside.directive.mjs +4 -4
- package/esm2022/lib/directives/component-draggable/componentsDraggable.directive.mjs +3 -3
- package/esm2022/lib/directives/draggable.directive.mjs +3 -3
- package/esm2022/lib/directives/resizable.directive.mjs +4 -4
- package/esm2022/lib/directives/x-draggable.directive.mjs +3 -3
- package/esm2022/lib/interfaces/bimplus-opacity-properties.interface.mjs +1 -1
- package/esm2022/lib/interfaces/bimplus-visibility-properties.interface.mjs +1 -1
- package/esm2022/lib/ngx-bimplus-components.component.mjs +3 -3
- package/esm2022/lib/ngx-bimplus-components.service.mjs +3 -3
- package/esm2022/lib/pipes/pxsuffix.pipe.mjs +3 -3
- package/esm2022/lib/services/cursors.service.mjs +3 -3
- package/esm2022/lib/services/language-strings.service.mjs +3 -3
- package/esm2022/lib/services/layout-manager.service.mjs +3 -3
- package/esm2022/lib/services/local-storage.service.mjs +4 -4
- package/esm2022/lib/services/resize-observer.service.mjs +4 -4
- package/esm2022/lib/types/types.mjs +1 -1
- package/esm2022/lib/utils/filterString.mjs +1 -1
- package/esm2022/lib/utils/filterStructureFetcher.mjs +1 -1
- package/esm2022/lib/utils/utils.mjs +1 -1
- package/esm2022/public-api.mjs +1 -17
- package/fesm2022/ngx-bimplus-components.mjs +248 -2315
- package/fesm2022/ngx-bimplus-components.mjs.map +1 -1
- package/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.d.ts +3 -9
- package/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.d.ts +0 -5
- package/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.d.ts +1 -1
- package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.d.ts +7 -7
- package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.d.ts +3 -3
- package/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.d.ts +0 -3
- package/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.d.ts +1 -1
- package/lib/components/object-properties-header/object-properties-header.component.d.ts +3 -5
- package/lib/components/object-properties-header/object-properties-header.interface.d.ts +0 -1
- package/package.json +5 -12
- package/public-api.d.ts +0 -16
- package/assets/images/default/Attachment_18_gray.svg +0 -1
- package/assets/images/default/Attachment_18_maincolor.svg +0 -3
- package/assets/images/default/Attachmentlink_18_gray.svg +0 -7
- package/assets/images/default/Attachmentlink_18_maincolor.svg +0 -7
- package/assets/images/default/Comments_18_gray.svg +0 -1
- package/assets/images/default/Comments_18_maincolor.svg +0 -4
- package/assets/images/default/Links_18_gray.svg +0 -1
- package/assets/images/default/Links_18_maincolor.svg +0 -4
- package/assets/images/default/ic_models.svg +0 -3
- package/assets/images/default/ic_models_maincolor.svg +0 -3
- package/assets/images/default/icn_grid_attachments.png +0 -0
- package/assets/images/default/icn_grid_hyperlinks.png +0 -0
- package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.component.mjs +0 -69
- package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.interface.mjs +0 -34
- package/esm2022/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.mjs +0 -82
- package/esm2022/lib/components/bimplus-attachments/services/bimplus-attachments.service.mjs +0 -49
- package/esm2022/lib/components/bimplus-comment/bimplus-comment.component.mjs +0 -68
- package/esm2022/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.mjs +0 -58
- package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.mjs +0 -242
- package/esm2022/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.mjs +0 -2
- package/esm2022/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.mjs +0 -73
- package/esm2022/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.mjs +0 -75
- package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.mjs +0 -38
- package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.mjs +0 -10
- package/esm2022/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.mjs +0 -89
- package/esm2022/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.mjs +0 -33
- package/esm2022/lib/components/bimplus-textarea/autoResizeTextarea.directive.mjs +0 -83
- package/esm2022/lib/components/bimplus-textarea/bimplus-textarea.component.mjs +0 -122
- package/esm2022/lib/components/links-to-documents/links-to-documents.component.interface.mjs +0 -2
- package/esm2022/lib/components/links-to-documents/links-to-documents.component.mjs +0 -337
- package/esm2022/lib/components/object-hyperlinks/object-hyperlinks.component.mjs +0 -141
- package/esm2022/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.mjs +0 -36
- package/esm2022/lib/components/object-properties/object-properties.component.mjs +0 -261
- package/esm2022/lib/components/object-properties/object-properties.interface.mjs +0 -2
- package/esm2022/lib/components/object-properties-group/object-properties-group.component.mjs +0 -40
- package/esm2022/lib/components/object-properties-group/object-property-value/object-property-value.component.mjs +0 -55
- package/esm2022/lib/pipes/bit-converter.pipe.mjs +0 -46
- package/esm2022/lib/pipes/get-attribute-value.pipe.mjs +0 -110
- package/esm2022/lib/pipes/round.pipe.mjs +0 -20
- package/esm2022/lib/utils/objectProperties.mjs +0 -9
- package/lib/components/bimplus-attachments/bimplus-attachments.component.d.ts +0 -25
- package/lib/components/bimplus-attachments/bimplus-attachments.interface.d.ts +0 -19
- package/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.d.ts +0 -26
- package/lib/components/bimplus-attachments/services/bimplus-attachments.service.d.ts +0 -12
- package/lib/components/bimplus-comment/bimplus-comment.component.d.ts +0 -34
- package/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.d.ts +0 -17
- package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.d.ts +0 -51
- package/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.d.ts +0 -11
- package/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.d.ts +0 -28
- package/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.d.ts +0 -23
- package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.d.ts +0 -16
- package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.d.ts +0 -18
- package/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.d.ts +0 -36
- package/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.d.ts +0 -15
- package/lib/components/bimplus-textarea/autoResizeTextarea.directive.d.ts +0 -24
- package/lib/components/bimplus-textarea/bimplus-textarea.component.d.ts +0 -42
- package/lib/components/links-to-documents/links-to-documents.component.d.ts +0 -55
- package/lib/components/links-to-documents/links-to-documents.component.interface.d.ts +0 -11
- package/lib/components/object-hyperlinks/object-hyperlinks.component.d.ts +0 -32
- package/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.d.ts +0 -15
- package/lib/components/object-properties/object-properties.component.d.ts +0 -45
- package/lib/components/object-properties/object-properties.interface.d.ts +0 -21
- package/lib/components/object-properties-group/object-properties-group.component.d.ts +0 -11
- package/lib/components/object-properties-group/object-property-value/object-property-value.component.d.ts +0 -14
- package/lib/pipes/bit-converter.pipe.d.ts +0 -17
- package/lib/pipes/get-attribute-value.pipe.d.ts +0 -23
- package/lib/pipes/round.pipe.d.ts +0 -7
- package/lib/utils/objectProperties.d.ts +0 -2
|
@@ -1,337 +0,0 @@
|
|
|
1
|
-
import { Component, ViewEncapsulation, Input } from '@angular/core';
|
|
2
|
-
import { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';
|
|
3
|
-
import { TranslateModule } from '@ngx-translate/core';
|
|
4
|
-
import { from, BehaviorSubject, switchMap, forkJoin } from 'rxjs';
|
|
5
|
-
import { concatMap } from 'rxjs/operators';
|
|
6
|
-
import { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component';
|
|
7
|
-
import { BimplusButtonsRowComponent } from "../bimplus-buttons-row/bimplus-buttons-row.component";
|
|
8
|
-
import { BimplusOverlayDialogConfirmComponent } from "../bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component";
|
|
9
|
-
import * as WebClient from 'bimplus-webclient';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "@ngx-translate/core";
|
|
12
|
-
import * as i2 from "../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service";
|
|
13
|
-
export const EMBEDDED_MODAL_DIALOGE_TYPE_FILE = 'file';
|
|
14
|
-
export class LinksToDocumentsComponent extends BimplusLocalizedWidgetComponent {
|
|
15
|
-
constructor(translateService, dialogService, renderer, el) {
|
|
16
|
-
super(translateService);
|
|
17
|
-
this.dialogService = dialogService;
|
|
18
|
-
this.renderer = renderer;
|
|
19
|
-
this.el = el;
|
|
20
|
-
this._rootObjectId = "";
|
|
21
|
-
this.isDestroyed = false;
|
|
22
|
-
this.localWormHole = true;
|
|
23
|
-
//When is true then it means the creation of link is in progress
|
|
24
|
-
this.inProgress = false;
|
|
25
|
-
this.api = null;
|
|
26
|
-
this.canCreateAttachmentLink = true;
|
|
27
|
-
this.canDeleteAttachmentLink = true;
|
|
28
|
-
this.project = null;
|
|
29
|
-
this.wormholeSelector = "localEmbeddedModalId"; // calling application can provide a place where the iframe for documents selection will be rendered
|
|
30
|
-
this.env = 'dev';
|
|
31
|
-
this._currentObjectId$ = new BehaviorSubject("");
|
|
32
|
-
this._attachmentCount = 0;
|
|
33
|
-
this._attachments = [];
|
|
34
|
-
this.buttonRowItems = [
|
|
35
|
-
{
|
|
36
|
-
id: "add-documents",
|
|
37
|
-
title: this.translateService.instant('_Add_document'),
|
|
38
|
-
tooltip: this.translateService.instant('_Add_document'),
|
|
39
|
-
disabled: !this.canCreateAttachmentLink,
|
|
40
|
-
buttonStyle: 'primary'
|
|
41
|
-
}
|
|
42
|
-
];
|
|
43
|
-
this.documentSelection = null;
|
|
44
|
-
this.isOpened = false;
|
|
45
|
-
this.embeddedModalContainer = 'embedded-modal';
|
|
46
|
-
this.shadowRootElement = this.el.nativeElement.shadowRoot;
|
|
47
|
-
}
|
|
48
|
-
set rootObjectId(id) {
|
|
49
|
-
this._currentObjectId$.next(id);
|
|
50
|
-
this._rootObjectId = id;
|
|
51
|
-
}
|
|
52
|
-
get rootObjectId() {
|
|
53
|
-
return this._rootObjectId;
|
|
54
|
-
}
|
|
55
|
-
ngOnInit() {
|
|
56
|
-
this._currentObjectId$.subscribe({
|
|
57
|
-
next: (id) => {
|
|
58
|
-
this._createAttachmentLinkStructure(id);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
;
|
|
63
|
-
ngOnDestroy() {
|
|
64
|
-
this.isDestroyed = true;
|
|
65
|
-
}
|
|
66
|
-
fmt(string, ...formats) {
|
|
67
|
-
let index = 0;
|
|
68
|
-
return string.replace(/%@(\d+)?/g, (match, argumentIndex) => {
|
|
69
|
-
const argumentIndexN = argumentIndex ? parseInt(argumentIndex, 10) - 1 : index++;
|
|
70
|
-
const _match = formats[argumentIndexN];
|
|
71
|
-
if (_match === null) {
|
|
72
|
-
return '(null)';
|
|
73
|
-
}
|
|
74
|
-
if (_match === undefined) {
|
|
75
|
-
return '';
|
|
76
|
-
}
|
|
77
|
-
return _match.toString();
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
/**--------------------------------------------------------------------------
|
|
81
|
-
* decorate link
|
|
82
|
-
--------------------------------------------------------------------------*/
|
|
83
|
-
_decorateLink(api, link) {
|
|
84
|
-
const retval = {
|
|
85
|
-
id: link.id,
|
|
86
|
-
name: link.name,
|
|
87
|
-
fileName: link.fileName,
|
|
88
|
-
size: link.size,
|
|
89
|
-
link: link.link,
|
|
90
|
-
fileNameShort: '',
|
|
91
|
-
extension: '',
|
|
92
|
-
objectId: '',
|
|
93
|
-
version: link.version
|
|
94
|
-
};
|
|
95
|
-
const access_token = api.getAccessToken();
|
|
96
|
-
const attVersion = "attachments/%@/versions/%@/download";
|
|
97
|
-
const url = api.getApiTeamUrl() + attVersion;
|
|
98
|
-
const isEmbeddedAllplanMode = false;
|
|
99
|
-
retval.size = parseFloat((link.size / 1000).toFixed(2));
|
|
100
|
-
retval.link = `${this.fmt(url, link.id, link.version)}?api-token=${access_token}${isEmbeddedAllplanMode ? '' : '&openInBrowser=true'}`;
|
|
101
|
-
if (link.fileName.length > 20) {
|
|
102
|
-
const fileParts = link.fileName.split('.');
|
|
103
|
-
if (fileParts.length > 1) {
|
|
104
|
-
retval.fileNameShort = fileParts.slice(0, -1).join('.');
|
|
105
|
-
retval.extension = "." + fileParts.slice(-1);
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
retval.fileNameShort = link.fileName;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
retval.fileNameShort = link.fileName;
|
|
113
|
-
}
|
|
114
|
-
retval.objectId = this._currentObjectId$.value;
|
|
115
|
-
return retval;
|
|
116
|
-
}
|
|
117
|
-
decorateAttachmentLinks(api, links) {
|
|
118
|
-
const decoratedLinks = links.map((link) => this._decorateLink(api, link));
|
|
119
|
-
decoratedLinks.sort((a, b) => {
|
|
120
|
-
if (a.fileName.toLowerCase() < b.fileName.toLowerCase())
|
|
121
|
-
return -1;
|
|
122
|
-
if (a.fileName.toLowerCase() > b.fileName.toLowerCase())
|
|
123
|
-
return 1;
|
|
124
|
-
return 0;
|
|
125
|
-
});
|
|
126
|
-
return decoratedLinks;
|
|
127
|
-
}
|
|
128
|
-
_createAttachmentLinkStructure(objectId) {
|
|
129
|
-
this._loadAttachmentLinkStructure(objectId)?.subscribe({
|
|
130
|
-
next: (structureData) => {
|
|
131
|
-
if (structureData) {
|
|
132
|
-
//this._attachmentLinkStructure = _attachmentLink StructureBuilder.createFromResponse(structureData);
|
|
133
|
-
this._attachmentCount = structureData?.length;
|
|
134
|
-
if (this.api) {
|
|
135
|
-
const retval = this.decorateAttachmentLinks(this.api, structureData);
|
|
136
|
-
if (retval) {
|
|
137
|
-
this._attachments = retval;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
_loadAttachmentLinkStructure(objectId) {
|
|
145
|
-
if (!this.api) {
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
if (!objectId) {
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
return from(this.api.objects.getAttachmentLinks(objectId));
|
|
152
|
-
}
|
|
153
|
-
// show or hide embedded modal
|
|
154
|
-
setModalVisibility(opened = true) {
|
|
155
|
-
if (!this.wormholeSelector) {
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
const element = this.localWormHole ? this.shadowRootElement.querySelector("#" + this.wormholeSelector) :
|
|
159
|
-
document.getElementById(this.wormholeSelector);
|
|
160
|
-
if (!element) {
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
if (this.localWormHole) {
|
|
164
|
-
if (element.parentElement) {
|
|
165
|
-
this.renderer.setStyle(element.parentElement, 'display', opened ? 'block' : 'none');
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
this.renderer.setStyle(element.parentElement, 'display', opened ? 'block' : 'none');
|
|
170
|
-
}
|
|
171
|
-
///containerEl.fadeIn("fast") : containerEl.fadeOut("fast");
|
|
172
|
-
this.isOpened = opened;
|
|
173
|
-
}
|
|
174
|
-
closeEmbeddedModalFileSelection() {
|
|
175
|
-
this.setModalVisibility(false);
|
|
176
|
-
}
|
|
177
|
-
_addLink(api, ids) {
|
|
178
|
-
// filter out already existing attachment links
|
|
179
|
-
const newAttachmentIDs = ids.filter(item => !this._attachments.find(n => n.id === item));
|
|
180
|
-
if (!newAttachmentIDs.length) {
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
if (this.inProgress) {
|
|
184
|
-
console.log('in progress');
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
this.inProgress = true;
|
|
188
|
-
newAttachmentIDs.forEach((id) => {
|
|
189
|
-
console.log('new attachment id:', id);
|
|
190
|
-
});
|
|
191
|
-
// Create an array of observables for each post request
|
|
192
|
-
const postRequests = newAttachmentIDs.map((id) => from(api.objects.postAttachmentLink(this._rootObjectId, JSON.stringify({ attachmentId: id }))));
|
|
193
|
-
// Use forkJoin to wait for all post requests to complete in parallel
|
|
194
|
-
forkJoin(postRequests)
|
|
195
|
-
.pipe(
|
|
196
|
-
// After all posts are complete, switch to the next call to get updated links
|
|
197
|
-
concatMap(() => from(api.objects.getAttachmentLinks(this._rootObjectId))))
|
|
198
|
-
.subscribe({
|
|
199
|
-
next: (updatedAttachments) => {
|
|
200
|
-
this._attachments = this.decorateAttachmentLinks(api, updatedAttachments); // Update attachments in component
|
|
201
|
-
this.inProgress = false;
|
|
202
|
-
},
|
|
203
|
-
error: (err) => {
|
|
204
|
-
console.error('Failed to add or reload attachments:', err);
|
|
205
|
-
this.inProgress = false;
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
createAttachmentLink(api) {
|
|
210
|
-
this.localWormHole = this.wormholeSelector === "localEmbeddedModalId";
|
|
211
|
-
const callbackF = (docIDs) => {
|
|
212
|
-
const ids = (typeof docIDs === 'string') ? [docIDs] : docIDs;
|
|
213
|
-
const foundDocuments = ids && ids.length > 0;
|
|
214
|
-
if (!this.isDestroyed) {
|
|
215
|
-
this.closeEmbeddedModalFileSelection();
|
|
216
|
-
if (foundDocuments) {
|
|
217
|
-
this._addLink(api, ids);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
};
|
|
221
|
-
if (typeof callbackF !== "function" || !this.project || !this.api) {
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
setTimeout(() => {
|
|
225
|
-
const isLocalhost = window.location.href.includes("localhost");
|
|
226
|
-
let access_token = '';
|
|
227
|
-
if (isLocalhost) {
|
|
228
|
-
access_token = this.api?.getAccessToken();
|
|
229
|
-
if (!access_token) {
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
const newClient = new WebClient.ExternalClient('BImplusNGXComponentClient');
|
|
234
|
-
newClient?.initialize();
|
|
235
|
-
// Make embedded windows pointing to the current feature branch with baseUrl setup
|
|
236
|
-
const options = {};
|
|
237
|
-
// In case of localhost ommit explicit setup of baseUrl
|
|
238
|
-
if (!isLocalhost) {
|
|
239
|
-
// Remove '/viewer/' from the end of pathname
|
|
240
|
-
let filteredPathname = window.location.pathname.replace(/\/viewer\/$/, '/');
|
|
241
|
-
// Remove '/connexis/' from the end of pathname if we use temporary url for connexis like https://portal-dev.bimplus.net/connexis/?embedded...
|
|
242
|
-
filteredPathname = filteredPathname.replace(/\/connexis\/$/, '/');
|
|
243
|
-
options.baseUrl = window.location.origin + filteredPathname;
|
|
244
|
-
}
|
|
245
|
-
///const env:string="dev"; ///!!! to-do introduce env variable into components
|
|
246
|
-
const clientModule = WebClient.BimFilesSelect;
|
|
247
|
-
if (this.wormholeSelector) {
|
|
248
|
-
const documentSelection = new clientModule(this.wormholeSelector, access_token, newClient, this.env, options);
|
|
249
|
-
if (!documentSelection) {
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
documentSelection.onAttachmentSelected = callbackF;
|
|
253
|
-
if (this.project) {
|
|
254
|
-
if (this.localWormHole) {
|
|
255
|
-
documentSelection.loadShadowRoot(this.shadowRootElement, this.project.teamSlug, this.project.id);
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
documentSelection.load(this.project.teamSlug, this.project.id);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
this.setModalVisibility(true);
|
|
262
|
-
}
|
|
263
|
-
}, 200);
|
|
264
|
-
}
|
|
265
|
-
_deleteAttachmentLink(api, id, $event) {
|
|
266
|
-
$event.stopPropagation();
|
|
267
|
-
$event.preventDefault();
|
|
268
|
-
const objects = api.objects;
|
|
269
|
-
const objectId = this._currentObjectId$.value;
|
|
270
|
-
from(api.objects.deleteAttachmentLink(this.rootObjectId, id)).pipe(switchMap(() => from(objects.getAttachmentLinks(objectId)))).subscribe({
|
|
271
|
-
next: (updatedAttachments) => {
|
|
272
|
-
if (this.api) {
|
|
273
|
-
this._attachments = this.decorateAttachmentLinks(this.api, updatedAttachments); // Update attachments in component
|
|
274
|
-
}
|
|
275
|
-
},
|
|
276
|
-
error: (err) => {
|
|
277
|
-
console.error('Failed to delete or reload attachments:', err);
|
|
278
|
-
}
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
deleteAttachmentLink(attachment, $event) {
|
|
282
|
-
if (!this.api) {
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
|
-
if (!attachment) {
|
|
286
|
-
return;
|
|
287
|
-
}
|
|
288
|
-
const api = this.api;
|
|
289
|
-
this.dialogService.open(BimplusOverlayDialogConfirmComponent, {
|
|
290
|
-
options: {
|
|
291
|
-
width: '400px', height: '200px', position: 'middle',
|
|
292
|
-
positionOptions: {}, overlayClickEnabled: false, overlayVisibilityEnabled: true, draggable: false
|
|
293
|
-
}, data: {
|
|
294
|
-
title: this.translateService.instant('_Delete_attachmentlink'),
|
|
295
|
-
message: this.translateService.instant('_Attachmentlink_delete_confirmation_message'),
|
|
296
|
-
acceptButtonLocalizedString: "_Delete",
|
|
297
|
-
acceptCallback: () => {
|
|
298
|
-
this._deleteAttachmentLink(api, attachment.id, $event);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
buttonClicked($event) {
|
|
304
|
-
if (!this.api) {
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
const api = this.api;
|
|
308
|
-
if ($event.id == "add-documents") {
|
|
309
|
-
this.createAttachmentLink(api);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: LinksToDocumentsComponent, deps: [{ token: i1.TranslateService }, { token: i2.DialogService }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
313
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: LinksToDocumentsComponent, isStandalone: true, selector: "lib-links-to-documents", inputs: { api: "api", canCreateAttachmentLink: "canCreateAttachmentLink", canDeleteAttachmentLink: "canDeleteAttachmentLink", project: "project", wormholeSelector: "wormholeSelector", env: "env", rootObjectId: "rootObjectId" }, usesInheritance: true, ngImport: i0, template: "@if (canCreateAttachmentLink) {\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n />\r\n}\r\n@if (wormholeSelector === 'localEmbeddedModalId'){\r\n <div class='embedded-modal-container'>\r\n <iframe id={{wormholeSelector}} [title]=\"\"></iframe>\r\n </div> \r\n}\r\n<lib-bimplus-scrollable-container>\r\n @for (attachment of _attachments; track attachment; let i = $index) {\r\n <div class=\"attachment-row\">\r\n @if (canDeleteAttachmentLink) {\r\n <span class=\"bim-attachment-delete-button\" (click)=\"deleteAttachmentLink(attachment,$event)\" (keydown)=\"deleteAttachmentLink(attachment,$event)\">\r\n <div\r\n title=\"{{ '_Delete_attachmentlink' | translate }}\"\r\n >\r\n ✕︎\r\n </div>\r\n </span>\r\n }\r\n <a class=\"bim-attachmentlink-item\" href={{attachment.link}} target='_blank' rel='noopener noreferrer'>\r\n <div class=\"bim-attachment-name\" title={{attachment.fileName}}>\r\n {{attachment.name ? attachment.name : attachment.fileName}}\r\n </div>\r\n <div class=\"bim-attachment-size\" title={{attachment.name}}>\r\n ({{attachment.size}} kB)\r\n </div>\r\n </a>\r\n </div>\r\n }\r\n @if (_attachments.length === 0) {\r\n <div class=\"bim-attachment-not-found\">\r\n {{ '_No attachments found' | translate }}\r\n </div>\r\n }\r\n</lib-bimplus-scrollable-container>\r\n\r\n", styles: [".text-selected{color:var(--text-highlight-text-color-enabled)}.ui-icon22px{width:2.2rem;height:2.2rem;display:inline-block;float:right;border-radius:.4rem;background-position:center center;background-repeat:no-repeat;cursor:pointer}.ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat}.touch-ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat;width:3.2rem;height:3.2rem}.ui-icon-sidemenu-important{width:2.4rem!important;height:2.4rem!important;background-size:1.8rem 1.8rem!important;background-position:center center;background-repeat:no-repeat}lib-bimplus-buttons-row{flex:0;--button-row-margin-right: .8rem}.attachment-row{margin-left:.8rem;margin-right:.8rem;border-bottom:solid .1rem var(--details-controls-attachment-item-border-color)}.bim-attachment-delete-button{color:var(--details-controls-attachment-delete-button-text-color);float:right;margin-left:auto;cursor:pointer;margin-top:.2rem}.bim-attachment-delete-button:hover{color:var(--ui-text-1-color)}.bim-attachment-delete-button div{width:3.2rem;text-align:center}a.bim-attachmentlink-item,a.bim-attachmentlink-item:hover,a.bim-attachmentlink-item:visited{color:var(--dark-gray-color)}.bim-attachment-item,.bim-attachmentlink-item{display:flex;cursor:pointer;line-height:2.5rem;padding-left:2.6rem;background-repeat:no-repeat;background-position:.8rem center;background-image:url(data:image/png;base64,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);text-decoration:none!important}.bim-attachment-item .bim-attachment-name,.bim-attachmentlink-item .bim-attachment-name{padding-left:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bim-attachment-item .bim-attachment-extension,.bim-attachmentlink-item .bim-attachment-extension{white-space:nowrap}.bim-attachment-item .bim-attachment-size,.bim-attachmentlink-item .bim-attachment-size{padding-left:.5rem;white-space:nowrap;margin-right:.4rem}.bim-attachment-not-found{padding:2.5rem .5rem;color:var(--details-controls-details-not-found-text-color);text-align:center}.embedded-modal-container{display:none;box-sizing:content-box;position:fixed;inset:0;background-color:var(--portal-modal-background-color-overlay);padding:6% 9%}.embedded-modal-container iframe{width:100%;height:100%;outline:0;border:0;-webkit-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);-moz-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color)}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: BimplusScrollableContainerComponent, selector: "lib-bimplus-scrollable-container" }, { kind: "component", type: BimplusButtonsRowComponent, selector: "lib-bimplus-buttons-row", inputs: ["items"], outputs: ["fileChanged", "buttonClicked"] }], encapsulation: i0.ViewEncapsulation.ShadowDom }); }
|
|
314
|
-
}
|
|
315
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: LinksToDocumentsComponent, decorators: [{
|
|
316
|
-
type: Component,
|
|
317
|
-
args: [{ selector: 'lib-links-to-documents', standalone: true, imports: [
|
|
318
|
-
TranslateModule,
|
|
319
|
-
BimplusScrollableContainerComponent,
|
|
320
|
-
BimplusButtonsRowComponent
|
|
321
|
-
], encapsulation: ViewEncapsulation.ShadowDom, template: "@if (canCreateAttachmentLink) {\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n />\r\n}\r\n@if (wormholeSelector === 'localEmbeddedModalId'){\r\n <div class='embedded-modal-container'>\r\n <iframe id={{wormholeSelector}} [title]=\"\"></iframe>\r\n </div> \r\n}\r\n<lib-bimplus-scrollable-container>\r\n @for (attachment of _attachments; track attachment; let i = $index) {\r\n <div class=\"attachment-row\">\r\n @if (canDeleteAttachmentLink) {\r\n <span class=\"bim-attachment-delete-button\" (click)=\"deleteAttachmentLink(attachment,$event)\" (keydown)=\"deleteAttachmentLink(attachment,$event)\">\r\n <div\r\n title=\"{{ '_Delete_attachmentlink' | translate }}\"\r\n >\r\n ✕︎\r\n </div>\r\n </span>\r\n }\r\n <a class=\"bim-attachmentlink-item\" href={{attachment.link}} target='_blank' rel='noopener noreferrer'>\r\n <div class=\"bim-attachment-name\" title={{attachment.fileName}}>\r\n {{attachment.name ? attachment.name : attachment.fileName}}\r\n </div>\r\n <div class=\"bim-attachment-size\" title={{attachment.name}}>\r\n ({{attachment.size}} kB)\r\n </div>\r\n </a>\r\n </div>\r\n }\r\n @if (_attachments.length === 0) {\r\n <div class=\"bim-attachment-not-found\">\r\n {{ '_No attachments found' | translate }}\r\n </div>\r\n }\r\n</lib-bimplus-scrollable-container>\r\n\r\n", styles: [".text-selected{color:var(--text-highlight-text-color-enabled)}.ui-icon22px{width:2.2rem;height:2.2rem;display:inline-block;float:right;border-radius:.4rem;background-position:center center;background-repeat:no-repeat;cursor:pointer}.ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat}.touch-ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat;width:3.2rem;height:3.2rem}.ui-icon-sidemenu-important{width:2.4rem!important;height:2.4rem!important;background-size:1.8rem 1.8rem!important;background-position:center center;background-repeat:no-repeat}lib-bimplus-buttons-row{flex:0;--button-row-margin-right: .8rem}.attachment-row{margin-left:.8rem;margin-right:.8rem;border-bottom:solid .1rem var(--details-controls-attachment-item-border-color)}.bim-attachment-delete-button{color:var(--details-controls-attachment-delete-button-text-color);float:right;margin-left:auto;cursor:pointer;margin-top:.2rem}.bim-attachment-delete-button:hover{color:var(--ui-text-1-color)}.bim-attachment-delete-button div{width:3.2rem;text-align:center}a.bim-attachmentlink-item,a.bim-attachmentlink-item:hover,a.bim-attachmentlink-item:visited{color:var(--dark-gray-color)}.bim-attachment-item,.bim-attachmentlink-item{display:flex;cursor:pointer;line-height:2.5rem;padding-left:2.6rem;background-repeat:no-repeat;background-position:.8rem center;background-image:url(data:image/png;base64,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);text-decoration:none!important}.bim-attachment-item .bim-attachment-name,.bim-attachmentlink-item .bim-attachment-name{padding-left:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bim-attachment-item .bim-attachment-extension,.bim-attachmentlink-item .bim-attachment-extension{white-space:nowrap}.bim-attachment-item .bim-attachment-size,.bim-attachmentlink-item .bim-attachment-size{padding-left:.5rem;white-space:nowrap;margin-right:.4rem}.bim-attachment-not-found{padding:2.5rem .5rem;color:var(--details-controls-details-not-found-text-color);text-align:center}.embedded-modal-container{display:none;box-sizing:content-box;position:fixed;inset:0;background-color:var(--portal-modal-background-color-overlay);padding:6% 9%}.embedded-modal-container iframe{width:100%;height:100%;outline:0;border:0;-webkit-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);-moz-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color)}\n"] }]
|
|
322
|
-
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.DialogService }, { type: i0.Renderer2 }, { type: i0.ElementRef }], propDecorators: { api: [{
|
|
323
|
-
type: Input
|
|
324
|
-
}], canCreateAttachmentLink: [{
|
|
325
|
-
type: Input
|
|
326
|
-
}], canDeleteAttachmentLink: [{
|
|
327
|
-
type: Input
|
|
328
|
-
}], project: [{
|
|
329
|
-
type: Input
|
|
330
|
-
}], wormholeSelector: [{
|
|
331
|
-
type: Input
|
|
332
|
-
}], env: [{
|
|
333
|
-
type: Input
|
|
334
|
-
}], rootObjectId: [{
|
|
335
|
-
type: Input
|
|
336
|
-
}] } });
|
|
337
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua3MtdG8tZG9jdW1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1iaW1wbHVzLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2xpbmtzLXRvLWRvY3VtZW50cy9saW5rcy10by1kb2N1bWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvbGlua3MtdG8tZG9jdW1lbnRzL2xpbmtzLXRvLWRvY3VtZW50cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUcsU0FBUyxFQUFJLGlCQUFpQixFQUFJLEtBQUssRUFBNkMsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDakgsT0FBTyxFQUFFLGVBQWUsRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RSxPQUFPLEVBQUcsSUFBSSxFQUFJLGVBQWUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSx3RUFBd0UsQ0FBQTtBQUc1SCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUVsRyxPQUFPLEVBQ0wsb0NBQW9DLEVBQ3JDLE1BQU0sNEVBQTRFLENBQUM7QUFFcEYsT0FBTyxLQUFLLFNBQVMsTUFBTSxtQkFBbUIsQ0FBQzs7OztBQUUvQyxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxNQUFNLENBQUM7QUFjdkQsTUFBTSxPQUFPLHlCQUEwQixTQUFRLCtCQUErQjtJQUU1RSxZQUFZLGdCQUFtQyxFQUNuQixhQUE0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LE1BQStCO1FBQzNDLElBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFDLENBQUM7WUFDWixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDdEIsSUFBRyxNQUFNLENBQUMsRUFBRSxJQUFJLGVBQWUsRUFBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQzsrR0FwVlUseUJBQXlCO21HQUF6Qix5QkFBeUIsNlVDL0J0QyxxL0NBd0NBLCswTkRqQkssZUFBZSw0RkFDZixtQ0FBbUMsNkVBQ25DLDBCQUEwQjs7NEZBTWxCLHlCQUF5QjtrQkFackMsU0FBUzsrQkFDRSx3QkFBd0IsY0FDdEIsSUFBSSxXQUNQO3dCQUNOLGVBQWU7d0JBQ2YsbUNBQW1DO3dCQUNuQywwQkFBMEI7cUJBQzVCLGlCQUdjLGlCQUFpQixDQUFDLFNBQVM7a0tBb0JqQyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFHRixZQUFZO3NCQURmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyAgQ29tcG9uZW50ICAsIFZpZXdFbmNhcHN1bGF0aW9uICAsIElucHV0ICAsIE9uSW5pdCwgUmVuZGVyZXIyLCBFbGVtZW50UmVmLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCaW1wbHVzTG9jYWxpemVkV2lkZ2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vYmltcGx1cy1sb2NhbGl6ZWQtd2lkZ2V0L2JpbXBsdXMtbG9jYWxpemVkLXdpZGdldC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0ICogYXMgV2ViU2RrIGZyb20gJ2JpbXBsdXMtd2Vic2RrJztcclxuaW1wb3J0IHsgIGZyb20gICwgQmVoYXZpb3JTdWJqZWN0LCBzd2l0Y2hNYXAsIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNvbmNhdE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQmltcGx1c1Njcm9sbGFibGVDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuLi9iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyL2JpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXIuY29tcG9uZW50J1xyXG5pbXBvcnQgeyBBdHRhY2htZW50TGlua0l0ZW19IGZyb20gXCIuL2xpbmtzLXRvLWRvY3VtZW50cy5jb21wb25lbnQuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IFByb2plY3ROYXZpZ2F0b3JQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC1tb2RlbHMvcHJvamVjdC1tb2RlbHMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgQmltcGx1c0J1dHRvbnNSb3dDb21wb25lbnQgfSBmcm9tIFwiLi4vYmltcGx1cy1idXR0b25zLXJvdy9iaW1wbHVzLWJ1dHRvbnMtcm93LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBCaW1wbHVzQnV0dG9uQ2xpY2tFdmVudCwgQmltcGx1c0J1dHRvblJvd0l0ZW0gfSBmcm9tICcuLi9iaW1wbHVzLWJ1dHRvbnMtcm93L2JpbXBsdXMtYnV0dG9ucy1yb3cuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBCaW1wbHVzT3ZlcmxheURpYWxvZ0NvbmZpcm1Db21wb25lbnRcclxufSBmcm9tIFwiLi4vYmltcGx1cy1vdmVybGF5LWRpYWxvZy1jb25maXJtL2JpbXBsdXMtb3ZlcmxheS1kaWFsb2ctY29uZmlybS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtEaWFsb2dTZXJ2aWNlfSBmcm9tIFwiLi4vYmltcGx1cy1nZW5lcmFsLW92ZXJsYXktZGlhbG9nL2JpbXBsdXMtZ2VuZXJhbC1vdmVybGF5LWRpYWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCAqIGFzIFdlYkNsaWVudCBmcm9tICdiaW1wbHVzLXdlYmNsaWVudCc7XHJcblxyXG5leHBvcnQgY29uc3QgRU1CRURERURfTU9EQUxfRElBTE9HRV9UWVBFX0ZJTEUgPSAnZmlsZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1saW5rcy10by1kb2N1bWVudHMnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgICBCaW1wbHVzU2Nyb2xsYWJsZUNvbnRhaW5lckNvbXBvbmVudCxcclxuICAgICBCaW1wbHVzQnV0dG9uc1Jvd0NvbXBvbmVudCAgICAgXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vbGlua3MtdG8tZG9jdW1lbnRzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9saW5rcy10by1kb2N1bWVudHMuY29tcG9uZW50Lmxlc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5TaGFkb3dEb21cclxufSlcclxuZXhwb3J0IGNsYXNzIExpbmtzVG9Eb2N1bWVudHNDb21wb25lbnQgZXh0ZW5kcyBCaW1wbHVzTG9jYWxpemVkV2lkZ2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih0cmFuc2xhdGVTZXJ2aWNlOiAgVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICAgICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcclxuICApIHtcclxuICAgIHN1cGVyKHRyYW5zbGF0ZVNlcnZpY2UpXHJcbiAgICB0aGlzLnNoYWRvd1Jvb3RFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNoYWRvd1Jvb3Q7XHJcblxyXG4gIH1cclxuICBwcml2YXRlIHNoYWRvd1Jvb3RFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIF9yb290T2JqZWN0SWQgOiBzdHJpbmcgPSBcIlwiO1xyXG4gIGlzRGVzdHJveWVkID0gZmFsc2U7XHJcbiAgbG9jYWxXb3JtSG9sZTpib29sZWFuICA9IHRydWU7XHJcbiAgICAvL1doZW4gaXMgdHJ1ZSB0aGVuIGl0IG1lYW5zIHRoZSBjcmVhdGlvbiBvZiBsaW5rIGlzIGluIHByb2dyZXNzXHJcbiAgaW5Qcm9ncmVzczpib29sZWFuPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgYXBpIDogV2ViU2RrLkFwaSB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGNhbkNyZWF0ZUF0dGFjaG1lbnRMaW5rOmJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGNhbkRlbGV0ZUF0dGFjaG1lbnRMaW5rOmJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHByb2plY3QgOiBQcm9qZWN0TmF2aWdhdG9yUHJvamVjdCB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIHdvcm1ob2xlU2VsZWN0b3IgOiBzdHJpbmcgfCB1bmRlZmluZWQ9IFwibG9jYWxFbWJlZGRlZE1vZGFsSWRcIjsgIC8vIGNhbGxpbmcgYXBwbGljYXRpb24gY2FuIHByb3ZpZGUgYSBwbGFjZSB3aGVyZSB0aGUgaWZyYW1lIGZvciBkb2N1bWVudHMgc2VsZWN0aW9uIHdpbGwgYmUgcmVuZGVyZWRcclxuICBASW5wdXQoKSBlbnYgOiBzdHJpbmcgPSAnZGV2JztcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgcm9vdE9iamVjdElkKGlkIDogc3RyaW5nKXtcclxuICAgIHRoaXMuX2N1cnJlbnRPYmplY3RJZCQubmV4dChpZCk7XHJcbiAgICB0aGlzLl9yb290T2JqZWN0SWQgPSBpZDtcclxuICB9XHJcblxyXG4gIGdldCByb290T2JqZWN0SWQoKSA6IHN0cmluZ3tcclxuICAgIHJldHVybiB0aGlzLl9yb290T2JqZWN0SWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9jdXJyZW50T2JqZWN0SWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+IChcIlwiKTtcclxuICBfYXR0YWNobWVudENvdW50IDogbnVtYmVyID0gMDtcclxuICBfYXR0YWNobWVudHMgOiBBdHRhY2htZW50TGlua0l0ZW1bXSA9IFtdO1xyXG4gIGJ1dHRvblJvd0l0ZW1zOiBBcnJheTxCaW1wbHVzQnV0dG9uUm93SXRlbT4gPSBbXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcImFkZC1kb2N1bWVudHNcIlxyXG4gICAgICAsIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0FkZF9kb2N1bWVudCcpXHJcbiAgICAgICwgdG9vbHRpcDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ19BZGRfZG9jdW1lbnQnKVxyXG4gICAgICAsIGRpc2FibGVkOiAhdGhpcy5jYW5DcmVhdGVBdHRhY2htZW50TGlua1xyXG4gICAgICAsIGJ1dHRvblN0eWxlOiAncHJpbWFyeSdcclxuICAgIH1cclxuICBdO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRPYmplY3RJZCQuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGlkKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlQXR0YWNobWVudExpbmtTdHJ1Y3R1cmUoaWQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9O1xyXG4gIFxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBmbXQoc3RyaW5nOiBzdHJpbmcsIC4uLmZvcm1hdHM6IHVua25vd25bXSk6IHN0cmluZyB7XHJcbiAgICBsZXQgaW5kZXggPSAwO1xyXG5cclxuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvJUAoXFxkKyk/L2csIChtYXRjaDogc3RyaW5nLCBhcmd1bWVudEluZGV4OiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgYXJndW1lbnRJbmRleE4gPSBhcmd1bWVudEluZGV4ID8gcGFyc2VJbnQoYXJndW1lbnRJbmRleCwgMTApIC0gMSA6IGluZGV4Kys7XHJcbiAgICAgIGNvbnN0IF9tYXRjaCA9IGZvcm1hdHNbYXJndW1lbnRJbmRleE5dO1xyXG5cclxuICAgICAgaWYgKF9tYXRjaCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiAnKG51bGwpJztcclxuICAgICAgfVxyXG4gICAgICBpZiAoX21hdGNoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIF9tYXRjaC50b1N0cmluZygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKiBkZWNvcmF0ZSBsaW5rXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIF9kZWNvcmF0ZUxpbmsoYXBpOldlYlNkay5BcGksbGluazpXZWJTZGsuQXR0YWNobWVudExpbmspOkF0dGFjaG1lbnRMaW5rSXRlbXtcclxuXHJcbiAgICBjb25zdCByZXR2YWw6QXR0YWNobWVudExpbmtJdGVtID0ge1xyXG4gICAgICBpZDogbGluay5pZCxcclxuICAgICAgbmFtZTogbGluay5uYW1lLFxyXG4gICAgICBmaWxlTmFtZTogbGluay5maWxlTmFtZSxcclxuICAgICAgc2l6ZTogbGluay5zaXplLFxyXG4gICAgICBsaW5rOiBsaW5rLmxpbmssXHJcbiAgICAgIGZpbGVOYW1lU2hvcnQ6ICcnLFxyXG4gICAgICBleHRlbnNpb246ICcnLFxyXG4gICAgICBvYmplY3RJZDogJycsXHJcbiAgICAgIHZlcnNpb246IGxpbmsudmVyc2lvblxyXG4gICAgfTtcclxuICAgIGNvbnN0IGFjY2Vzc190b2tlbiA9IGFwaS5nZXRBY2Nlc3NUb2tlbigpO1xyXG4gICAgY29uc3QgYXR0VmVyc2lvbiA9IFwiYXR0YWNobWVudHMvJUAvdmVyc2lvbnMvJUAvZG93bmxvYWRcIjtcclxuICAgIGNvbnN0IHVybCA9IGFwaS5nZXRBcGlUZWFtVXJsKCkrYXR0VmVyc2lvbjtcclxuICAgIGNvbnN0IGlzRW1iZWRkZWRBbGxwbGFuTW9kZSA9IGZhbHNlO1xyXG4gICAgcmV0dmFsLnNpemUgPSBwYXJzZUZsb2F0KChsaW5rLnNpemUgLyAxMDAwKS50b0ZpeGVkKDIpKTtcclxuICAgIHJldHZhbC5saW5rID0gYCR7dGhpcy5mbXQodXJsLCBsaW5rLmlkLCBsaW5rLnZlcnNpb24pfT9hcGktdG9rZW49JHthY2Nlc3NfdG9rZW59JHsgaXNFbWJlZGRlZEFsbHBsYW5Nb2RlID8gJycgOiAnJm9wZW5JbkJyb3dzZXI9dHJ1ZSd9YDtcclxuICAgIGlmIChsaW5rLmZpbGVOYW1lLmxlbmd0aCA+IDIwKSB7XHJcbiAgICAgIGNvbnN0IGZpbGVQYXJ0cyA9IGxpbmsuZmlsZU5hbWUuc3BsaXQoJy4nKTtcclxuICAgICAgaWYgKGZpbGVQYXJ0cy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgcmV0dmFsLmZpbGVOYW1lU2hvcnQgPSBmaWxlUGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKTtcclxuICAgICAgICByZXR2YWwuZXh0ZW5zaW9uID0gXCIuXCIgKyBmaWxlUGFydHMuc2xpY2UoLTEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHZhbC5maWxlTmFtZVNob3J0ID0gbGluay5maWxlTmFtZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dmFsLmZpbGVOYW1lU2hvcnQgPSBsaW5rLmZpbGVOYW1lO1xyXG4gICAgfVxyXG4gICAgcmV0dmFsLm9iamVjdElkID0gdGhpcy5fY3VycmVudE9iamVjdElkJC52YWx1ZTtcclxuXHJcbiAgICByZXR1cm4gcmV0dmFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWNvcmF0ZUF0dGFjaG1lbnRMaW5rcyhhcGk6V2ViU2RrLkFwaSwgbGlua3M6V2ViU2RrLkF0dGFjaG1lbnRMaW5rc1Jlc3BvbnNlKTpBdHRhY2htZW50TGlua0l0ZW1bXXtcclxuICAgIGNvbnN0IGRlY29yYXRlZExpbmtzID0gbGlua3MubWFwKChsaW5rKSA9PiB0aGlzLl9kZWNvcmF0ZUxpbmsoYXBpLGxpbmspKTtcclxuICAgIGRlY29yYXRlZExpbmtzLnNvcnQoKGEsYikgPT4ge1xyXG4gICAgICBpZihhLmZpbGVOYW1lLnRvTG93ZXJDYXNlKCkgPCBiLmZpbGVOYW1lLnRvTG93ZXJDYXNlKCkgKSByZXR1cm4gLTE7XHJcbiAgICAgIGlmKGEuZmlsZU5hbWUudG9Mb3dlckNhc2UoKSAgPiBiLmZpbGVOYW1lLnRvTG93ZXJDYXNlKCkgKSByZXR1cm4gMTtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBkZWNvcmF0ZWRMaW5rcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZUF0dGFjaG1lbnRMaW5rU3RydWN0dXJlKG9iamVjdElkIDogc3RyaW5nKXtcclxuXHJcbiAgICB0aGlzLl9sb2FkQXR0YWNobWVudExpbmtTdHJ1Y3R1cmUob2JqZWN0SWQpPy5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0IDooc3RydWN0dXJlRGF0YSkgPT4ge1xyXG4gICAgICAgIGlmKHN0cnVjdHVyZURhdGEpe1xyXG4gICAgICAgICAgLy90aGlzLl9hdHRhY2htZW50TGlua1N0cnVjdHVyZSA9IF9hdHRhY2htZW50TGluayBTdHJ1Y3R1cmVCdWlsZGVyLmNyZWF0ZUZyb21SZXNwb25zZShzdHJ1Y3R1cmVEYXRhKTtcclxuICAgICAgICAgIHRoaXMuX2F0dGFjaG1lbnRDb3VudCA9IHN0cnVjdHVyZURhdGE/Lmxlbmd0aDtcclxuICAgICAgICAgIGlmKHRoaXMuYXBpKXtcclxuICAgICAgICAgICAgY29uc3QgcmV0dmFsID0gdGhpcy5kZWNvcmF0ZUF0dGFjaG1lbnRMaW5rcyh0aGlzLmFwaSxzdHJ1Y3R1cmVEYXRhKTtcclxuICAgICAgICAgICAgaWYocmV0dmFsKXtcclxuICAgICAgICAgICAgICB0aGlzLl9hdHRhY2htZW50cyA9IHJldHZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvYWRBdHRhY2htZW50TGlua1N0cnVjdHVyZShvYmplY3RJZCA6IHN0cmluZyl7XHJcbiAgICBpZighdGhpcy5hcGkpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYoIW9iamVjdElkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHJldHVybiBmcm9tKHRoaXMuYXBpLm9iamVjdHMuZ2V0QXR0YWNobWVudExpbmtzKG9iamVjdElkKSk7XHJcbiAgfVxyXG5cclxuICBkb2N1bWVudFNlbGVjdGlvbiA6c3RyaW5nW10gfCBudWxsID0gbnVsbDtcclxuICBpc09wZW5lZDpib29sZWFuID0gZmFsc2U7XHJcbiAgZW1iZWRkZWRNb2RhbENvbnRhaW5lcjpzdHJpbmcgPSAnZW1iZWRkZWQtbW9kYWwnO1xyXG4gIFxyXG4gIC8vIHNob3cgb3IgaGlkZSBlbWJlZGRlZCBtb2RhbFxyXG4gIHNldE1vZGFsVmlzaWJpbGl0eShvcGVuZWQgPSB0cnVlKSB7XHJcbiAgICBpZighdGhpcy53b3JtaG9sZVNlbGVjdG9yKXtcclxuICAgICAgcmV0dXJuOyAgICBcclxuICAgIH1cclxuICAgIGNvbnN0IGVsZW1lbnQgPSAgdGhpcy5sb2NhbFdvcm1Ib2xlID8gdGhpcy5zaGFkb3dSb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgdGhpcy53b3JtaG9sZVNlbGVjdG9yKTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMud29ybWhvbGVTZWxlY3Rvcik7XHJcbiAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5sb2NhbFdvcm1Ib2xlKXtcclxuICAgICAgaWYoZWxlbWVudC5wYXJlbnRFbGVtZW50KXtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQucGFyZW50RWxlbWVudCwnZGlzcGxheScsb3BlbmVkPydibG9jayc6J25vbmUnKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQucGFyZW50RWxlbWVudCwnZGlzcGxheScsb3BlbmVkPydibG9jayc6J25vbmUnKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLy9jb250YWluZXJFbC5mYWRlSW4oXCJmYXN0XCIpIDogY29udGFpbmVyRWwuZmFkZU91dChcImZhc3RcIik7XHJcbiAgICB0aGlzLmlzT3BlbmVkID0gb3BlbmVkO1xyXG4gIH1cclxuXHJcblxyXG4gIGNsb3NlRW1iZWRkZWRNb2RhbEZpbGVTZWxlY3Rpb24oKSB7ICAgIFxyXG4gICAgdGhpcy5zZXRNb2RhbFZpc2liaWxpdHkoZmFsc2UpOyAgICBcclxuICB9XHJcblxyXG4gIF9hZGRMaW5rKGFwaTpXZWJTZGsuQXBpLGlkczpzdHJpbmdbXSl7XHJcbiAgICAvLyBmaWx0ZXIgb3V0IGFscmVhZHkgZXhpc3RpbmcgYXR0YWNobWVudCBsaW5rcyBcclxuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRJRHMgPSBpZHMuZmlsdGVyKCBpdGVtID0+ICF0aGlzLl9hdHRhY2htZW50cy5maW5kKG4gPT4gbi5pZCA9PT0gaXRlbSkgKTtcclxuICAgIGlmKCAhbmV3QXR0YWNobWVudElEcy5sZW5ndGggKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5pblByb2dyZXNzKXtcclxuICAgICAgY29uc29sZS5sb2coJ2luIHByb2dyZXNzJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluUHJvZ3Jlc3MgPSB0cnVlO1xyXG4gICAgbmV3QXR0YWNobWVudElEcy5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnbmV3IGF0dGFjaG1lbnQgaWQ6JyxpZCk7XHJcbiAgICB9KTtcclxuICAgIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBvYnNlcnZhYmxlcyBmb3IgZWFjaCBwb3N0IHJlcXVlc3RcclxuICAgIGNvbnN0IHBvc3RSZXF1ZXN0cyA9IG5ld0F0dGFjaG1lbnRJRHMubWFwKChpZCkgPT4gICAgICAgICAgICBcclxuICAgICAgZnJvbShhcGkub2JqZWN0cy5wb3N0QXR0YWNobWVudExpbmsodGhpcy5fcm9vdE9iamVjdElkLEpTT04uc3RyaW5naWZ5KHsgYXR0YWNobWVudElkOiBpZH0pKSkgICAgICBcclxuICAgICk7XHJcblxyXG4gICAgLy8gVXNlIGZvcmtKb2luIHRvIHdhaXQgZm9yIGFsbCBwb3N0IHJlcXVlc3RzIHRvIGNvbXBsZXRlIGluIHBhcmFsbGVsXHJcbiAgICBmb3JrSm9pbihwb3N0UmVxdWVzdHMpXHJcbiAgICAucGlwZShcclxuICAgICAgLy8gQWZ0ZXIgYWxsIHBvc3RzIGFyZSBjb21wbGV0ZSwgc3dpdGNoIHRvIHRoZSBuZXh0IGNhbGwgdG8gZ2V0IHVwZGF0ZWQgbGlua3NcclxuICAgICAgY29uY2F0TWFwKCgpID0+IGZyb20oYXBpLm9iamVjdHMuZ2V0QXR0YWNobWVudExpbmtzKHRoaXMuX3Jvb3RPYmplY3RJZCkpKVxyXG4gICAgKVxyXG4gICAgLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6ICh1cGRhdGVkQXR0YWNobWVudHMpID0+IHtcclxuICAgICAgICB0aGlzLl9hdHRhY2htZW50cyA9IHRoaXMuZGVjb3JhdGVBdHRhY2htZW50TGlua3MoXHJcbiAgICAgICAgICBhcGksXHJcbiAgICAgICAgICB1cGRhdGVkQXR0YWNobWVudHNcclxuICAgICAgICApOyAvLyBVcGRhdGUgYXR0YWNobWVudHMgaW4gY29tcG9uZW50ICAgXHJcbiAgICAgICAgdGhpcy5pblByb2dyZXNzID0gZmFsc2U7ICAgICBcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYWRkIG9yIHJlbG9hZCBhdHRhY2htZW50czonLCBlcnIpO1xyXG4gICAgICAgIHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlOyAgICAgXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGNyZWF0ZUF0dGFjaG1lbnRMaW5rKGFwaTpXZWJTZGsuQXBpKXtcclxuICAgIHRoaXMubG9jYWxXb3JtSG9sZSA9IHRoaXMud29ybWhvbGVTZWxlY3RvciA9PT0gXCJsb2NhbEVtYmVkZGVkTW9kYWxJZFwiO1xyXG4gICAgY29uc3QgY2FsbGJhY2tGID0gKGRvY0lEczpzdHJpbmdbXSk6dm9pZCA9PiB7XHJcbiAgICAgIGNvbnN0IGlkcyA9ICh0eXBlb2YgZG9jSURzID09PSAnc3RyaW5nJykgPyBbZG9jSURzXSA6IGRvY0lEcztcclxuICAgICAgY29uc3QgZm91bmREb2N1bWVudHMgPSBpZHMgJiYgaWRzLmxlbmd0aCA+IDA7XHJcbiAgICAgIGlmKCF0aGlzLmlzRGVzdHJveWVkKXtcclxuICAgICAgICB0aGlzLmNsb3NlRW1iZWRkZWRNb2RhbEZpbGVTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoZm91bmREb2N1bWVudHMpIHtcclxuICAgICAgICAgIHRoaXMuX2FkZExpbmsoYXBpLGlkcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFja0YgIT09IFwiZnVuY3Rpb25cIiAgfHwgIXRoaXMucHJvamVjdCB8fCAhdGhpcy5hcGkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBpc0xvY2FsaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKFwibG9jYWxob3N0XCIpO1xyXG4gICAgICBsZXQgYWNjZXNzX3Rva2VuIDpzdHJpbmd8bnVsbCB8dW5kZWZpbmVkPSAnJztcclxuICAgICAgaWYgKGlzTG9jYWxob3N0KSB7XHJcbiAgICAgICAgYWNjZXNzX3Rva2VuID0gdGhpcy5hcGk/LmdldEFjY2Vzc1Rva2VuKCk7XHJcbiAgICAgICAgaWYgKCFhY2Nlc3NfdG9rZW4pIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5ld0NsaWVudCA9ICBuZXcgV2ViQ2xpZW50LkV4dGVybmFsQ2xpZW50KCdCSW1wbHVzTkdYQ29tcG9uZW50Q2xpZW50Jyk7XHJcbiAgICAgIG5ld0NsaWVudD8uaW5pdGlhbGl6ZSgpO1xyXG4gICAgICAvLyBNYWtlIGVtYmVkZGVkIHdpbmRvd3MgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgZmVhdHVyZSBicmFuY2ggd2l0aCBiYXNlVXJsIHNldHVwXHJcbiAgICAgIGNvbnN0IG9wdGlvbnM6e2Jhc2VVcmw/OnN0cmluZ30gPSB7fTtcclxuICAgICAgLy8gSW4gY2FzZSBvZiBsb2NhbGhvc3Qgb21taXQgZXhwbGljaXQgc2V0dXAgb2YgYmFzZVVybFxyXG4gICAgICBpZiAoIWlzTG9jYWxob3N0KSB7XHJcbiAgICAgICAgLy8gUmVtb3ZlICcvdmlld2VyLycgZnJvbSB0aGUgZW5kIG9mIHBhdGhuYW1lXHJcbiAgICAgICAgbGV0IGZpbHRlcmVkUGF0aG5hbWUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXFwvdmlld2VyXFwvJC8sICcvJyk7XHJcbiAgICAgICAgLy8gUmVtb3ZlICcvY29ubmV4aXMvJyBmcm9tIHRoZSBlbmQgb2YgcGF0aG5hbWUgaWYgd2UgdXNlIHRlbXBvcmFyeSB1cmwgZm9yIGNvbm5leGlzIGxpa2UgIGh0dHBzOi8vcG9ydGFsLWRldi5iaW1wbHVzLm5ldC9jb25uZXhpcy8/ZW1iZWRkZWQuLi5cclxuICAgICAgICBmaWx0ZXJlZFBhdGhuYW1lID0gZmlsdGVyZWRQYXRobmFtZS5yZXBsYWNlKC9cXC9jb25uZXhpc1xcLyQvLCAnLycpO1xyXG4gICAgICAgIG9wdGlvbnMuYmFzZVVybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBmaWx0ZXJlZFBhdGhuYW1lO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLy9jb25zdCBlbnY6c3RyaW5nPVwiZGV2XCI7ICAvLy8hISEgdG8tZG8gaW50cm9kdWNlIGVudiB2YXJpYWJsZSBpbnRvIGNvbXBvbmVudHNcclxuICAgICAgY29uc3QgY2xpZW50TW9kdWxlID0gV2ViQ2xpZW50LkJpbUZpbGVzU2VsZWN0O1xyXG4gICAgICBpZih0aGlzLndvcm1ob2xlU2VsZWN0b3Ipe1xyXG4gICAgICAgIGNvbnN0IGRvY3VtZW50U2VsZWN0aW9uID0gbmV3IGNsaWVudE1vZHVsZSh0aGlzLndvcm1ob2xlU2VsZWN0b3IsIGFjY2Vzc190b2tlbiwgbmV3Q2xpZW50LCB0aGlzLmVudiwgb3B0aW9ucyk7XHJcbiAgICAgICAgaWYgKCFkb2N1bWVudFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkb2N1bWVudFNlbGVjdGlvbi5vbkF0dGFjaG1lbnRTZWxlY3RlZCA9IGNhbGxiYWNrRjtcclxuICAgICAgICBcclxuICAgICAgICBpZih0aGlzLnByb2plY3Qpe1xyXG4gICAgICAgICAgaWYodGhpcy5sb2NhbFdvcm1Ib2xlKXtcclxuICAgICAgICAgICAgZG9jdW1lbnRTZWxlY3Rpb24ubG9hZFNoYWRvd1Jvb3QodGhpcy5zaGFkb3dSb290RWxlbWVudCx0aGlzLnByb2plY3QudGVhbVNsdWcgLCB0aGlzLnByb2plY3QuaWQpO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGRvY3VtZW50U2VsZWN0aW9uLmxvYWQodGhpcy5wcm9qZWN0LnRlYW1TbHVnICwgdGhpcy5wcm9qZWN0LmlkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRNb2RhbFZpc2liaWxpdHkodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0sMjAwKTsgIFxyXG5cclxuICB9XHJcblxyXG4gIF9kZWxldGVBdHRhY2htZW50TGluayhhcGk6V2ViU2RrLkFwaSAsaWQ6c3RyaW5nLCRldmVudDpFdmVudCl7XHJcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IG9iamVjdHMgPSBhcGkub2JqZWN0cztcclxuICAgIGNvbnN0IG9iamVjdElkID0gdGhpcy5fY3VycmVudE9iamVjdElkJC52YWx1ZTtcclxuICAgIGZyb20oYXBpLm9iamVjdHMuZGVsZXRlQXR0YWNobWVudExpbmsodGhpcy5yb290T2JqZWN0SWQsaWQpKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gZnJvbShvYmplY3RzLmdldEF0dGFjaG1lbnRMaW5rcyhvYmplY3RJZCkpKVxyXG4gICAgKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAodXBkYXRlZEF0dGFjaG1lbnRzKSA9PiB7XHJcbiAgICAgICAgaWYodGhpcy5hcGkpe1xyXG4gICAgICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSB0aGlzLmRlY29yYXRlQXR0YWNobWVudExpbmtzKHRoaXMuYXBpLHVwZGF0ZWRBdHRhY2htZW50cyk7ICAvLyBVcGRhdGUgYXR0YWNobWVudHMgaW4gY29tcG9uZW50XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWxldGUgb3IgcmVsb2FkIGF0dGFjaG1lbnRzOicsIGVycik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlQXR0YWNobWVudExpbmsoYXR0YWNobWVudDpBdHRhY2htZW50TGlua0l0ZW0sJGV2ZW50OkV2ZW50KXtcclxuICAgIGlmKCF0aGlzLmFwaSl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmKCFhdHRhY2htZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGFwaSAgPSB0aGlzLmFwaTtcclxuICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKEJpbXBsdXNPdmVybGF5RGlhbG9nQ29uZmlybUNvbXBvbmVudCwge1xyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgd2lkdGg6ICc0MDBweCcsIGhlaWdodDogJzIwMHB4JywgcG9zaXRpb246ICdtaWRkbGUnLFxyXG4gICAgICAgIHBvc2l0aW9uT3B0aW9uczoge30sIG92ZXJsYXlDbGlja0VuYWJsZWQ6IGZhbHNlLCBvdmVybGF5VmlzaWJpbGl0eUVuYWJsZWQ6IHRydWUsIGRyYWdnYWJsZTogZmFsc2VcclxuICAgICAgfSwgZGF0YToge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0RlbGV0ZV9hdHRhY2htZW50bGluaycpLFxyXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfQXR0YWNobWVudGxpbmtfZGVsZXRlX2NvbmZpcm1hdGlvbl9tZXNzYWdlJyksXHJcbiAgICAgICAgYWNjZXB0QnV0dG9uTG9jYWxpemVkU3RyaW5nOiBcIl9EZWxldGVcIixcclxuICAgICAgICBhY2NlcHRDYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fZGVsZXRlQXR0YWNobWVudExpbmsoYXBpLGF0dGFjaG1lbnQuaWQsJGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGJ1dHRvbkNsaWNrZWQoJGV2ZW50OiBCaW1wbHVzQnV0dG9uQ2xpY2tFdmVudCl7XHJcbiAgICBpZighdGhpcy5hcGkpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhcGkgID0gdGhpcy5hcGk7XHJcbiAgICBpZigkZXZlbnQuaWQgPT0gXCJhZGQtZG9jdW1lbnRzXCIpe1xyXG4gICAgICB0aGlzLmNyZWF0ZUF0dGFjaG1lbnRMaW5rKGFwaSk7ICAgIFxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJAaWYgKGNhbkNyZWF0ZUF0dGFjaG1lbnRMaW5rKSB7XHJcbiAgPGxpYi1iaW1wbHVzLWJ1dHRvbnMtcm93XHJcbiAgW2l0ZW1zXT1cImJ1dHRvblJvd0l0ZW1zXCJcclxuICAoYnV0dG9uQ2xpY2tlZCk9XCJidXR0b25DbGlja2VkKCRldmVudClcIlxyXG4gIC8+XHJcbn1cclxuQGlmICh3b3JtaG9sZVNlbGVjdG9yID09PSAnbG9jYWxFbWJlZGRlZE1vZGFsSWQnKXtcclxuICA8ZGl2IGNsYXNzPSdlbWJlZGRlZC1tb2RhbC1jb250YWluZXInPlxyXG4gICAgPGlmcmFtZSBpZD17e3dvcm1ob2xlU2VsZWN0b3J9fSBbdGl0bGVdPVwiXCI+PC9pZnJhbWU+XHJcbiAgPC9kaXY+ICBcclxufVxyXG48bGliLWJpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXI+XHJcbiAgQGZvciAoYXR0YWNobWVudCBvZiBfYXR0YWNobWVudHM7IHRyYWNrIGF0dGFjaG1lbnQ7IGxldCAgaSA9ICRpbmRleCkge1xyXG4gICAgPGRpdiBjbGFzcz1cImF0dGFjaG1lbnQtcm93XCI+XHJcbiAgICAgIEBpZiAoY2FuRGVsZXRlQXR0YWNobWVudExpbmspIHtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImJpbS1hdHRhY2htZW50LWRlbGV0ZS1idXR0b25cIiAoY2xpY2spPVwiZGVsZXRlQXR0YWNobWVudExpbmsoYXR0YWNobWVudCwkZXZlbnQpXCIgKGtleWRvd24pPVwiZGVsZXRlQXR0YWNobWVudExpbmsoYXR0YWNobWVudCwkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ19EZWxldGVfYXR0YWNobWVudGxpbmsnIHwgdHJhbnNsYXRlIH19XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgJiMxMDAwNTsmI3hGRTBFO1xyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICB9XHJcbiAgICAgIDxhIGNsYXNzPVwiYmltLWF0dGFjaG1lbnRsaW5rLWl0ZW1cIiBocmVmPXt7YXR0YWNobWVudC5saW5rfX0gdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9vcGVuZXIgbm9yZWZlcnJlcic+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJpbS1hdHRhY2htZW50LW5hbWVcIiB0aXRsZT17e2F0dGFjaG1lbnQuZmlsZU5hbWV9fT5cclxuICAgICAgICAgIHt7YXR0YWNobWVudC5uYW1lID8gYXR0YWNobWVudC5uYW1lIDogYXR0YWNobWVudC5maWxlTmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJpbS1hdHRhY2htZW50LXNpemVcIiB0aXRsZT17e2F0dGFjaG1lbnQubmFtZX19PlxyXG4gICAgICAgICAgKHt7YXR0YWNobWVudC5zaXplfX0ga0IpXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvYT5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuICBAaWYgKF9hdHRhY2htZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgIDxkaXYgY2xhc3M9XCJiaW0tYXR0YWNobWVudC1ub3QtZm91bmRcIj5cclxuICAgICAge3sgJ19ObyBhdHRhY2htZW50cyBmb3VuZCcgfCB0cmFuc2xhdGUgfX1cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuPC9saWItYmltcGx1cy1zY3JvbGxhYmxlLWNvbnRhaW5lcj5cclxuXHJcbiJdfQ==
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { Component, Input, ViewEncapsulation } from '@angular/core';
|
|
2
|
-
import { BimplusButtonsRowComponent } from "../bimplus-buttons-row/bimplus-buttons-row.component";
|
|
3
|
-
import { BimplusLocalizedWidgetComponent } from "../bimplus-localized-widget/bimplus-localized-widget.component";
|
|
4
|
-
import { TranslateModule } from "@ngx-translate/core";
|
|
5
|
-
import { BimplusScrollableContainerComponent } from "../bimplus-scrollable-container/bimplus-scrollable-container.component";
|
|
6
|
-
import { ObjectHyperlinksItemComponent } from "../object-hyperlinks-item/object-hyperlinks-item.component";
|
|
7
|
-
import { BehaviorSubject } from "rxjs";
|
|
8
|
-
import { NgForOf, NgIf } from "@angular/common";
|
|
9
|
-
import { BimplusOverlayDialogConfirmComponent } from "../bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component";
|
|
10
|
-
import { ReactiveFormsModule, Validators } from "@angular/forms";
|
|
11
|
-
import { BimplusInputTextFieldComponent } from "../bimplus-input-text-field/bimplus-input-text-field.component";
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@ngx-translate/core";
|
|
14
|
-
import * as i2 from "../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service";
|
|
15
|
-
import * as i3 from "@angular/forms";
|
|
16
|
-
export class ObjectHyperlinksComponent extends BimplusLocalizedWidgetComponent {
|
|
17
|
-
constructor(translateService, dialogService, formBuilder) {
|
|
18
|
-
super(translateService);
|
|
19
|
-
this.dialogService = dialogService;
|
|
20
|
-
this.formBuilder = formBuilder;
|
|
21
|
-
this.api = null;
|
|
22
|
-
this._currentObjectId$ = new BehaviorSubject("");
|
|
23
|
-
this._currentPropertiesObjectId$ = new BehaviorSubject("");
|
|
24
|
-
this._rootObjectId = "";
|
|
25
|
-
this.buttonRowItems = [];
|
|
26
|
-
this.canCreateHyperlinks = true;
|
|
27
|
-
this.canDeleteHyperlinks = true;
|
|
28
|
-
this.hyperlinks = [];
|
|
29
|
-
this.hyperlinkForm = this.formBuilder.group({
|
|
30
|
-
name: ['', []],
|
|
31
|
-
url: ['',
|
|
32
|
-
[
|
|
33
|
-
Validators.required,
|
|
34
|
-
Validators.pattern(/^[^<>]*$/), // Do not allow < or >
|
|
35
|
-
Validators.pattern(/^(?!\s*$).+/) // Do not allow all empty string, but allow text after spaces
|
|
36
|
-
]
|
|
37
|
-
]
|
|
38
|
-
});
|
|
39
|
-
this.hyperlinkForm.statusChanges.subscribe(status => {
|
|
40
|
-
this.buttonRowItems[0].disabled = status !== 'VALID';
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
set rootObjectId(id) {
|
|
44
|
-
this._currentObjectId$.next(id);
|
|
45
|
-
this.loadHyperlinks(id);
|
|
46
|
-
this._rootObjectId = id;
|
|
47
|
-
}
|
|
48
|
-
get rootObjectId() {
|
|
49
|
-
return this._rootObjectId;
|
|
50
|
-
}
|
|
51
|
-
ngOnInit() {
|
|
52
|
-
this.buttonRowItems.push({
|
|
53
|
-
id: "add-hyperlink",
|
|
54
|
-
title: this.translateService.instant('_Add hyperlink'),
|
|
55
|
-
tooltip: this.translateService.instant('_Add hyperlink'),
|
|
56
|
-
disabled: true,
|
|
57
|
-
buttonStyle: 'primary'
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
buttonRowButtonClicked($event) {
|
|
61
|
-
if ($event.id === "add-hyperlink") {
|
|
62
|
-
if (this.hyperlinkForm.valid) {
|
|
63
|
-
this.addHyperlink(this.hyperlinkForm.value['name'], this.hyperlinkForm.value['url'], this._rootObjectId).then(() => {
|
|
64
|
-
this.loadHyperlinks(this._rootObjectId);
|
|
65
|
-
this.hyperlinkForm.reset();
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
loadHyperlinks(objectId) {
|
|
71
|
-
if (!this.api)
|
|
72
|
-
return;
|
|
73
|
-
this.api.objects.getHyperlinks(objectId).then((response) => {
|
|
74
|
-
this.hyperlinks = response;
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
addHyperlink(name, url, objectId) {
|
|
78
|
-
if (!this.api)
|
|
79
|
-
return Promise.reject(new Error('API not available'));
|
|
80
|
-
let sanitizedUrl = url.trim();
|
|
81
|
-
if (!RegExp(/^http(s?):\/\//).exec(sanitizedUrl)) {
|
|
82
|
-
sanitizedUrl = 'https://' + sanitizedUrl;
|
|
83
|
-
}
|
|
84
|
-
let sanitizedName = name?.trim() ?? '';
|
|
85
|
-
if (sanitizedName === '') {
|
|
86
|
-
sanitizedName = sanitizedUrl;
|
|
87
|
-
}
|
|
88
|
-
const data = JSON.stringify({
|
|
89
|
-
name: sanitizedName,
|
|
90
|
-
url: sanitizedUrl,
|
|
91
|
-
objectId: objectId
|
|
92
|
-
});
|
|
93
|
-
return this.api.objects.postHyperlink(objectId, data);
|
|
94
|
-
}
|
|
95
|
-
onHyperlinkItemDeleteButtonClicked(hyperlink) {
|
|
96
|
-
this.dialogService.open(BimplusOverlayDialogConfirmComponent, {
|
|
97
|
-
options: {
|
|
98
|
-
width: '400px', height: '200px', position: 'middle',
|
|
99
|
-
positionOptions: {}, overlayClickEnabled: false, overlayVisibilityEnabled: true, draggable: false
|
|
100
|
-
}, data: {
|
|
101
|
-
title: this.translateService.instant('_Delete hyperlink'),
|
|
102
|
-
message: this.translateService.instant('_Hyperlink delete confirmation message'),
|
|
103
|
-
acceptButtonLocalizedString: "_Delete",
|
|
104
|
-
acceptCallback: () => {
|
|
105
|
-
this.deleteHyperlink(hyperlink.id);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
deleteHyperlink(id) {
|
|
111
|
-
if (!this.api)
|
|
112
|
-
return;
|
|
113
|
-
this.api.hyperlinks.delete(id).then(() => {
|
|
114
|
-
this.loadHyperlinks(this._rootObjectId);
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: ObjectHyperlinksComponent, deps: [{ token: i1.TranslateService }, { token: i2.DialogService }, { token: i3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
118
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: ObjectHyperlinksComponent, isStandalone: true, selector: "lib-object-hyperlinks", inputs: { api: "api", rootObjectId: "rootObjectId", canCreateHyperlinks: "canCreateHyperlinks", canDeleteHyperlinks: "canDeleteHyperlinks" }, usesInheritance: true, ngImport: i0, template: "@if (canCreateHyperlinks) {\r\n <form [formGroup]=\"hyperlinkForm\" class=\"input-form\">\r\n <div>\r\n <lib-bimplus-input-text-field formControlName=\"name\" placeholder=\"{{ '_Name' | translate }}\"/>\r\n </div>\r\n <div>\r\n <lib-bimplus-input-text-field formControlName=\"url\" placeholder=\"{{ '_URL' | translate }}\"/>\r\n </div>\r\n\r\n <lib-bimplus-buttons-row [items]=\"buttonRowItems\" (buttonClicked)=\"buttonRowButtonClicked($event)\"/>\r\n </form>\r\n}\r\n\r\n<div class=\"list-anchor\">\r\n <div class=\"list\">\r\n <lib-bimplus-scrollable-container>\r\n @if (hyperlinks.length > 0) {\r\n <div style=\"padding-left: 8px\" *ngFor=\"let hyperlink of hyperlinks\">\r\n <lib-object-hyperlinks-item [hyperlink]=\"hyperlink\" [deleteButtonEnabled]=\"canDeleteHyperlinks\"\r\n (deleteButtonClicked)=\"onHyperlinkItemDeleteButtonClicked(hyperlink)\"/>\r\n </div>\r\n } @else {\r\n <div class=\"no-links\">{{ \"_No hyperlinks found\" | translate }}</div>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n</div>\r\n", styles: [":host{height:100%;display:flex;flex-direction:column;flex:1}.list-anchor{position:relative;flex:1}.list{position:absolute;top:0;bottom:0;width:100%}.no-links{padding:2.5rem .5rem;color:var(--details-controls-details-not-found-text-color);text-align:center}.input-form{padding-left:.8rem;padding-right:.8rem;display:flex;flex-direction:column;gap:.2rem}\n"], dependencies: [{ kind: "component", type: BimplusButtonsRowComponent, selector: "lib-bimplus-buttons-row", inputs: ["items"], outputs: ["fileChanged", "buttonClicked"] }, { kind: "component", type: BimplusScrollableContainerComponent, selector: "lib-bimplus-scrollable-container" }, { kind: "component", type: ObjectHyperlinksItemComponent, selector: "lib-object-hyperlinks-item", inputs: ["hyperlink", "deleteButtonEnabled"], outputs: ["deleteButtonClicked"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: BimplusInputTextFieldComponent, selector: "lib-bimplus-input-text-field", inputs: ["placeholder"] }], encapsulation: i0.ViewEncapsulation.ShadowDom }); }
|
|
119
|
-
}
|
|
120
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: ObjectHyperlinksComponent, decorators: [{
|
|
121
|
-
type: Component,
|
|
122
|
-
args: [{ selector: 'lib-object-hyperlinks', standalone: true, imports: [
|
|
123
|
-
BimplusButtonsRowComponent,
|
|
124
|
-
BimplusScrollableContainerComponent,
|
|
125
|
-
ObjectHyperlinksItemComponent,
|
|
126
|
-
NgForOf,
|
|
127
|
-
TranslateModule,
|
|
128
|
-
ReactiveFormsModule,
|
|
129
|
-
NgIf,
|
|
130
|
-
BimplusInputTextFieldComponent
|
|
131
|
-
], encapsulation: ViewEncapsulation.ShadowDom, template: "@if (canCreateHyperlinks) {\r\n <form [formGroup]=\"hyperlinkForm\" class=\"input-form\">\r\n <div>\r\n <lib-bimplus-input-text-field formControlName=\"name\" placeholder=\"{{ '_Name' | translate }}\"/>\r\n </div>\r\n <div>\r\n <lib-bimplus-input-text-field formControlName=\"url\" placeholder=\"{{ '_URL' | translate }}\"/>\r\n </div>\r\n\r\n <lib-bimplus-buttons-row [items]=\"buttonRowItems\" (buttonClicked)=\"buttonRowButtonClicked($event)\"/>\r\n </form>\r\n}\r\n\r\n<div class=\"list-anchor\">\r\n <div class=\"list\">\r\n <lib-bimplus-scrollable-container>\r\n @if (hyperlinks.length > 0) {\r\n <div style=\"padding-left: 8px\" *ngFor=\"let hyperlink of hyperlinks\">\r\n <lib-object-hyperlinks-item [hyperlink]=\"hyperlink\" [deleteButtonEnabled]=\"canDeleteHyperlinks\"\r\n (deleteButtonClicked)=\"onHyperlinkItemDeleteButtonClicked(hyperlink)\"/>\r\n </div>\r\n } @else {\r\n <div class=\"no-links\">{{ \"_No hyperlinks found\" | translate }}</div>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n</div>\r\n", styles: [":host{height:100%;display:flex;flex-direction:column;flex:1}.list-anchor{position:relative;flex:1}.list{position:absolute;top:0;bottom:0;width:100%}.no-links{padding:2.5rem .5rem;color:var(--details-controls-details-not-found-text-color);text-align:center}.input-form{padding-left:.8rem;padding-right:.8rem;display:flex;flex-direction:column;gap:.2rem}\n"] }]
|
|
132
|
-
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.DialogService }, { type: i3.FormBuilder }], propDecorators: { api: [{
|
|
133
|
-
type: Input
|
|
134
|
-
}], rootObjectId: [{
|
|
135
|
-
type: Input
|
|
136
|
-
}], canCreateHyperlinks: [{
|
|
137
|
-
type: Input
|
|
138
|
-
}], canDeleteHyperlinks: [{
|
|
139
|
-
type: Input
|
|
140
|
-
}] } });
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LWh5cGVybGlua3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvb2JqZWN0LWh5cGVybGlua3Mvb2JqZWN0LWh5cGVybGlua3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvb2JqZWN0LWh5cGVybGlua3Mvb2JqZWN0LWh5cGVybGlua3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQVUsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sc0RBQXNELENBQUM7QUFFaEcsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sZ0VBQWdFLENBQUM7QUFDL0csT0FBTyxFQUFDLGVBQWUsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsbUNBQW1DLEVBQ3BDLE1BQU0sd0VBQXdFLENBQUM7QUFDaEYsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sNERBQTRELENBQUM7QUFFekcsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNyQyxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTlDLE9BQU8sRUFDTCxvQ0FBb0MsRUFDckMsTUFBTSw0RUFBNEUsQ0FBQztBQUNwRixPQUFPLEVBQXlCLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZGLE9BQU8sRUFBQyw4QkFBOEIsRUFBQyxNQUFNLGdFQUFnRSxDQUFDOzs7OztBQW1COUcsTUFBTSxPQUFPLHlCQUEw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QkFDZixtQkFBbUI7d0JBQ25CLElBQUk7d0JBQ0osOEJBQThCO3FCQUMvQixpQkFHYyxpQkFBaUIsQ0FBQyxTQUFTOzJJQXdCakMsR0FBRztzQkFBWCxLQUFLO2dCQUdGLFlBQVk7c0JBRGYsS0FBSztnQkFrQkcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7QmltcGx1c0J1dHRvbnNSb3dDb21wb25lbnR9IGZyb20gXCIuLi9iaW1wbHVzLWJ1dHRvbnMtcm93L2JpbXBsdXMtYnV0dG9ucy1yb3cuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7QmltcGx1c0J1dHRvbkNsaWNrRXZlbnQsIEJpbXBsdXNCdXR0b25Sb3dJdGVtfSBmcm9tIFwiLi4vYmltcGx1cy1idXR0b25zLXJvdy9iaW1wbHVzLWJ1dHRvbnMtcm93LmludGVyZmFjZVwiO1xyXG5pbXBvcnQge0JpbXBsdXNMb2NhbGl6ZWRXaWRnZXRDb21wb25lbnR9IGZyb20gXCIuLi9iaW1wbHVzLWxvY2FsaXplZC13aWRnZXQvYmltcGx1cy1sb2NhbGl6ZWQtd2lkZ2V0LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICBCaW1wbHVzU2Nyb2xsYWJsZUNvbnRhaW5lckNvbXBvbmVudFxyXG59IGZyb20gXCIuLi9iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyL2JpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXIuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7T2JqZWN0SHlwZXJsaW5rc0l0ZW1Db21wb25lbnR9IGZyb20gXCIuLi9vYmplY3QtaHlwZXJsaW5rcy1pdGVtL29iamVjdC1oeXBlcmxpbmtzLWl0ZW0uY29tcG9uZW50XCI7XHJcbmltcG9ydCBXZWJTZGsgZnJvbSBcImJpbXBsdXMtd2Vic2RrXCI7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge05nRm9yT2YsIE5nSWZ9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtEaWFsb2dTZXJ2aWNlfSBmcm9tIFwiLi4vYmltcGx1cy1nZW5lcmFsLW92ZXJsYXktZGlhbG9nL2JpbXBsdXMtZ2VuZXJhbC1vdmVybGF5LWRpYWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7XHJcbiAgQmltcGx1c092ZXJsYXlEaWFsb2dDb25maXJtQ29tcG9uZW50XHJcbn0gZnJvbSBcIi4uL2JpbXBsdXMtb3ZlcmxheS1kaWFsb2ctY29uZmlybS9iaW1wbHVzLW92ZXJsYXktZGlhbG9nLWNvbmZpcm0uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7Rm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7QmltcGx1c0lucHV0VGV4dEZpZWxkQ29tcG9uZW50fSBmcm9tIFwiLi4vYmltcGx1cy1pbnB1dC10ZXh0LWZpZWxkL2JpbXBsdXMtaW5wdXQtdGV4dC1maWVsZC5jb21wb25lbnRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLW9iamVjdC1oeXBlcmxpbmtzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIEJpbXBsdXNCdXR0b25zUm93Q29tcG9uZW50LFxyXG4gICAgQmltcGx1c1Njcm9sbGFibGVDb250YWluZXJDb21wb25lbnQsXHJcbiAgICBPYmplY3RIeXBlcmxpbmtzSXRlbUNvbXBvbmVudCxcclxuICAgIE5nRm9yT2YsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTmdJZixcclxuICAgIEJpbXBsdXNJbnB1dFRleHRGaWVsZENvbXBvbmVudFxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL29iamVjdC1oeXBlcmxpbmtzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vb2JqZWN0LWh5cGVybGlua3MuY29tcG9uZW50Lmxlc3MnLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLlNoYWRvd0RvbVxyXG59KVxyXG5leHBvcnQgY2xhc3MgT2JqZWN0SHlwZXJsaW5rc0NvbXBvbmVudCBleHRlbmRzIEJpbXBsdXNMb2NhbGl6ZWRXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGh5cGVybGlua0Zvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgY29uc3RydWN0b3IodHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSwgcHJpdmF0ZSByZWFkb25seSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLCBwcml2YXRlIHJlYWRvbmx5IGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcikge1xyXG4gICAgc3VwZXIodHJhbnNsYXRlU2VydmljZSk7XHJcblxyXG4gICAgdGhpcy5oeXBlcmxpbmtGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIG5hbWU6IFsnJywgW11dLFxyXG4gICAgICB1cmw6IFsnJyxcclxuICAgICAgICBbXHJcbiAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgVmFsaWRhdG9ycy5wYXR0ZXJuKC9eW148Pl0qJC8pLCAvLyBEbyBub3QgYWxsb3cgPCBvciA+XHJcbiAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oL14oPyFcXHMqJCkuKy8pIC8vIERvIG5vdCBhbGxvdyBhbGwgZW1wdHkgc3RyaW5nLCBidXQgYWxsb3cgdGV4dCBhZnRlciBzcGFjZXNcclxuICAgICAgICBdXHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaHlwZXJsaW5rRm9ybS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZShzdGF0dXMgPT4ge1xyXG4gICAgICB0aGlzLmJ1dHRvblJvd0l0ZW1zWzBdLmRpc2FibGVkID0gc3RhdHVzICE9PSAnVkFMSUQnO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBhcGk6IFdlYlNkay5BcGkgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgcm9vdE9iamVjdElkKGlkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRPYmplY3RJZCQubmV4dChpZCk7XHJcbiAgICB0aGlzLmxvYWRIeXBlcmxpbmtzKGlkKTtcclxuXHJcbiAgICB0aGlzLl9yb290T2JqZWN0SWQgPSBpZDtcclxuICB9XHJcblxyXG4gIGdldCByb290T2JqZWN0SWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9yb290T2JqZWN0SWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9jdXJyZW50T2JqZWN0SWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KFwiXCIpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1cnJlbnRQcm9wZXJ0aWVzT2JqZWN0SWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KFwiXCIpO1xyXG4gIHByaXZhdGUgX3Jvb3RPYmplY3RJZDogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgYnV0dG9uUm93SXRlbXM6IEFycmF5PEJpbXBsdXNCdXR0b25Sb3dJdGVtPiA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBjYW5DcmVhdGVIeXBlcmxpbmtzOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBjYW5EZWxldGVIeXBlcmxpbmtzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgaHlwZXJsaW5rczogQXJyYXk8V2ViU2RrLkh5cGVybGluaz4gPSBbXTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmJ1dHRvblJvd0l0ZW1zLnB1c2goXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogXCJhZGQtaHlwZXJsaW5rXCJcclxuICAgICAgICAsIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0FkZCBoeXBlcmxpbmsnKVxyXG4gICAgICAgICwgdG9vbHRpcDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ19BZGQgaHlwZXJsaW5rJylcclxuICAgICAgICAsIGRpc2FibGVkOiB0cnVlXHJcbiAgICAgICAgLCBidXR0b25TdHlsZTogJ3ByaW1hcnknXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBidXR0b25Sb3dCdXR0b25DbGlja2VkKCRldmVudDogQmltcGx1c0J1dHRvbkNsaWNrRXZlbnQpIHtcclxuICAgIGlmICgkZXZlbnQuaWQgPT09IFwiYWRkLWh5cGVybGlua1wiKSB7XHJcbiAgICAgIGlmICh0aGlzLmh5cGVybGlua0Zvcm0udmFsaWQpIHtcclxuICAgICAgICB0aGlzLmFkZEh5cGVybGluayh0aGlzLmh5cGVybGlua0Zvcm0udmFsdWVbJ25hbWUnXSwgdGhpcy5oeXBlcmxpbmtGb3JtLnZhbHVlWyd1cmwnXSwgdGhpcy5fcm9vdE9iamVjdElkKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZEh5cGVybGlua3ModGhpcy5fcm9vdE9iamVjdElkKTtcclxuICAgICAgICAgIHRoaXMuaHlwZXJsaW5rRm9ybS5yZXNldCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRIeXBlcmxpbmtzKG9iamVjdElkOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5hcGkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmFwaS5vYmplY3RzLmdldEh5cGVybGlua3Mob2JqZWN0SWQpLnRoZW4oKHJlc3BvbnNlOiBXZWJTZGsuSHlwZXJsaW5rc1Jlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuaHlwZXJsaW5rcyA9IHJlc3BvbnNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZEh5cGVybGluayhuYW1lOiBzdHJpbmcsIHVybDogc3RyaW5nLCBvYmplY3RJZDogc3RyaW5nKTogUHJvbWlzZTxXZWJTZGsuSHlwZXJsaW5rPiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpKVxyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdBUEkgbm90IGF2YWlsYWJsZScpKTtcclxuXHJcbiAgICBsZXQgc2FuaXRpemVkVXJsOiBzdHJpbmcgPSB1cmwudHJpbSgpO1xyXG5cclxuICAgIGlmICghUmVnRXhwKC9eaHR0cChzPyk6XFwvXFwvLykuZXhlYyhzYW5pdGl6ZWRVcmwpKSB7XHJcbiAgICAgIHNhbml0aXplZFVybCA9ICdodHRwczovLycgKyBzYW5pdGl6ZWRVcmw7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNhbml0aXplZE5hbWUgPSBuYW1lPy50cmltKCkgPz8gJyc7XHJcblxyXG4gICAgaWYgKHNhbml0aXplZE5hbWUgPT09ICcnKSB7XHJcbiAgICAgIHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZWRVcmw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgbmFtZTogc2FuaXRpemVkTmFtZSxcclxuICAgICAgdXJsOiBzYW5pdGl6ZWRVcmwsXHJcbiAgICAgIG9iamVjdElkOiBvYmplY3RJZFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYXBpLm9iamVjdHMucG9zdEh5cGVybGluayhvYmplY3RJZCwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICBvbkh5cGVybGlua0l0ZW1EZWxldGVCdXR0b25DbGlja2VkKGh5cGVybGluazogV2ViU2RrLkh5cGVybGluaykge1xyXG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oQmltcGx1c092ZXJsYXlEaWFsb2dDb25maXJtQ29tcG9uZW50LCB7XHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB3aWR0aDogJzQwMHB4JywgaGVpZ2h0OiAnMjAwcHgnLCBwb3NpdGlvbjogJ21pZGRsZScsXHJcbiAgICAgICAgcG9zaXRpb25PcHRpb25zOiB7fSwgb3ZlcmxheUNsaWNrRW5hYmxlZDogZmFsc2UsIG92ZXJsYXlWaXNpYmlsaXR5RW5hYmxlZDogdHJ1ZSwgZHJhZ2dhYmxlOiBmYWxzZVxyXG4gICAgICB9LCBkYXRhOiB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfRGVsZXRlIGh5cGVybGluaycpLFxyXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfSHlwZXJsaW5rIGRlbGV0ZSBjb25maXJtYXRpb24gbWVzc2FnZScpLFxyXG4gICAgICAgIGFjY2VwdEJ1dHRvbkxvY2FsaXplZFN0cmluZzogXCJfRGVsZXRlXCIsXHJcbiAgICAgICAgYWNjZXB0Q2FsbGJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGVsZXRlSHlwZXJsaW5rKGh5cGVybGluay5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlSHlwZXJsaW5rKGlkOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5hcGkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmFwaS5oeXBlcmxpbmtzLmRlbGV0ZShpZCkudGhlbigoKSA9PiB7XHJcbiAgICAgIHRoaXMubG9hZEh5cGVybGlua3ModGhpcy5fcm9vdE9iamVjdElkKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCJAaWYgKGNhbkNyZWF0ZUh5cGVybGlua3MpIHtcclxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImh5cGVybGlua0Zvcm1cIiBjbGFzcz1cImlucHV0LWZvcm1cIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxsaWItYmltcGx1cy1pbnB1dC10ZXh0LWZpZWxkIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBwbGFjZWhvbGRlcj1cInt7ICdfTmFtZScgfCB0cmFuc2xhdGUgfX1cIi8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxsaWItYmltcGx1cy1pbnB1dC10ZXh0LWZpZWxkIGZvcm1Db250cm9sTmFtZT1cInVybFwiIHBsYWNlaG9sZGVyPVwie3sgJ19VUkwnIHwgdHJhbnNsYXRlIH19XCIvPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGxpYi1iaW1wbHVzLWJ1dHRvbnMtcm93IFtpdGVtc109XCJidXR0b25Sb3dJdGVtc1wiIChidXR0b25DbGlja2VkKT1cImJ1dHRvblJvd0J1dHRvbkNsaWNrZWQoJGV2ZW50KVwiLz5cclxuICA8L2Zvcm0+XHJcbn1cclxuXHJcbjxkaXYgY2xhc3M9XCJsaXN0LWFuY2hvclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJsaXN0XCI+XHJcbiAgICA8bGliLWJpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXI+XHJcbiAgICAgIEBpZiAoaHlwZXJsaW5rcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmctbGVmdDogOHB4XCIgKm5nRm9yPVwibGV0IGh5cGVybGluayBvZiBoeXBlcmxpbmtzXCI+XHJcbiAgICAgICAgICA8bGliLW9iamVjdC1oeXBlcmxpbmtzLWl0ZW0gW2h5cGVybGlua109XCJoeXBlcmxpbmtcIiBbZGVsZXRlQnV0dG9uRW5hYmxlZF09XCJjYW5EZWxldGVIeXBlcmxpbmtzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVsZXRlQnV0dG9uQ2xpY2tlZCk9XCJvbkh5cGVybGlua0l0ZW1EZWxldGVCdXR0b25DbGlja2VkKGh5cGVybGluaylcIi8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJuby1saW5rc1wiPnt7IFwiX05vIGh5cGVybGlua3MgZm91bmRcIiB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L2xpYi1iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|