@tilde-nlp/ngx-translate 7.0.74 → 7.0.76

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.
@@ -346,11 +346,11 @@ export class TldTranslateTextComponent {
346
346
  this.markedSummarizedText = null;
347
347
  }
348
348
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TldTranslateTextComponent, deps: [{ token: i1.TldTranslateTextService }, { token: i2.Clipboard }, { token: i3.AlertService }, { token: i4.TldTranslateConfigService }, { token: i5.TldScrollService }, { token: i4.TldTranslateSystemManagementService }, { token: i6.AudioRecordService }, { token: i6.TldVoiceInputService }, { token: i7.TldTranslateFileService }, { token: i8.LLMService }, { token: i9.KeycloakService }], target: i0.ɵɵFactoryTarget.Component });
349
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: TldTranslateTextComponent, selector: "tld-translate-text", inputs: { filePreviewProgress: "filePreviewProgress" }, outputs: { onFileChange: "onFileChange" }, viewQueries: [{ propertyName: "sourceComponent", first: true, predicate: ["sourceComponent"], descendants: true }, { propertyName: "dictateComponent", first: true, predicate: ["dictate"], descendants: true }], ngImport: i0, template: "<!-- NOTE. tld-source-and-target-wrapper uses multiple content projections, so might seem confusing first, but elements are displayed at their places based on tld-source-and-target-wrapper component\r\nhttps://angular.io/guide/content-projection#multi-slot-content-projection\r\n-->\r\n<tld-source-and-target-wrapper\r\n\t[textToSpeechSourceSettings]=\"textToSpeechSourceSettings\"\r\n\t[clearSourceVisible]=\"source?.length > 0\"\r\n\t(onSourceClear)=\"clearSource()\"\r\n\t[clearDisabled]=\"textareaDisabled\"\r\n\t[clearSourceTooltip]=\"'TLD_TRANSLATE.CLEAR_SOURCE_TOOLTIP'\"\r\n\t[ngClass]=\"{ 'highlight-active': highlight, 'empty-target': isEmptyTarget }\"\r\n>\r\n\t<div sourceMain class=\"source-main\" fxLayout=\"column\">\r\n\t\t<tld-translate-source [textareaDisabled]=\"textareaDisabled\" #sourceComponent fxFlex [sourceParagraphs]=\"sourceParagraphs\"></tld-translate-source>\r\n\t</div>\r\n\t<ng-container dictation *ngIf=\"audioInputVisible()\">\r\n\t\t<tld-dictate\r\n\t\t\t#dictate\r\n\t\t\t[configuration]=\"dictateConfig\"\r\n\t\t\t[ngClass]=\"{ 'full-width': !fileUpload }\"\r\n\t\t\t(isDictating)=\"dictateStartStop($event)\"\r\n\t\t\t(result)=\"dictateResult($event)\"\r\n\t\t\t(partialResult)=\"dictatePartialResult($event)\"\r\n\t\t\t(onError)=\"dictateError($event)\"\r\n\t\t\t[systemId]=\"onlineAsrSystemId()\"\r\n\t\t>\r\n\t\t</tld-dictate>\r\n\t</ng-container>\r\n\r\n\t<button compactUpload mat-icon-button [matTooltip]=\"'TOOLTIPS.UPLOAD' | translate\" [disabled]=\"fileUploadDisabled\" (click)=\"openFileUpload()\">\r\n\t\t<mat-icon [svgIcon]=\"'upload'\"></mat-icon>\r\n\t</button>\r\n\r\n\t<ng-container sourceActions>\r\n\t\t<div fxLayoutAlign=\"start center\" [class.basic-padding]=\"fileUpload\" fxLayoutGap=\"1em\">\r\n\t\t\t<div [class.hidden]=\"!fileUpload\" class=\"file-upload-wrapper\">\r\n\t\t\t\t<lib-file-upload\r\n\t\t\t\t\t(fileChange)=\"fileChange($event)\"\r\n\t\t\t\t\t[accept]=\"allowedFileTypes\"\r\n\t\t\t\t\t[maxSize]=\"maxFileUploadSize\"\r\n\t\t\t\t\t[uploadIconName]=\"uploadIconName\"\r\n\t\t\t\t\t[extendedAcceptList]=\"extendedFileTypes\"\r\n\t\t\t\t\t[multiple]=\"multipleFiles\"\r\n\t\t\t\t\t(errorEvent)=\"fileUploadError($event)\"\r\n\t\t\t\t\t[filePreviewProgress]=\"filePreviewProgress\"\r\n\t\t\t\t\t[disabled]=\"fileUploadDisabled\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"upload-file-text\">\r\n\t\t\t\t\t\t<span class=\"info\">\r\n\t\t\t\t\t\t\t<span [innerHTML]=\"'FILE_UPLOAD.UPLOAD' | translate\" class=\"accent-color\"></span>\r\n\t\t\t\t\t\t\t<span>&nbsp;</span>\r\n\t\t\t\t\t\t\t<span [innerHTML]=\"'FILE_UPLOAD.DRAG_AND_DROP' | translate\" fxHide.lt-sm></span>\r\n\t\t\t\t\t\t\t<span [innerHTML]=\"'FILE_UPLOAD.' + (multipleFiles ? 'FILES' : 'FILE') | translate\" [ngClass.lt-sm]=\"'accent-color'\"></span>\r\n\t\t\t\t\t\t</span>\r\n\r\n\t\t\t\t\t\t<span class=\"file-upload-extensions text-m\">\r\n\t\t\t\t\t\t\t(&nbsp;<span>{{ visibleExtensions }}.</span>&nbsp;\r\n\t\t\t\t\t\t\t<span *ngIf=\"maxSizeMB\" class=\"file-upload-max-size\" [innerHTML]=\"'FILE_UPLOAD.LIMITS_MB' | translate : { maxSizeMB: maxSizeMB }\"></span>&nbsp;)\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</lib-file-upload>\r\n\t\t\t\t<lib-open-extension-dialog *ngIf=\"showExtensionPopup\" [extensions]=\"allowedTypesWithoutDots\"> </lib-open-extension-dialog>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</ng-container>\r\n\r\n\t<div targetMain class=\"target-main\">\r\n\t\t<ng-container *ngIf=\"isEmptyTarget; else translatedTextBlock\">\r\n\t\t\t<p *ngIf=\"showTargetPlaceholder\" class=\"description-text target-empty\" [innerHtml]=\"'TLD_TRANSLATE.TARGET_DESCRIPTION' | translate\"></p>\r\n\t\t</ng-container>\r\n\t</div>\r\n\r\n\t<ng-container targetActions>\r\n\t\t<div class=\"tld-translate-target-footer basic-padding\" *ngIf=\"showProgressIndicator\">\r\n\t\t\t<progress-indicator (onClose)=\"closeProgressIndicator()\" *ngIf=\"showProgressIndicator\"></progress-indicator>\r\n\t\t</div>\r\n\t</ng-container>\r\n</tld-source-and-target-wrapper>\r\n\r\n<!-- templates used for else blocks in target container -->\r\n<ng-template #translatedTextBlock>\r\n\t<div [class.translated-source-overflow]=\"targetWrapperOverflow\" class=\"translated-source\">\r\n\t\t<ng-container *ngIf=\"!urlToTranslate\">\r\n\t\t\t<div class=\"target-wrapper-action-buttons\">\r\n\t\t\t\t<button\r\n\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t*ngIf=\"firstParagraphTranslated\"\r\n\t\t\t\t\tclass=\"tld-copy-translation\"\r\n\t\t\t\t\t(click)=\"copy()\"\r\n\t\t\t\t\t[matTooltip]=\"'TOOLTIPS.COPY' | translate\"\r\n\t\t\t\t\t[attr.aria-describedby]=\"copyMessageId\"\r\n\t\t\t\t\t[attr.Id]=\"copyButtonId\"\r\n\t\t\t\t\t(keydown.Tab)=\"switchFocusFromCopy($event)\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"material-icons\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.COPY' | translate\"> content_copy </span>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t\t<button\r\n\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t*ngIf=\"firstParagraphTranslated || translationError\"\r\n\t\t\t\t\tclass=\"tld-refresh-translation\"\r\n\t\t\t\t\t[matTooltip]=\"'TOOLTIPS.REFRESH' | translate\"\r\n\t\t\t\t\t(click)=\"refresh()\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"material-icons\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.REFRESH' | translate\"> refresh </span>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t\t<div [matTooltip]=\"'TLD_TRANSLATE.REPHRASE.TOOLTIP' | translate\">\r\n\t\t\t\t\t@if (isLlmEnabled && firstParagraphTranslated) {\r\n\t\t\t\t\t<lib-new-feature-dialog-wrapper\r\n\t\t\t\t\t\t#rephraseFeature\r\n\t\t\t\t\t\t[titleLocalizationKey]=\"'TLD_TRANSLATE.REPHRASE.NEW_FEATURE.TITLE'\"\r\n\t\t\t\t\t\t[descriptionLocalizationKey]=\"'TLD_TRANSLATE.REPHRASE.NEW_FEATURE.DESCRIPTION'\"\r\n\t\t\t\t\t\t[closeLocalizationKey]=\"'TLD_TRANSLATE.REPHRASE.NEW_FEATURE.CLOSE'\"\r\n\t\t\t\t\t\t[featureClassName]=\"'tld-rephrase'\"\r\n\t\t\t\t\t\t[featureLocalStorageKey]=\"rephraseFeatureLocalStorageKey\"\r\n\t\t\t\t\t\t[timeout]=\"1000\"\r\n\t\t\t\t\t\t[maxWidth]=\"isMobile ? 320 : 400\"\r\n\t\t\t\t\t></lib-new-feature-dialog-wrapper>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t\t\tclass=\"tld-rephrase\"\r\n\t\t\t\t\t\t\t[class.rephrase-feature-active]=\"rephraseFeature?.featureActive()\"\r\n\t\t\t\t\t\t\t[disabled]=\"isTranslating || isSummarazing\"\r\n\t\t\t\t\t\t\t(click)=\"showRephraseOptions()\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<mat-icon [svgIcon]=\"'rephrase'\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.REPHRASE' | translate\"></mat-icon>\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div [matTooltip]=\"(isTextSummarizable ? 'TOOLTIPS.CREATE_SUMMARY' : 'TLD_TRANSLATE.SUMMARY.DISABLED') | translate\">\r\n\t\t\t\t\t@if (isLlmEnabled && firstParagraphTranslated) {\r\n\t\t\t\t\t<lib-new-feature-dialog-wrapper\r\n\t\t\t\t\t\t#summarizeFeature\r\n\t\t\t\t\t\t[titleLocalizationKey]=\"'TLD_TRANSLATE.SUMMARY.NEW_FEATURE.TITLE'\"\r\n\t\t\t\t\t\t[descriptionLocalizationKey]=\"'TLD_TRANSLATE.SUMMARY.NEW_FEATURE.DESCRIPTION'\"\r\n\t\t\t\t\t\t[closeLocalizationKey]=\"'TLD_TRANSLATE.SUMMARY.NEW_FEATURE.CLOSE'\"\r\n\t\t\t\t\t\t[featureClassName]=\"'tld-create-summary'\"\r\n\t\t\t\t\t\t[featureLocalStorageKey]=\"summarizeFeatureLocalStorageKey\"\r\n\t\t\t\t\t\t[timeout]=\"1000\"\r\n\t\t\t\t\t></lib-new-feature-dialog-wrapper>\r\n\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t\tclass=\"tld-create-summary\"\r\n\t\t\t\t\t\t[class.summarize-feature-active]=\"summarizeFeature?.featureActive()\"\r\n\t\t\t\t\t\t[disabled]=\"isTranslating || isSummarazing || !isTextSummarizable\"\r\n\t\t\t\t\t\t(click)=\"createSummary()\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<mat-icon [svgIcon]=\"'summarize'\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.CREATE_SUMMARY' | translate\"></mat-icon>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\t\t\t\t<tld-text-to-speech *ngIf=\"textToSpeechTargetSettings && firstParagraphTranslated\" [settings]=\"textToSpeechTargetSettings\"> </tld-text-to-speech>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class=\"highlight-tree-wrapper\">\r\n\t\t\t\t<tld-highlight-tree *ngFor=\"let paragraph of targetParagraphs\" [highlight]=\"highlight\" [tree]=\"paragraph\"> </tld-highlight-tree>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div *ngIf=\"isSummarazing || summarizedText\" class=\"summary-wrapper\">\r\n\t\t\t\t<p class=\"summary-title\">{{ \"TLD_TRANSLATE.SUMMARY.TITLE\" | translate }}</p>\r\n\r\n\t\t\t\t<p *ngIf=\"isSummarazing\" class=\"creating-progress\">{{ \"TLD_TRANSLATE.SUMMARY.CREATING\" | translate }}<span class=\"dot-loading\">...</span></p>\r\n\r\n\t\t\t\t<p [innerHTML]=\"markedSummarizedText\"></p>\r\n\r\n\t\t\t\t<button\r\n\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t*ngIf=\"summarizedText\"\r\n\t\t\t\t\t[ngClass.lt-sm]=\"'summary-mobile'\"\r\n\t\t\t\t\tclass=\"summary-copy-btn\"\r\n\t\t\t\t\t(click)=\"copySummarizedText()\"\r\n\t\t\t\t\t[matTooltip]=\"'TOOLTIPS.COPY' | translate\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"material-icons\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.COPY' | translate\"> content_copy </span>\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div *ngIf=\"isRephraseActive\" class=\"rephrase-wrapper\">\r\n\t\t\t\t<tld-rephrase [text]=\"translatedText\" [disabled]=\"isTranslating\" [language]=\"targetLanguage\"></tld-rephrase>\r\n\t\t\t</div>\t\r\n\r\n\t\t\t<div *ngIf=\"firstParagraphTranslated && dictionaryEntry\" class=\"dictionary-wrapper\">\r\n\t\t\t\t<tld-dictionary [dictionary]=\"dictionaryEntry\"></tld-dictionary>\r\n\t\t\t</div>\r\n\t\t</ng-container>\r\n\r\n\t\t<div *ngIf=\"urlToTranslate\" class=\"target-url-container\">\r\n\t\t\t<a [attr.href]=\"translateUrlRedirect\" target=\"_blank\" fxLayoutAlign=\"start center\" class=\"go-to-webtranslate\">\r\n\t\t\t\t{{ urlToTranslate }}\r\n\t\t\t\t<span class=\"material-icons\" color=\"accent\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.OPEN_IN_NEW'\"> open_in_new </span>\r\n\t\t\t</a>\r\n\t\t</div>\r\n\t</div>\r\n</ng-template>\r\n", styles: [".hidden{display:none}.go-to-webtranslate{word-break:break-all;display:inline}.basic-padding,.target-empty,.target-translated-text{padding:18px}.source-container{border-right:1px solid #cbd2d9;padding:0;overflow:auto}.target-description{margin-top:0}.translated-source,.highlight-tree-wrapper{min-height:210px}.translated-source{position:relative;overflow-y:auto;overflow-x:hidden;flex:1 1 0!important;padding:18px 48px 18px 18px!important}.translated-source.selectable-sentence{cursor:pointer}::ng-deep .target-highlight .tld-highlight-container{padding:18px}.target-wrapper-action-buttons{position:absolute;top:3px;right:3px}.target-wrapper-action-buttons .tld-copy-translation,.target-wrapper-action-buttons .tld-refresh-translation,.target-wrapper-action-buttons tld-text-to-speech{display:block}.target-empty,.target-translated-text{margin:0}tld-dictionary{overflow-y:auto;flex:1 1 0!important}.source-main,.target-main{height:100%}.upload-file-text{color:var(--base-40);font-size:14px;display:inline-block;text-align:left}.file-upload-wrapper{width:100%}.file-upload-wrapper .file-upload-extensions{font-weight:400}.file-upload-max-size{white-space:nowrap}.dictionary-wrapper{margin-top:2rem;border-top:1px solid var(--base-70)}.rephrase-wrapper,.summary-wrapper{position:relative;margin-top:8px;padding-top:12px;border-top:1px solid var(--base-70)}.summary-title{font-size:16px;margin-bottom:.5rem;font-weight:600}.creating-progress{color:var(--base-40)}:host ::ng-deep .dot-loading{clip-path:inset(0 100% 0 0);animation:loading 1.5s steps(4) infinite}.summary-copy-btn{position:absolute;right:-45px;top:20px}.summary-mobile{right:-46px}::ng-deep .summarize-feature-active,::ng-deep .rephrase-feature-active{z-index:1001;background-color:#fff}@keyframes loading{to{clip-path:inset(0 -34% 0 0)}}\n"], dependencies: [{ kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i11.SourceAndTargetWrapperComponent, selector: "tld-source-and-target-wrapper", inputs: ["clearSourceVisible", "clearSourceTooltip", "clearDisabled", "textToSpeechSourceSettings"], outputs: ["onSourceClear"] }, { kind: "component", type: i12.TldDictateComponent, selector: "tld-dictate", inputs: ["configuration", "systemId"], outputs: ["result", "partialResult", "isDictating", "onError"] }, { kind: "component", type: i3.OpenExtensionDialogComponent, selector: "lib-open-extension-dialog", inputs: ["extensions"] }, { kind: "component", type: i13.TextToSpeechComponent, selector: "tld-text-to-speech", inputs: ["settings"] }, { kind: "component", type: i3.FileUploadComponent, selector: "lib-file-upload", inputs: ["accept", "useCompactUpload", "maxSize", "multiple", "filePreviewProgress", "allowEmpty", "disabled", "dragZoneLabel", "uploadIconName", "uploadButtonLabel", "openExtensionPopupLabel", "minSupportedFormatCount", "extendedAcceptList"], outputs: ["fileChange", "errorEvent"] }, { kind: "component", type: i14.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i15.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i15.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i15.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i15.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i16.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "directive", type: i16.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i17.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i18.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.NewFeatureDialogWrapperComponent, selector: "lib-new-feature-dialog-wrapper", inputs: ["titleLocalizationKey", "descriptionLocalizationKey", "closeLocalizationKey", "featureClassName", "featureLocalStorageKey", "timeout", "maxWidth"] }, { kind: "component", type: i19.RephraseComponent, selector: "tld-rephrase", inputs: ["text", "language", "disabled"] }, { kind: "component", type: i20.TldTranslateSourceComponent, selector: "tld-translate-source", inputs: ["textareaDisabled", "sourceParagraphs"] }, { kind: "component", type: i21.TldDictionaryComponent, selector: "tld-dictionary", inputs: ["dictionary"] }, { kind: "component", type: i22.HighlightTreeComponent, selector: "tld-highlight-tree", inputs: ["tree", "isSource", "highlight"] }, { kind: "component", type: i23.ProgressIndicatorComponent, selector: "progress-indicator", outputs: ["onClose"] }, { kind: "pipe", type: i24.TranslatePipe, name: "translate" }] });
349
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: TldTranslateTextComponent, selector: "tld-translate-text", inputs: { filePreviewProgress: "filePreviewProgress" }, outputs: { onFileChange: "onFileChange" }, viewQueries: [{ propertyName: "sourceComponent", first: true, predicate: ["sourceComponent"], descendants: true }, { propertyName: "dictateComponent", first: true, predicate: ["dictate"], descendants: true }], ngImport: i0, template: "<!-- NOTE. tld-source-and-target-wrapper uses multiple content projections, so might seem confusing first, but elements are displayed at their places based on tld-source-and-target-wrapper component\r\nhttps://angular.io/guide/content-projection#multi-slot-content-projection\r\n-->\r\n<tld-source-and-target-wrapper\r\n\t[textToSpeechSourceSettings]=\"textToSpeechSourceSettings\"\r\n\t[clearSourceVisible]=\"source?.length > 0\"\r\n\t(onSourceClear)=\"clearSource()\"\r\n\t[clearDisabled]=\"textareaDisabled\"\r\n\t[clearSourceTooltip]=\"'TLD_TRANSLATE.CLEAR_SOURCE_TOOLTIP'\"\r\n\t[ngClass]=\"{ 'highlight-active': highlight, 'empty-target': isEmptyTarget }\"\r\n>\r\n\t<div sourceMain class=\"source-main\" fxLayout=\"column\">\r\n\t\t<tld-translate-source [textareaDisabled]=\"textareaDisabled\" #sourceComponent fxFlex [sourceParagraphs]=\"sourceParagraphs\"></tld-translate-source>\r\n\t</div>\r\n\t<ng-container dictation *ngIf=\"audioInputVisible()\">\r\n\t\t<tld-dictate\r\n\t\t\t#dictate\r\n\t\t\t[configuration]=\"dictateConfig\"\r\n\t\t\t[ngClass]=\"{ 'full-width': !fileUpload }\"\r\n\t\t\t(isDictating)=\"dictateStartStop($event)\"\r\n\t\t\t(result)=\"dictateResult($event)\"\r\n\t\t\t(partialResult)=\"dictatePartialResult($event)\"\r\n\t\t\t(onError)=\"dictateError($event)\"\r\n\t\t\t[systemId]=\"onlineAsrSystemId()\"\r\n\t\t>\r\n\t\t</tld-dictate>\r\n\t</ng-container>\r\n\r\n\t<button compactUpload mat-icon-button [matTooltip]=\"'TOOLTIPS.UPLOAD' | translate\" [disabled]=\"fileUploadDisabled\" (click)=\"openFileUpload()\">\r\n\t\t<mat-icon [svgIcon]=\"'upload'\"></mat-icon>\r\n\t</button>\r\n\r\n\t<ng-container sourceActions>\r\n\t\t<div fxLayoutAlign=\"start center\" [class.basic-padding]=\"fileUpload\" fxLayoutGap=\"1em\">\r\n\t\t\t<div [class.hidden]=\"!fileUpload\" class=\"file-upload-wrapper\">\r\n\t\t\t\t<lib-file-upload\r\n\t\t\t\t\t(fileChange)=\"fileChange($event)\"\r\n\t\t\t\t\t[accept]=\"allowedFileTypes\"\r\n\t\t\t\t\t[maxSize]=\"maxFileUploadSize\"\r\n\t\t\t\t\t[uploadIconName]=\"uploadIconName\"\r\n\t\t\t\t\t[extendedAcceptList]=\"extendedFileTypes\"\r\n\t\t\t\t\t[multiple]=\"multipleFiles\"\r\n\t\t\t\t\t(errorEvent)=\"fileUploadError($event)\"\r\n\t\t\t\t\t[filePreviewProgress]=\"filePreviewProgress\"\r\n\t\t\t\t\t[disabled]=\"fileUploadDisabled\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"upload-file-text\">\r\n\t\t\t\t\t\t<span class=\"info\">\r\n\t\t\t\t\t\t\t<span [innerHTML]=\"'FILE_UPLOAD.UPLOAD' | translate\" class=\"accent-color\"></span>\r\n\t\t\t\t\t\t\t<span>&nbsp;</span>\r\n\t\t\t\t\t\t\t<span [innerHTML]=\"'FILE_UPLOAD.DRAG_AND_DROP' | translate\" fxHide.lt-sm></span>\r\n\t\t\t\t\t\t\t<span [innerHTML]=\"'FILE_UPLOAD.' + (multipleFiles ? 'FILES' : 'FILE') | translate\" [ngClass.lt-sm]=\"'accent-color'\"></span>\r\n\t\t\t\t\t\t</span>\r\n\r\n\t\t\t\t\t\t<span class=\"file-upload-extensions text-m\">\r\n\t\t\t\t\t\t\t(&nbsp;<span>{{ visibleExtensions }}.</span>&nbsp;\r\n\t\t\t\t\t\t\t<span *ngIf=\"maxSizeMB\" class=\"file-upload-max-size\" [innerHTML]=\"'FILE_UPLOAD.LIMITS_MB' | translate : { maxSizeMB: maxSizeMB }\"></span>&nbsp;)\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</lib-file-upload>\r\n\t\t\t\t<lib-open-extension-dialog *ngIf=\"showExtensionPopup\" [extensions]=\"allowedTypesWithoutDots\"> </lib-open-extension-dialog>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</ng-container>\r\n\r\n\t<div targetMain class=\"target-main\">\r\n\t\t<ng-container *ngIf=\"isEmptyTarget; else translatedTextBlock\">\r\n\t\t\t<p *ngIf=\"showTargetPlaceholder\" class=\"description-text target-empty\" [innerHtml]=\"'TLD_TRANSLATE.TARGET_DESCRIPTION' | translate\"></p>\r\n\t\t</ng-container>\r\n\t</div>\r\n\r\n\t<ng-container targetActions>\r\n\t\t<div class=\"tld-translate-target-footer basic-padding\" *ngIf=\"showProgressIndicator\">\r\n\t\t\t<progress-indicator (onClose)=\"closeProgressIndicator()\" *ngIf=\"showProgressIndicator\"></progress-indicator>\r\n\t\t</div>\r\n\t</ng-container>\r\n</tld-source-and-target-wrapper>\r\n\r\n<!-- templates used for else blocks in target container -->\r\n<ng-template #translatedTextBlock>\r\n\t<div [class.translated-source-overflow]=\"targetWrapperOverflow\" class=\"translated-source\">\r\n\t\t<ng-container *ngIf=\"!urlToTranslate\">\r\n\t\t\t<div class=\"target-wrapper-action-buttons\">\r\n\t\t\t\t<button\r\n\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t*ngIf=\"firstParagraphTranslated\"\r\n\t\t\t\t\tclass=\"tld-copy-translation\"\r\n\t\t\t\t\t(click)=\"copy()\"\r\n\t\t\t\t\t[matTooltip]=\"'TOOLTIPS.COPY' | translate\"\r\n\t\t\t\t\t[attr.aria-describedby]=\"copyMessageId\"\r\n\t\t\t\t\t[attr.Id]=\"copyButtonId\"\r\n\t\t\t\t\t(keydown.Tab)=\"switchFocusFromCopy($event)\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"material-icons\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.COPY' | translate\"> content_copy </span>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t\t<button\r\n\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t*ngIf=\"firstParagraphTranslated || translationError\"\r\n\t\t\t\t\tclass=\"tld-refresh-translation\"\r\n\t\t\t\t\t[matTooltip]=\"'TOOLTIPS.REFRESH' | translate\"\r\n\t\t\t\t\t(click)=\"refresh()\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"material-icons\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.REFRESH' | translate\"> refresh </span>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t\t<div [matTooltip]=\"'TLD_TRANSLATE.REPHRASE.TOOLTIP' | translate\">\r\n\t\t\t\t\t@if (isLlmEnabled && firstParagraphTranslated) {\r\n\t\t\t\t\t<lib-new-feature-dialog-wrapper\r\n\t\t\t\t\t\t#rephraseFeature\r\n\t\t\t\t\t\t[titleLocalizationKey]=\"'TLD_TRANSLATE.REPHRASE.NEW_FEATURE.TITLE'\"\r\n\t\t\t\t\t\t[descriptionLocalizationKey]=\"'TLD_TRANSLATE.REPHRASE.NEW_FEATURE.DESCRIPTION'\"\r\n\t\t\t\t\t\t[closeLocalizationKey]=\"'TLD_TRANSLATE.REPHRASE.NEW_FEATURE.CLOSE'\"\r\n\t\t\t\t\t\t[featureClassName]=\"'tld-rephrase'\"\r\n\t\t\t\t\t\t[featureContainerClassName]=\"'target-main'\"\r\n\t\t\t\t\t\t[featureLocalStorageKey]=\"rephraseFeatureLocalStorageKey\"\r\n\t\t\t\t\t\t[timeout]=\"1000\"\r\n\t\t\t\t\t\t[maxWidth]=\"isMobile ? 320 : 400\"\r\n\t\t\t\t\t></lib-new-feature-dialog-wrapper>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t\t\tclass=\"tld-rephrase\"\r\n\t\t\t\t\t\t\t[class.rephrase-feature-active]=\"rephraseFeature?.featureActive()\"\r\n\t\t\t\t\t\t\t[disabled]=\"isTranslating || isSummarazing\"\r\n\t\t\t\t\t\t\t(click)=\"showRephraseOptions()\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<mat-icon [svgIcon]=\"'rephrase'\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.REPHRASE' | translate\"></mat-icon>\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div [matTooltip]=\"(isTextSummarizable ? 'TOOLTIPS.CREATE_SUMMARY' : 'TLD_TRANSLATE.SUMMARY.DISABLED') | translate\">\r\n\t\t\t\t\t@if (isLlmEnabled && firstParagraphTranslated) {\r\n\t\t\t\t\t<lib-new-feature-dialog-wrapper\r\n\t\t\t\t\t\t#summarizeFeature\r\n\t\t\t\t\t\t[titleLocalizationKey]=\"'TLD_TRANSLATE.SUMMARY.NEW_FEATURE.TITLE'\"\r\n\t\t\t\t\t\t[descriptionLocalizationKey]=\"'TLD_TRANSLATE.SUMMARY.NEW_FEATURE.DESCRIPTION'\"\r\n\t\t\t\t\t\t[closeLocalizationKey]=\"'TLD_TRANSLATE.SUMMARY.NEW_FEATURE.CLOSE'\"\r\n\t\t\t\t\t\t[featureClassName]=\"'tld-create-summary'\"\r\n\t\t\t\t\t\t[featureContainerClassName]=\"'target-main'\"\r\n\t\t\t\t\t\t[featureLocalStorageKey]=\"summarizeFeatureLocalStorageKey\"\r\n\t\t\t\t\t\t[timeout]=\"1000\"\r\n\t\t\t\t\t></lib-new-feature-dialog-wrapper>\r\n\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t\tclass=\"tld-create-summary\"\r\n\t\t\t\t\t\t[class.summarize-feature-active]=\"summarizeFeature?.featureActive()\"\r\n\t\t\t\t\t\t[disabled]=\"isTranslating || isSummarazing || !isTextSummarizable\"\r\n\t\t\t\t\t\t(click)=\"createSummary()\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<mat-icon [svgIcon]=\"'summarize'\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.CREATE_SUMMARY' | translate\"></mat-icon>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\t\t\t\t<tld-text-to-speech *ngIf=\"textToSpeechTargetSettings && firstParagraphTranslated\" [settings]=\"textToSpeechTargetSettings\"> </tld-text-to-speech>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class=\"highlight-tree-wrapper\">\r\n\t\t\t\t<tld-highlight-tree *ngFor=\"let paragraph of targetParagraphs\" [highlight]=\"highlight\" [tree]=\"paragraph\"> </tld-highlight-tree>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div *ngIf=\"isSummarazing || summarizedText\" class=\"summary-wrapper\">\r\n\t\t\t\t<p class=\"summary-title\">{{ \"TLD_TRANSLATE.SUMMARY.TITLE\" | translate }}</p>\r\n\r\n\t\t\t\t<p *ngIf=\"isSummarazing\" class=\"creating-progress\">{{ \"TLD_TRANSLATE.SUMMARY.CREATING\" | translate }}<span class=\"dot-loading\">...</span></p>\r\n\r\n\t\t\t\t<p [innerHTML]=\"markedSummarizedText\"></p>\r\n\r\n\t\t\t\t<button\r\n\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t*ngIf=\"summarizedText\"\r\n\t\t\t\t\t[ngClass.lt-sm]=\"'summary-mobile'\"\r\n\t\t\t\t\tclass=\"summary-copy-btn\"\r\n\t\t\t\t\t(click)=\"copySummarizedText()\"\r\n\t\t\t\t\t[matTooltip]=\"'TOOLTIPS.COPY' | translate\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"material-icons\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.COPY' | translate\"> content_copy </span>\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div *ngIf=\"isRephraseActive\" class=\"rephrase-wrapper\">\r\n\t\t\t\t<tld-rephrase [text]=\"translatedText\" [disabled]=\"isTranslating\" [language]=\"targetLanguage\"></tld-rephrase>\r\n\t\t\t</div>\t\r\n\r\n\t\t\t<div *ngIf=\"firstParagraphTranslated && dictionaryEntry\" class=\"dictionary-wrapper\">\r\n\t\t\t\t<tld-dictionary [dictionary]=\"dictionaryEntry\"></tld-dictionary>\r\n\t\t\t</div>\r\n\t\t</ng-container>\r\n\r\n\t\t<div *ngIf=\"urlToTranslate\" class=\"target-url-container\">\r\n\t\t\t<a [attr.href]=\"translateUrlRedirect\" target=\"_blank\" fxLayoutAlign=\"start center\" class=\"go-to-webtranslate\">\r\n\t\t\t\t{{ urlToTranslate }}\r\n\t\t\t\t<span class=\"material-icons\" color=\"accent\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.OPEN_IN_NEW'\"> open_in_new </span>\r\n\t\t\t</a>\r\n\t\t</div>\r\n\t</div>\r\n</ng-template>\r\n", styles: [".hidden{display:none}.go-to-webtranslate{word-break:break-all;display:inline}.basic-padding,.target-empty,.target-translated-text{padding:18px}.source-container{border-right:1px solid #cbd2d9;padding:0;overflow:auto}.target-description{margin-top:0}.translated-source,.highlight-tree-wrapper{min-height:210px}.translated-source{position:relative;overflow-y:auto;overflow-x:hidden;flex:1 1 0!important;padding:18px 48px 18px 18px!important}.translated-source.selectable-sentence{cursor:pointer}::ng-deep .target-highlight .tld-highlight-container{padding:18px}.target-wrapper-action-buttons{position:absolute;top:3px;right:3px}.target-wrapper-action-buttons .tld-copy-translation,.target-wrapper-action-buttons .tld-refresh-translation,.target-wrapper-action-buttons tld-text-to-speech{display:block}.target-empty,.target-translated-text{margin:0}tld-dictionary{overflow-y:auto;flex:1 1 0!important}.source-main,.target-main{height:100%}.upload-file-text{color:var(--base-40);font-size:14px;display:inline-block;text-align:left}.file-upload-wrapper{width:100%}.file-upload-wrapper .file-upload-extensions{font-weight:400}.file-upload-max-size{white-space:nowrap}.dictionary-wrapper{margin-top:2rem;border-top:1px solid var(--base-70)}.rephrase-wrapper,.summary-wrapper{position:relative;margin-top:8px;padding-top:12px;border-top:1px solid var(--base-70)}.summary-title{font-size:16px;margin-bottom:.5rem;font-weight:600}.creating-progress{color:var(--base-40)}:host ::ng-deep .dot-loading{clip-path:inset(0 100% 0 0);animation:loading 1.5s steps(4) infinite}.summary-copy-btn{position:absolute;right:-45px;top:20px}.summary-mobile{right:-46px}::ng-deep .summarize-feature-active,::ng-deep .rephrase-feature-active{z-index:1001;background-color:#fff}@keyframes loading{to{clip-path:inset(0 -34% 0 0)}}\n"], dependencies: [{ kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i11.SourceAndTargetWrapperComponent, selector: "tld-source-and-target-wrapper", inputs: ["clearSourceVisible", "clearSourceTooltip", "clearDisabled", "textToSpeechSourceSettings"], outputs: ["onSourceClear"] }, { kind: "component", type: i12.TldDictateComponent, selector: "tld-dictate", inputs: ["configuration", "systemId"], outputs: ["result", "partialResult", "isDictating", "onError"] }, { kind: "component", type: i3.OpenExtensionDialogComponent, selector: "lib-open-extension-dialog", inputs: ["extensions"] }, { kind: "component", type: i13.TextToSpeechComponent, selector: "tld-text-to-speech", inputs: ["settings"] }, { kind: "component", type: i3.FileUploadComponent, selector: "lib-file-upload", inputs: ["accept", "useCompactUpload", "maxSize", "multiple", "filePreviewProgress", "allowEmpty", "disabled", "dragZoneLabel", "uploadIconName", "uploadButtonLabel", "openExtensionPopupLabel", "minSupportedFormatCount", "extendedAcceptList"], outputs: ["fileChange", "errorEvent"] }, { kind: "component", type: i14.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i15.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i15.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i15.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i15.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i16.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "directive", type: i16.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i17.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i18.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.NewFeatureDialogWrapperComponent, selector: "lib-new-feature-dialog-wrapper", inputs: ["titleLocalizationKey", "descriptionLocalizationKey", "closeLocalizationKey", "featureClassName", "featureContainerClassName", "featureLocalStorageKey", "timeout", "maxWidth"] }, { kind: "component", type: i19.RephraseComponent, selector: "tld-rephrase", inputs: ["text", "language", "disabled"] }, { kind: "component", type: i20.TldTranslateSourceComponent, selector: "tld-translate-source", inputs: ["textareaDisabled", "sourceParagraphs"] }, { kind: "component", type: i21.TldDictionaryComponent, selector: "tld-dictionary", inputs: ["dictionary"] }, { kind: "component", type: i22.HighlightTreeComponent, selector: "tld-highlight-tree", inputs: ["tree", "isSource", "highlight"] }, { kind: "component", type: i23.ProgressIndicatorComponent, selector: "progress-indicator", outputs: ["onClose"] }, { kind: "pipe", type: i24.TranslatePipe, name: "translate" }] });
350
350
  }
351
351
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TldTranslateTextComponent, decorators: [{
352
352
  type: Component,
353
- args: [{ selector: 'tld-translate-text', template: "<!-- NOTE. tld-source-and-target-wrapper uses multiple content projections, so might seem confusing first, but elements are displayed at their places based on tld-source-and-target-wrapper component\r\nhttps://angular.io/guide/content-projection#multi-slot-content-projection\r\n-->\r\n<tld-source-and-target-wrapper\r\n\t[textToSpeechSourceSettings]=\"textToSpeechSourceSettings\"\r\n\t[clearSourceVisible]=\"source?.length > 0\"\r\n\t(onSourceClear)=\"clearSource()\"\r\n\t[clearDisabled]=\"textareaDisabled\"\r\n\t[clearSourceTooltip]=\"'TLD_TRANSLATE.CLEAR_SOURCE_TOOLTIP'\"\r\n\t[ngClass]=\"{ 'highlight-active': highlight, 'empty-target': isEmptyTarget }\"\r\n>\r\n\t<div sourceMain class=\"source-main\" fxLayout=\"column\">\r\n\t\t<tld-translate-source [textareaDisabled]=\"textareaDisabled\" #sourceComponent fxFlex [sourceParagraphs]=\"sourceParagraphs\"></tld-translate-source>\r\n\t</div>\r\n\t<ng-container dictation *ngIf=\"audioInputVisible()\">\r\n\t\t<tld-dictate\r\n\t\t\t#dictate\r\n\t\t\t[configuration]=\"dictateConfig\"\r\n\t\t\t[ngClass]=\"{ 'full-width': !fileUpload }\"\r\n\t\t\t(isDictating)=\"dictateStartStop($event)\"\r\n\t\t\t(result)=\"dictateResult($event)\"\r\n\t\t\t(partialResult)=\"dictatePartialResult($event)\"\r\n\t\t\t(onError)=\"dictateError($event)\"\r\n\t\t\t[systemId]=\"onlineAsrSystemId()\"\r\n\t\t>\r\n\t\t</tld-dictate>\r\n\t</ng-container>\r\n\r\n\t<button compactUpload mat-icon-button [matTooltip]=\"'TOOLTIPS.UPLOAD' | translate\" [disabled]=\"fileUploadDisabled\" (click)=\"openFileUpload()\">\r\n\t\t<mat-icon [svgIcon]=\"'upload'\"></mat-icon>\r\n\t</button>\r\n\r\n\t<ng-container sourceActions>\r\n\t\t<div fxLayoutAlign=\"start center\" [class.basic-padding]=\"fileUpload\" fxLayoutGap=\"1em\">\r\n\t\t\t<div [class.hidden]=\"!fileUpload\" class=\"file-upload-wrapper\">\r\n\t\t\t\t<lib-file-upload\r\n\t\t\t\t\t(fileChange)=\"fileChange($event)\"\r\n\t\t\t\t\t[accept]=\"allowedFileTypes\"\r\n\t\t\t\t\t[maxSize]=\"maxFileUploadSize\"\r\n\t\t\t\t\t[uploadIconName]=\"uploadIconName\"\r\n\t\t\t\t\t[extendedAcceptList]=\"extendedFileTypes\"\r\n\t\t\t\t\t[multiple]=\"multipleFiles\"\r\n\t\t\t\t\t(errorEvent)=\"fileUploadError($event)\"\r\n\t\t\t\t\t[filePreviewProgress]=\"filePreviewProgress\"\r\n\t\t\t\t\t[disabled]=\"fileUploadDisabled\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"upload-file-text\">\r\n\t\t\t\t\t\t<span class=\"info\">\r\n\t\t\t\t\t\t\t<span [innerHTML]=\"'FILE_UPLOAD.UPLOAD' | translate\" class=\"accent-color\"></span>\r\n\t\t\t\t\t\t\t<span>&nbsp;</span>\r\n\t\t\t\t\t\t\t<span [innerHTML]=\"'FILE_UPLOAD.DRAG_AND_DROP' | translate\" fxHide.lt-sm></span>\r\n\t\t\t\t\t\t\t<span [innerHTML]=\"'FILE_UPLOAD.' + (multipleFiles ? 'FILES' : 'FILE') | translate\" [ngClass.lt-sm]=\"'accent-color'\"></span>\r\n\t\t\t\t\t\t</span>\r\n\r\n\t\t\t\t\t\t<span class=\"file-upload-extensions text-m\">\r\n\t\t\t\t\t\t\t(&nbsp;<span>{{ visibleExtensions }}.</span>&nbsp;\r\n\t\t\t\t\t\t\t<span *ngIf=\"maxSizeMB\" class=\"file-upload-max-size\" [innerHTML]=\"'FILE_UPLOAD.LIMITS_MB' | translate : { maxSizeMB: maxSizeMB }\"></span>&nbsp;)\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</lib-file-upload>\r\n\t\t\t\t<lib-open-extension-dialog *ngIf=\"showExtensionPopup\" [extensions]=\"allowedTypesWithoutDots\"> </lib-open-extension-dialog>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</ng-container>\r\n\r\n\t<div targetMain class=\"target-main\">\r\n\t\t<ng-container *ngIf=\"isEmptyTarget; else translatedTextBlock\">\r\n\t\t\t<p *ngIf=\"showTargetPlaceholder\" class=\"description-text target-empty\" [innerHtml]=\"'TLD_TRANSLATE.TARGET_DESCRIPTION' | translate\"></p>\r\n\t\t</ng-container>\r\n\t</div>\r\n\r\n\t<ng-container targetActions>\r\n\t\t<div class=\"tld-translate-target-footer basic-padding\" *ngIf=\"showProgressIndicator\">\r\n\t\t\t<progress-indicator (onClose)=\"closeProgressIndicator()\" *ngIf=\"showProgressIndicator\"></progress-indicator>\r\n\t\t</div>\r\n\t</ng-container>\r\n</tld-source-and-target-wrapper>\r\n\r\n<!-- templates used for else blocks in target container -->\r\n<ng-template #translatedTextBlock>\r\n\t<div [class.translated-source-overflow]=\"targetWrapperOverflow\" class=\"translated-source\">\r\n\t\t<ng-container *ngIf=\"!urlToTranslate\">\r\n\t\t\t<div class=\"target-wrapper-action-buttons\">\r\n\t\t\t\t<button\r\n\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t*ngIf=\"firstParagraphTranslated\"\r\n\t\t\t\t\tclass=\"tld-copy-translation\"\r\n\t\t\t\t\t(click)=\"copy()\"\r\n\t\t\t\t\t[matTooltip]=\"'TOOLTIPS.COPY' | translate\"\r\n\t\t\t\t\t[attr.aria-describedby]=\"copyMessageId\"\r\n\t\t\t\t\t[attr.Id]=\"copyButtonId\"\r\n\t\t\t\t\t(keydown.Tab)=\"switchFocusFromCopy($event)\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"material-icons\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.COPY' | translate\"> content_copy </span>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t\t<button\r\n\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t*ngIf=\"firstParagraphTranslated || translationError\"\r\n\t\t\t\t\tclass=\"tld-refresh-translation\"\r\n\t\t\t\t\t[matTooltip]=\"'TOOLTIPS.REFRESH' | translate\"\r\n\t\t\t\t\t(click)=\"refresh()\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"material-icons\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.REFRESH' | translate\"> refresh </span>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t\t<div [matTooltip]=\"'TLD_TRANSLATE.REPHRASE.TOOLTIP' | translate\">\r\n\t\t\t\t\t@if (isLlmEnabled && firstParagraphTranslated) {\r\n\t\t\t\t\t<lib-new-feature-dialog-wrapper\r\n\t\t\t\t\t\t#rephraseFeature\r\n\t\t\t\t\t\t[titleLocalizationKey]=\"'TLD_TRANSLATE.REPHRASE.NEW_FEATURE.TITLE'\"\r\n\t\t\t\t\t\t[descriptionLocalizationKey]=\"'TLD_TRANSLATE.REPHRASE.NEW_FEATURE.DESCRIPTION'\"\r\n\t\t\t\t\t\t[closeLocalizationKey]=\"'TLD_TRANSLATE.REPHRASE.NEW_FEATURE.CLOSE'\"\r\n\t\t\t\t\t\t[featureClassName]=\"'tld-rephrase'\"\r\n\t\t\t\t\t\t[featureLocalStorageKey]=\"rephraseFeatureLocalStorageKey\"\r\n\t\t\t\t\t\t[timeout]=\"1000\"\r\n\t\t\t\t\t\t[maxWidth]=\"isMobile ? 320 : 400\"\r\n\t\t\t\t\t></lib-new-feature-dialog-wrapper>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t\t\tclass=\"tld-rephrase\"\r\n\t\t\t\t\t\t\t[class.rephrase-feature-active]=\"rephraseFeature?.featureActive()\"\r\n\t\t\t\t\t\t\t[disabled]=\"isTranslating || isSummarazing\"\r\n\t\t\t\t\t\t\t(click)=\"showRephraseOptions()\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<mat-icon [svgIcon]=\"'rephrase'\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.REPHRASE' | translate\"></mat-icon>\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div [matTooltip]=\"(isTextSummarizable ? 'TOOLTIPS.CREATE_SUMMARY' : 'TLD_TRANSLATE.SUMMARY.DISABLED') | translate\">\r\n\t\t\t\t\t@if (isLlmEnabled && firstParagraphTranslated) {\r\n\t\t\t\t\t<lib-new-feature-dialog-wrapper\r\n\t\t\t\t\t\t#summarizeFeature\r\n\t\t\t\t\t\t[titleLocalizationKey]=\"'TLD_TRANSLATE.SUMMARY.NEW_FEATURE.TITLE'\"\r\n\t\t\t\t\t\t[descriptionLocalizationKey]=\"'TLD_TRANSLATE.SUMMARY.NEW_FEATURE.DESCRIPTION'\"\r\n\t\t\t\t\t\t[closeLocalizationKey]=\"'TLD_TRANSLATE.SUMMARY.NEW_FEATURE.CLOSE'\"\r\n\t\t\t\t\t\t[featureClassName]=\"'tld-create-summary'\"\r\n\t\t\t\t\t\t[featureLocalStorageKey]=\"summarizeFeatureLocalStorageKey\"\r\n\t\t\t\t\t\t[timeout]=\"1000\"\r\n\t\t\t\t\t></lib-new-feature-dialog-wrapper>\r\n\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t\tclass=\"tld-create-summary\"\r\n\t\t\t\t\t\t[class.summarize-feature-active]=\"summarizeFeature?.featureActive()\"\r\n\t\t\t\t\t\t[disabled]=\"isTranslating || isSummarazing || !isTextSummarizable\"\r\n\t\t\t\t\t\t(click)=\"createSummary()\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<mat-icon [svgIcon]=\"'summarize'\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.CREATE_SUMMARY' | translate\"></mat-icon>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\t\t\t\t<tld-text-to-speech *ngIf=\"textToSpeechTargetSettings && firstParagraphTranslated\" [settings]=\"textToSpeechTargetSettings\"> </tld-text-to-speech>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class=\"highlight-tree-wrapper\">\r\n\t\t\t\t<tld-highlight-tree *ngFor=\"let paragraph of targetParagraphs\" [highlight]=\"highlight\" [tree]=\"paragraph\"> </tld-highlight-tree>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div *ngIf=\"isSummarazing || summarizedText\" class=\"summary-wrapper\">\r\n\t\t\t\t<p class=\"summary-title\">{{ \"TLD_TRANSLATE.SUMMARY.TITLE\" | translate }}</p>\r\n\r\n\t\t\t\t<p *ngIf=\"isSummarazing\" class=\"creating-progress\">{{ \"TLD_TRANSLATE.SUMMARY.CREATING\" | translate }}<span class=\"dot-loading\">...</span></p>\r\n\r\n\t\t\t\t<p [innerHTML]=\"markedSummarizedText\"></p>\r\n\r\n\t\t\t\t<button\r\n\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t*ngIf=\"summarizedText\"\r\n\t\t\t\t\t[ngClass.lt-sm]=\"'summary-mobile'\"\r\n\t\t\t\t\tclass=\"summary-copy-btn\"\r\n\t\t\t\t\t(click)=\"copySummarizedText()\"\r\n\t\t\t\t\t[matTooltip]=\"'TOOLTIPS.COPY' | translate\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"material-icons\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.COPY' | translate\"> content_copy </span>\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div *ngIf=\"isRephraseActive\" class=\"rephrase-wrapper\">\r\n\t\t\t\t<tld-rephrase [text]=\"translatedText\" [disabled]=\"isTranslating\" [language]=\"targetLanguage\"></tld-rephrase>\r\n\t\t\t</div>\t\r\n\r\n\t\t\t<div *ngIf=\"firstParagraphTranslated && dictionaryEntry\" class=\"dictionary-wrapper\">\r\n\t\t\t\t<tld-dictionary [dictionary]=\"dictionaryEntry\"></tld-dictionary>\r\n\t\t\t</div>\r\n\t\t</ng-container>\r\n\r\n\t\t<div *ngIf=\"urlToTranslate\" class=\"target-url-container\">\r\n\t\t\t<a [attr.href]=\"translateUrlRedirect\" target=\"_blank\" fxLayoutAlign=\"start center\" class=\"go-to-webtranslate\">\r\n\t\t\t\t{{ urlToTranslate }}\r\n\t\t\t\t<span class=\"material-icons\" color=\"accent\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.OPEN_IN_NEW'\"> open_in_new </span>\r\n\t\t\t</a>\r\n\t\t</div>\r\n\t</div>\r\n</ng-template>\r\n", styles: [".hidden{display:none}.go-to-webtranslate{word-break:break-all;display:inline}.basic-padding,.target-empty,.target-translated-text{padding:18px}.source-container{border-right:1px solid #cbd2d9;padding:0;overflow:auto}.target-description{margin-top:0}.translated-source,.highlight-tree-wrapper{min-height:210px}.translated-source{position:relative;overflow-y:auto;overflow-x:hidden;flex:1 1 0!important;padding:18px 48px 18px 18px!important}.translated-source.selectable-sentence{cursor:pointer}::ng-deep .target-highlight .tld-highlight-container{padding:18px}.target-wrapper-action-buttons{position:absolute;top:3px;right:3px}.target-wrapper-action-buttons .tld-copy-translation,.target-wrapper-action-buttons .tld-refresh-translation,.target-wrapper-action-buttons tld-text-to-speech{display:block}.target-empty,.target-translated-text{margin:0}tld-dictionary{overflow-y:auto;flex:1 1 0!important}.source-main,.target-main{height:100%}.upload-file-text{color:var(--base-40);font-size:14px;display:inline-block;text-align:left}.file-upload-wrapper{width:100%}.file-upload-wrapper .file-upload-extensions{font-weight:400}.file-upload-max-size{white-space:nowrap}.dictionary-wrapper{margin-top:2rem;border-top:1px solid var(--base-70)}.rephrase-wrapper,.summary-wrapper{position:relative;margin-top:8px;padding-top:12px;border-top:1px solid var(--base-70)}.summary-title{font-size:16px;margin-bottom:.5rem;font-weight:600}.creating-progress{color:var(--base-40)}:host ::ng-deep .dot-loading{clip-path:inset(0 100% 0 0);animation:loading 1.5s steps(4) infinite}.summary-copy-btn{position:absolute;right:-45px;top:20px}.summary-mobile{right:-46px}::ng-deep .summarize-feature-active,::ng-deep .rephrase-feature-active{z-index:1001;background-color:#fff}@keyframes loading{to{clip-path:inset(0 -34% 0 0)}}\n"] }]
353
+ args: [{ selector: 'tld-translate-text', template: "<!-- NOTE. tld-source-and-target-wrapper uses multiple content projections, so might seem confusing first, but elements are displayed at their places based on tld-source-and-target-wrapper component\r\nhttps://angular.io/guide/content-projection#multi-slot-content-projection\r\n-->\r\n<tld-source-and-target-wrapper\r\n\t[textToSpeechSourceSettings]=\"textToSpeechSourceSettings\"\r\n\t[clearSourceVisible]=\"source?.length > 0\"\r\n\t(onSourceClear)=\"clearSource()\"\r\n\t[clearDisabled]=\"textareaDisabled\"\r\n\t[clearSourceTooltip]=\"'TLD_TRANSLATE.CLEAR_SOURCE_TOOLTIP'\"\r\n\t[ngClass]=\"{ 'highlight-active': highlight, 'empty-target': isEmptyTarget }\"\r\n>\r\n\t<div sourceMain class=\"source-main\" fxLayout=\"column\">\r\n\t\t<tld-translate-source [textareaDisabled]=\"textareaDisabled\" #sourceComponent fxFlex [sourceParagraphs]=\"sourceParagraphs\"></tld-translate-source>\r\n\t</div>\r\n\t<ng-container dictation *ngIf=\"audioInputVisible()\">\r\n\t\t<tld-dictate\r\n\t\t\t#dictate\r\n\t\t\t[configuration]=\"dictateConfig\"\r\n\t\t\t[ngClass]=\"{ 'full-width': !fileUpload }\"\r\n\t\t\t(isDictating)=\"dictateStartStop($event)\"\r\n\t\t\t(result)=\"dictateResult($event)\"\r\n\t\t\t(partialResult)=\"dictatePartialResult($event)\"\r\n\t\t\t(onError)=\"dictateError($event)\"\r\n\t\t\t[systemId]=\"onlineAsrSystemId()\"\r\n\t\t>\r\n\t\t</tld-dictate>\r\n\t</ng-container>\r\n\r\n\t<button compactUpload mat-icon-button [matTooltip]=\"'TOOLTIPS.UPLOAD' | translate\" [disabled]=\"fileUploadDisabled\" (click)=\"openFileUpload()\">\r\n\t\t<mat-icon [svgIcon]=\"'upload'\"></mat-icon>\r\n\t</button>\r\n\r\n\t<ng-container sourceActions>\r\n\t\t<div fxLayoutAlign=\"start center\" [class.basic-padding]=\"fileUpload\" fxLayoutGap=\"1em\">\r\n\t\t\t<div [class.hidden]=\"!fileUpload\" class=\"file-upload-wrapper\">\r\n\t\t\t\t<lib-file-upload\r\n\t\t\t\t\t(fileChange)=\"fileChange($event)\"\r\n\t\t\t\t\t[accept]=\"allowedFileTypes\"\r\n\t\t\t\t\t[maxSize]=\"maxFileUploadSize\"\r\n\t\t\t\t\t[uploadIconName]=\"uploadIconName\"\r\n\t\t\t\t\t[extendedAcceptList]=\"extendedFileTypes\"\r\n\t\t\t\t\t[multiple]=\"multipleFiles\"\r\n\t\t\t\t\t(errorEvent)=\"fileUploadError($event)\"\r\n\t\t\t\t\t[filePreviewProgress]=\"filePreviewProgress\"\r\n\t\t\t\t\t[disabled]=\"fileUploadDisabled\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"upload-file-text\">\r\n\t\t\t\t\t\t<span class=\"info\">\r\n\t\t\t\t\t\t\t<span [innerHTML]=\"'FILE_UPLOAD.UPLOAD' | translate\" class=\"accent-color\"></span>\r\n\t\t\t\t\t\t\t<span>&nbsp;</span>\r\n\t\t\t\t\t\t\t<span [innerHTML]=\"'FILE_UPLOAD.DRAG_AND_DROP' | translate\" fxHide.lt-sm></span>\r\n\t\t\t\t\t\t\t<span [innerHTML]=\"'FILE_UPLOAD.' + (multipleFiles ? 'FILES' : 'FILE') | translate\" [ngClass.lt-sm]=\"'accent-color'\"></span>\r\n\t\t\t\t\t\t</span>\r\n\r\n\t\t\t\t\t\t<span class=\"file-upload-extensions text-m\">\r\n\t\t\t\t\t\t\t(&nbsp;<span>{{ visibleExtensions }}.</span>&nbsp;\r\n\t\t\t\t\t\t\t<span *ngIf=\"maxSizeMB\" class=\"file-upload-max-size\" [innerHTML]=\"'FILE_UPLOAD.LIMITS_MB' | translate : { maxSizeMB: maxSizeMB }\"></span>&nbsp;)\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</lib-file-upload>\r\n\t\t\t\t<lib-open-extension-dialog *ngIf=\"showExtensionPopup\" [extensions]=\"allowedTypesWithoutDots\"> </lib-open-extension-dialog>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</ng-container>\r\n\r\n\t<div targetMain class=\"target-main\">\r\n\t\t<ng-container *ngIf=\"isEmptyTarget; else translatedTextBlock\">\r\n\t\t\t<p *ngIf=\"showTargetPlaceholder\" class=\"description-text target-empty\" [innerHtml]=\"'TLD_TRANSLATE.TARGET_DESCRIPTION' | translate\"></p>\r\n\t\t</ng-container>\r\n\t</div>\r\n\r\n\t<ng-container targetActions>\r\n\t\t<div class=\"tld-translate-target-footer basic-padding\" *ngIf=\"showProgressIndicator\">\r\n\t\t\t<progress-indicator (onClose)=\"closeProgressIndicator()\" *ngIf=\"showProgressIndicator\"></progress-indicator>\r\n\t\t</div>\r\n\t</ng-container>\r\n</tld-source-and-target-wrapper>\r\n\r\n<!-- templates used for else blocks in target container -->\r\n<ng-template #translatedTextBlock>\r\n\t<div [class.translated-source-overflow]=\"targetWrapperOverflow\" class=\"translated-source\">\r\n\t\t<ng-container *ngIf=\"!urlToTranslate\">\r\n\t\t\t<div class=\"target-wrapper-action-buttons\">\r\n\t\t\t\t<button\r\n\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t*ngIf=\"firstParagraphTranslated\"\r\n\t\t\t\t\tclass=\"tld-copy-translation\"\r\n\t\t\t\t\t(click)=\"copy()\"\r\n\t\t\t\t\t[matTooltip]=\"'TOOLTIPS.COPY' | translate\"\r\n\t\t\t\t\t[attr.aria-describedby]=\"copyMessageId\"\r\n\t\t\t\t\t[attr.Id]=\"copyButtonId\"\r\n\t\t\t\t\t(keydown.Tab)=\"switchFocusFromCopy($event)\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"material-icons\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.COPY' | translate\"> content_copy </span>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t\t<button\r\n\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t*ngIf=\"firstParagraphTranslated || translationError\"\r\n\t\t\t\t\tclass=\"tld-refresh-translation\"\r\n\t\t\t\t\t[matTooltip]=\"'TOOLTIPS.REFRESH' | translate\"\r\n\t\t\t\t\t(click)=\"refresh()\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"material-icons\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.REFRESH' | translate\"> refresh </span>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t\t<div [matTooltip]=\"'TLD_TRANSLATE.REPHRASE.TOOLTIP' | translate\">\r\n\t\t\t\t\t@if (isLlmEnabled && firstParagraphTranslated) {\r\n\t\t\t\t\t<lib-new-feature-dialog-wrapper\r\n\t\t\t\t\t\t#rephraseFeature\r\n\t\t\t\t\t\t[titleLocalizationKey]=\"'TLD_TRANSLATE.REPHRASE.NEW_FEATURE.TITLE'\"\r\n\t\t\t\t\t\t[descriptionLocalizationKey]=\"'TLD_TRANSLATE.REPHRASE.NEW_FEATURE.DESCRIPTION'\"\r\n\t\t\t\t\t\t[closeLocalizationKey]=\"'TLD_TRANSLATE.REPHRASE.NEW_FEATURE.CLOSE'\"\r\n\t\t\t\t\t\t[featureClassName]=\"'tld-rephrase'\"\r\n\t\t\t\t\t\t[featureContainerClassName]=\"'target-main'\"\r\n\t\t\t\t\t\t[featureLocalStorageKey]=\"rephraseFeatureLocalStorageKey\"\r\n\t\t\t\t\t\t[timeout]=\"1000\"\r\n\t\t\t\t\t\t[maxWidth]=\"isMobile ? 320 : 400\"\r\n\t\t\t\t\t></lib-new-feature-dialog-wrapper>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t\t\tclass=\"tld-rephrase\"\r\n\t\t\t\t\t\t\t[class.rephrase-feature-active]=\"rephraseFeature?.featureActive()\"\r\n\t\t\t\t\t\t\t[disabled]=\"isTranslating || isSummarazing\"\r\n\t\t\t\t\t\t\t(click)=\"showRephraseOptions()\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<mat-icon [svgIcon]=\"'rephrase'\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.REPHRASE' | translate\"></mat-icon>\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div [matTooltip]=\"(isTextSummarizable ? 'TOOLTIPS.CREATE_SUMMARY' : 'TLD_TRANSLATE.SUMMARY.DISABLED') | translate\">\r\n\t\t\t\t\t@if (isLlmEnabled && firstParagraphTranslated) {\r\n\t\t\t\t\t<lib-new-feature-dialog-wrapper\r\n\t\t\t\t\t\t#summarizeFeature\r\n\t\t\t\t\t\t[titleLocalizationKey]=\"'TLD_TRANSLATE.SUMMARY.NEW_FEATURE.TITLE'\"\r\n\t\t\t\t\t\t[descriptionLocalizationKey]=\"'TLD_TRANSLATE.SUMMARY.NEW_FEATURE.DESCRIPTION'\"\r\n\t\t\t\t\t\t[closeLocalizationKey]=\"'TLD_TRANSLATE.SUMMARY.NEW_FEATURE.CLOSE'\"\r\n\t\t\t\t\t\t[featureClassName]=\"'tld-create-summary'\"\r\n\t\t\t\t\t\t[featureContainerClassName]=\"'target-main'\"\r\n\t\t\t\t\t\t[featureLocalStorageKey]=\"summarizeFeatureLocalStorageKey\"\r\n\t\t\t\t\t\t[timeout]=\"1000\"\r\n\t\t\t\t\t></lib-new-feature-dialog-wrapper>\r\n\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t\tclass=\"tld-create-summary\"\r\n\t\t\t\t\t\t[class.summarize-feature-active]=\"summarizeFeature?.featureActive()\"\r\n\t\t\t\t\t\t[disabled]=\"isTranslating || isSummarazing || !isTextSummarizable\"\r\n\t\t\t\t\t\t(click)=\"createSummary()\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<mat-icon [svgIcon]=\"'summarize'\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.CREATE_SUMMARY' | translate\"></mat-icon>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\t\t\t\t<tld-text-to-speech *ngIf=\"textToSpeechTargetSettings && firstParagraphTranslated\" [settings]=\"textToSpeechTargetSettings\"> </tld-text-to-speech>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class=\"highlight-tree-wrapper\">\r\n\t\t\t\t<tld-highlight-tree *ngFor=\"let paragraph of targetParagraphs\" [highlight]=\"highlight\" [tree]=\"paragraph\"> </tld-highlight-tree>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div *ngIf=\"isSummarazing || summarizedText\" class=\"summary-wrapper\">\r\n\t\t\t\t<p class=\"summary-title\">{{ \"TLD_TRANSLATE.SUMMARY.TITLE\" | translate }}</p>\r\n\r\n\t\t\t\t<p *ngIf=\"isSummarazing\" class=\"creating-progress\">{{ \"TLD_TRANSLATE.SUMMARY.CREATING\" | translate }}<span class=\"dot-loading\">...</span></p>\r\n\r\n\t\t\t\t<p [innerHTML]=\"markedSummarizedText\"></p>\r\n\r\n\t\t\t\t<button\r\n\t\t\t\t\tmat-icon-button\r\n\t\t\t\t\t*ngIf=\"summarizedText\"\r\n\t\t\t\t\t[ngClass.lt-sm]=\"'summary-mobile'\"\r\n\t\t\t\t\tclass=\"summary-copy-btn\"\r\n\t\t\t\t\t(click)=\"copySummarizedText()\"\r\n\t\t\t\t\t[matTooltip]=\"'TOOLTIPS.COPY' | translate\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"material-icons\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.COPY' | translate\"> content_copy </span>\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div *ngIf=\"isRephraseActive\" class=\"rephrase-wrapper\">\r\n\t\t\t\t<tld-rephrase [text]=\"translatedText\" [disabled]=\"isTranslating\" [language]=\"targetLanguage\"></tld-rephrase>\r\n\t\t\t</div>\t\r\n\r\n\t\t\t<div *ngIf=\"firstParagraphTranslated && dictionaryEntry\" class=\"dictionary-wrapper\">\r\n\t\t\t\t<tld-dictionary [dictionary]=\"dictionaryEntry\"></tld-dictionary>\r\n\t\t\t</div>\r\n\t\t</ng-container>\r\n\r\n\t\t<div *ngIf=\"urlToTranslate\" class=\"target-url-container\">\r\n\t\t\t<a [attr.href]=\"translateUrlRedirect\" target=\"_blank\" fxLayoutAlign=\"start center\" class=\"go-to-webtranslate\">\r\n\t\t\t\t{{ urlToTranslate }}\r\n\t\t\t\t<span class=\"material-icons\" color=\"accent\" aria-hidden=\"false\" [attr.aria-label]=\"'ARIA_LABELS.OPEN_IN_NEW'\"> open_in_new </span>\r\n\t\t\t</a>\r\n\t\t</div>\r\n\t</div>\r\n</ng-template>\r\n", styles: [".hidden{display:none}.go-to-webtranslate{word-break:break-all;display:inline}.basic-padding,.target-empty,.target-translated-text{padding:18px}.source-container{border-right:1px solid #cbd2d9;padding:0;overflow:auto}.target-description{margin-top:0}.translated-source,.highlight-tree-wrapper{min-height:210px}.translated-source{position:relative;overflow-y:auto;overflow-x:hidden;flex:1 1 0!important;padding:18px 48px 18px 18px!important}.translated-source.selectable-sentence{cursor:pointer}::ng-deep .target-highlight .tld-highlight-container{padding:18px}.target-wrapper-action-buttons{position:absolute;top:3px;right:3px}.target-wrapper-action-buttons .tld-copy-translation,.target-wrapper-action-buttons .tld-refresh-translation,.target-wrapper-action-buttons tld-text-to-speech{display:block}.target-empty,.target-translated-text{margin:0}tld-dictionary{overflow-y:auto;flex:1 1 0!important}.source-main,.target-main{height:100%}.upload-file-text{color:var(--base-40);font-size:14px;display:inline-block;text-align:left}.file-upload-wrapper{width:100%}.file-upload-wrapper .file-upload-extensions{font-weight:400}.file-upload-max-size{white-space:nowrap}.dictionary-wrapper{margin-top:2rem;border-top:1px solid var(--base-70)}.rephrase-wrapper,.summary-wrapper{position:relative;margin-top:8px;padding-top:12px;border-top:1px solid var(--base-70)}.summary-title{font-size:16px;margin-bottom:.5rem;font-weight:600}.creating-progress{color:var(--base-40)}:host ::ng-deep .dot-loading{clip-path:inset(0 100% 0 0);animation:loading 1.5s steps(4) infinite}.summary-copy-btn{position:absolute;right:-45px;top:20px}.summary-mobile{right:-46px}::ng-deep .summarize-feature-active,::ng-deep .rephrase-feature-active{z-index:1001;background-color:#fff}@keyframes loading{to{clip-path:inset(0 -34% 0 0)}}\n"] }]
354
354
  }], ctorParameters: () => [{ type: i1.TldTranslateTextService }, { type: i2.Clipboard }, { type: i3.AlertService }, { type: i4.TldTranslateConfigService }, { type: i5.TldScrollService }, { type: i4.TldTranslateSystemManagementService }, { type: i6.AudioRecordService }, { type: i6.TldVoiceInputService }, { type: i7.TldTranslateFileService }, { type: i8.LLMService }, { type: i9.KeycloakService }], propDecorators: { sourceComponent: [{
355
355
  type: ViewChild,
356
356
  args: ["sourceComponent"]
@@ -362,4 +362,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
362
362
  }], onFileChange: [{
363
363
  type: Output
364
364
  }] } });
365
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGxkLXRyYW5zbGF0ZS10ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RsZC10cmFuc2xhdGUvc3JjL2xpYi9tb2R1bGVzL3RsZC10ZXh0L2NvbXBvbmVudHMvdGxkLXRyYW5zbGF0ZS10ZXh0L3RsZC10cmFuc2xhdGUtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90bGQtdHJhbnNsYXRlL3NyYy9saWIvbW9kdWxlcy90bGQtdGV4dC9jb21wb25lbnRzL3RsZC10cmFuc2xhdGUtdGV4dC90bGQtdHJhbnNsYXRlLXRleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxjQUFjLEVBQTZCLE1BQU0sMkJBQTJCLENBQUM7QUFRdEYsT0FBTyxFQUE0QixnQkFBZ0IsRUFBbUIsVUFBVSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvSixPQUFPLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNoQyxNQUFNLE9BQU8seUJBQXlCO0lBNEdqQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7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R0FBRyxFQUFFO1lBQ2QsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQy9ELFNBQVMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7SUFDbkMsQ0FBQzt3R0E3VVUseUJBQXlCOzRGQUF6Qix5QkFBeUIsK1dDeEJ0Qyw2eFRBb01BOzs0RkQ1S2EseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLG9CQUFvQjt5YUFLQSxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDTixnQkFBZ0I7c0JBQXJDLFNBQVM7dUJBQUMsU0FBUztnQkFDWCxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jbGlwYm9hcmQnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBzaWduYWwsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaW5hbGl6ZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBBdWRpb0Vycm9yQ2FzZSwgSVRyYW5zY3JpcHRpb25VcGRhdGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3RsZC1hdWRpby9tb2RlbHMnO1xyXG5pbXBvcnQgeyBJRGljdGF0ZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi8uLi8uLi90bGQtYXVkaW8vbW9kZWxzL2RpY3RhdGUtY29uZmlndXJhdGlvbmkubW9kZWwnO1xyXG5pbXBvcnQgeyBBdWRpb1JlY29yZFNlcnZpY2UsIFRsZFZvaWNlSW5wdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdGxkLWF1ZGlvL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgVGxkVHJhbnNsYXRlU3lzdGVtTWFuYWdlbWVudFNlcnZpY2UsIFRsZFRyYW5zbGF0ZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi90bGQtY29tbW9uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgVGxkU2Nyb2xsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3RsZC1jb21tb24vc2VydmljZXMvc2Nyb2xsL3RsZC1zY3JvbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IFRsZFRyYW5zbGF0ZUZpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdGxkLWRvY3VtZW50L3NlcnZpY2VzJztcclxuaW1wb3J0IHsgVGxkVHJhbnNsYXRlVGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90bGQtdHJhbnNsYXRlLXRleHQuc2VydmljZSc7XHJcbmltcG9ydCB7IFRsZFRyYW5zbGF0ZVNvdXJjZUNvbXBvbmVudCB9IGZyb20gJy4uL3RsZC10cmFuc2xhdGUtc291cmNlL3RsZC10cmFuc2xhdGUtc291cmNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFjdGl2ZURhdGEsIEFsZXJ0U2VydmljZSwgQ29udmVyc2lvbkhlbHBlciwgRmlsZVVwbG9hZEVycm9yLCBIYXNoSGVscGVyLCBQbGF1c2libGVIZWxwZXIsIFJlc29sdXRpb25IZWxwZXIsIExMTUFjdGlvbnMgfSBmcm9tICdAdGlsZGUtbmxwL25neC1jb21tb24nO1xyXG5pbXBvcnQgeyBUbGREaWN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vdGxkLWF1ZGlvJztcclxuaW1wb3J0IHsgTExNU2VydmljZSwgTExNU3VtbWFyeVVzZUNhc2UgfSBmcm9tICdAdGlsZGUtbmxwL25neC1zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IG1hcmtlZCB9IGZyb20gJ21hcmtlZCc7XHJcbmltcG9ydCB7IEtleWNsb2FrU2VydmljZSB9IGZyb20gJ2tleWNsb2FrLWFuZ3VsYXInO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndGxkLXRyYW5zbGF0ZS10ZXh0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGxkLXRyYW5zbGF0ZS10ZXh0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90bGQtdHJhbnNsYXRlLXRleHQuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGxkVHJhbnNsYXRlVGV4dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKFwic291cmNlQ29tcG9uZW50XCIpIHNvdXJjZUNvbXBvbmVudDogVGxkVHJhbnNsYXRlU291cmNlQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWN0YXRlXCIpIGRpY3RhdGVDb21wb25lbnQ6IFRsZERpY3RhdGVDb21wb25lbnQ7XHJcbiAgQElucHV0KCkgZmlsZVByZXZpZXdQcm9ncmVzczogbnVtYmVyO1xyXG4gIEBPdXRwdXQoKSBvbkZpbGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxGaWxlW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlW10+KCk7XHJcblxyXG4gIGFjdGl2ZURhdGEgPSBzaWduYWw8QWN0aXZlRGF0YSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcclxuICBnZXQgc3lzdGVtSWQoKSB7IHJldHVybiB0aGlzLmFjdGl2ZURhdGEoKT8uc3lzdGVtSWQ7IH07XHJcbiAgLy9wYXJhbXMgZnJvbSBjb25maWcgc2VydmljZS5cclxuICBnZXQgYWxsb3dlZEZpbGVUeXBlcygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLmNvbmZpZy5maWxlQ29uZmlnLmFsbG93ZWRGaWxlVHlwZXM7IH07XHJcbiAgZ2V0IGV4dGVuZGVkRmlsZVR5cGVzKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMuY29uZmlnLmZpbGVDb25maWcuZXh0ZW5kZWRGaWxlVHlwZXM7IH07XHJcbiAgZ2V0IGFwcElkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmNvbmZpZy5jb3JlQ29uZmlnLmFwcElkOyB9O1xyXG4gIGdldCBoaWdobGlnaHQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmNvbmZpZy50ZXh0Q29uZmlnLmhpZ2hsaWdodDsgfTtcclxuICBnZXQgZmlsZVVwbG9hZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY29uZmlnLmZpbGVDb25maWcuZmlsZVVwbG9hZCAmJiAhdGhpcy5pc01vYmlsZSAmJiAhKHRoaXMuaXNEaWN0YXRpbmcgfHwgdGhpcy5hdWRpb1NlcnZpY2U/LmlzUmVjb3JkaW5nIHx8IHRoaXMudm9pY2VJbnB1dFNlcnZpY2UuaXNQcm9jZXNzaW5nKSAmJiAhdGhpcy5zb3VyY2U/Lmxlbmd0aCB9O1xyXG4gIGdldCBpc0F1dGgoKSB7IHJldHVybiB0aGlzLmNvbmZpZy5jb3JlQ29uZmlnLmlzQXV0aDsgfTtcclxuICBnZXQgbWF4RmlsZVVwbG9hZFNpemUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuY29uZmlnLmZpbGVDb25maWcubWF4U2l6ZTsgfTtcclxuICBnZXQgbXVsdGlwbGVGaWxlcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY29uZmlnLmZpbGVDb25maWcubnVtYmVyT2ZGaWxlc0FsbG93ZWQgPiAxOyB9O1xyXG4gIGdldCB1cGRhdGVUcmFuc2xhdGlvblVybCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5jb25maWcudGV4dENvbmZpZy51cGRhdGVUcmFuc2xhdGlvblVybDsgfTtcclxuICBnZXQgYWxsb3dXZWJzaXRlVHJhbnNsYXRpb24oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmNvbmZpZy50ZXh0Q29uZmlnLmFsbG93V2Vic2l0ZVRyYW5zbGF0aW9uOyB9O1xyXG4gIGdldCBhdXRvUmVkaXJlY3RUb1dlYlRyYW5zbGF0ZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY29uZmlnLnRleHRDb25maWcuYXV0b1JlZGlyZWN0VG9XZWJUcmFuc2xhdGU7IH07XHJcbiAgZ2V0IHdlYldpZGdldFJlZGlyZWN0VXJsUHJlZml4KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmNvbmZpZy50ZXh0Q29uZmlnLndlYldpZGdldFJlZGlyZWN0VXJsUHJlZml4OyB9O1xyXG4gIGdldCB3ZWJXaWRnZXRSZWRpcmVjdFVybFBvc2ZpeCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5jb25maWcudGV4dENvbmZpZy53ZWJXaWRnZXRSZWRpcmVjdFVybFBvc2ZpeDsgfTtcclxuICBnZXQgdGV4dGFyZWFEaXNhYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuYXVkaW9TZXJ2aWNlLmlzUmVjb3JkaW5nIHx8IHRoaXMudm9pY2VJbnB1dFNlcnZpY2UuaXNQcm9jZXNzaW5nIHx8IHRoaXMuaXNEaWN0YXRpbmcgfHwgdGhpcy50bGRTeXN0ZW0ubm9TeXN0ZW1zRXJyb3IgfTtcclxuICBnZXQgZmlsZVVwbG9hZERpc2FibGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy50bGRTeXN0ZW0ubm9TeXN0ZW1zRXJyb3IgfTtcclxuICBnZXQgaXNEaWN0YXRpbmcoKSB7IHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmlzRGljdGF0aW5nOyB9O1xyXG4gIGdldCBzb3VyY2VMYW5ndWFnZSgpIHsgcmV0dXJuIHRoaXMuYWN0aXZlRGF0YSgpPy5zb3VyY2VMYW5nLmxhbmc7IH1cclxuICBnZXQgdGFyZ2V0TGFuZ3VhZ2UoKSB7IHJldHVybiB0aGlzLmFjdGl2ZURhdGEoKT8udGFyZ2V0TGFuZy5sYW5nOyB9XHJcbiAgZ2V0IGhhc1RyYW5zbGF0ZWRQYXJhZ3JhcGhzKCkgeyByZXR1cm4gdGhpcy50YXJnZXRQYXJhZ3JhcGhzPy5sZW5ndGggPiAwIH1cclxuICBnZXQgaXNFbXB0eVRhcmdldCgpIHsgcmV0dXJuICF0aGlzLmhhc1RyYW5zbGF0ZWRQYXJhZ3JhcGhzICYmICF0aGlzLnVybFRvVHJhbnNsYXRlICYmICF0aGlzLmhhc0RpY3Rpb25hcnkgfVxyXG4gIGdldCBzaG93VGFyZ2V0UGxhY2Vob2xkZXIoKSB7IHJldHVybiB0aGlzLmNvbmZpZy50ZXh0Q29uZmlnLnNob3dUYXJnZXRQbGFjZWhvbGRlciB9XHJcbiAgZ2V0IHNob3dFeHRlbnNpb25Qb3B1cCgpIHsgcmV0dXJuIHRoaXMuY29uZmlnLnRleHRDb25maWcuc2hvd0V4dGVuc2lvblBvcHVwICYmIHRoaXMudmlzaWJsZUV4dGVuc2lvbkNvdW50IDwgdGhpcy5hbGxvd2VkRmlsZVR5cGVzLmxlbmd0aCB9XHJcbiAgZ2V0IHZpc2libGVFeHRlbnNpb25Db3VudCgpIHsgcmV0dXJuIHRoaXMuY29uZmlnLnRleHRDb25maWcudmlzaWJsZUV4dGVuc2lvbkNvdW50IH07XHJcbiAgZ2V0IHRleHRUb1NwZWVjaFRhcmdldFNldHRpbmdzKCkgeyByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS50ZXh0VG9TcGVlY2hUYXJnZXRTZXR0aW5ncyB9O1xyXG4gIGdldCB0ZXh0VG9TcGVlY2hTb3VyY2VTZXR0aW5ncygpIHsgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UudGV4dFRvU3BlZWNoU291cmNlU2V0dGluZ3MgfTtcclxuICBnZXQgdXBsb2FkSWNvbk5hbWUoKSB7IHJldHVybiB0aGlzLmNvbmZpZy5jb3JlQ29uZmlnLnVwbG9hZEljb25OYW1lIH07XHJcbiAgZ2V0IGlzTGxtRW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuY29uZmlnLmxsbUNvbmZpZy5pc0VuYWJsZWQgfTtcclxuXHJcbiAgYXVkaW9JbnB1dFZpc2libGUgPSBjb21wdXRlZCgoKSA9PiB7IHJldHVybiB0aGlzLmNvbmZpZy5zcGVlY2hDb25maWcub25saW5lQXNyPy5lbmFibGVkICYmIHRoaXMub25saW5lQXNyU3lzdGVtSWQoKTsgfSk7XHJcbiAgdGFyZ2V0U2VudGVuY2VTZWxlY3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGdldCB1cmxUb1RyYW5zbGF0ZSgpIHsgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UudXJsVG9UcmFuc2xhdGU7IH07XHJcblxyXG4gIG9ubGluZUFzclN5c3RlbUlkID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3Qgb25saW5lU3lzdGVtcyA9IHRoaXMudGxkU3lzdGVtLm9ubGluZUFTclN5c3RlbXMoKTtcclxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuYWN0aXZlRGF0YSgpO1xyXG5cclxuICAgIGlmICghdGhpcy5jb25maWcuc3BlZWNoQ29uZmlnLm9ubGluZUFzcj8uZW5hYmxlZCAmJiBvbmxpbmVTeXN0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb25saW5lU3lzdGVtcy5maW5kKChvbmxpbmVTeXN0ZW0pID0+IG9ubGluZVN5c3RlbS5sYW5ndWFnZSA9PT0gYWN0aXZlPy5zb3VyY2VMYW5nLmxhbmcpPy5zeXN0ZW1JZDtcclxuICB9KTtcclxuXHJcbiAgYWxsb3dlZFR5cGVzV2l0aG91dERvdHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHJlYWRvbmx5IGNvcHlNZXNzYWdlSWQgPSBcInRsZC1jb3B5LXN1Y2Nlc3NcIjtcclxuICByZWFkb25seSBjb3B5TWVzc2FnZUNsb3NlQnV0dG9uSWQgPSBcInRsZC1jb3B5LXN1Y2Nlc3MtY2xvc2VcIjtcclxuICByZWFkb25seSBjb3B5QnV0dG9uSWQgPSBcInRsZC1jb3B5LXRvLWNsaXBib2FyZFwiO1xyXG5cclxuICBnZXQgdHJhbnNsYXRlZFRleHQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLnRyYW5zbGF0ZWRUZXh0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpcnN0UGFyYWdyYXBoVHJhbnNsYXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmZpcnN0UGFyYWdyYXBoVHJhbnNsYXRlZDtcclxuICB9XHJcblxyXG4gIGdldCBpc1RyYW5zbGF0aW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UuaXNUcmFuc2xhdGluZztcclxuICB9XHJcblxyXG4gIGdldCB0cmFuc2xhdGlvbkVycm9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc291cmNlICYmICF0aGlzLmlzVHJhbnNsYXRpbmc7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNUZXh0U3VtbWFyaXphYmxlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2Uuc291cmNlVGV4dD8ubGVuZ3RoID4gMzAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0RpY3Rpb25hcnkoKSB7IHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmhhc0RpY3Rpb25hcnk7IH1cclxuICBnZXQgZGljdGlvbmFyeUVudHJ5KCkgeyByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5kaWN0aW9uYXJ5RW50cnk7IH1cclxuICBnZXQgc291cmNlKCkgeyByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5zb3VyY2VUZXh0OyB9XHJcbiAgZ2V0IHRyYW5zbGF0ZVVybFJlZGlyZWN0KCkgeyByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS50cmFuc2xhdGVVcmxSZWRpcmVjdDsgfVxyXG4gIGdldCBzaG93UHJvZ3Jlc3NJbmRpY2F0b3IoKSB7IHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLnNob3VsZFNob3dQcm9ncmVzc0luZGljYXRvcjsgfVxyXG4gIGdldCBwYXJhZ3JhcGhzKCkgeyByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5wYXJhZ3JhcGhzOyB9O1xyXG4gIGdldCBzb3VyY2VQYXJhZ3JhcGhzKCkgeyByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5zb3VyY2VQYXJhZ3JhcGhzOyB9XHJcbiAgZ2V0IHRhcmdldFBhcmFncmFwaHMoKSB7IHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLnRhcmdldFBhcmFncmFwaHM7IH1cclxuXHJcbiAgZ2V0IHRhcmdldFdyYXBwZXJPdmVyZmxvdygpIHtcclxuICAgIGNvbnN0IHRhcmdldFdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGFyZ2V0LW1haW4nKTtcclxuICAgIGNvbnN0IHRhcmdldFdyYXBwZXJPdmVyZmxvdyA9IHRhcmdldFdyYXBwZXIuc2Nyb2xsSGVpZ2h0ID4gdGFyZ2V0V3JhcHBlci5jbGllbnRIZWlnaHQ7XHJcbiAgICByZXR1cm4gdGFyZ2V0V3JhcHBlck92ZXJmbG93O1xyXG4gIH1cclxuXHJcbiAgZGljdGF0ZUNvbmZpZzogSURpY3RhdGVDb25maWd1cmF0aW9uO1xyXG4gIHZpc2libGVFeHRlbnNpb25zOiBzdHJpbmc7XHJcbiAgbWF4U2l6ZU1COiBudW1iZXI7XHJcblxyXG4gIGlzUmVwaHJhc2VBY3RpdmUhOiBib29sZWFuO1xyXG4gIGlzU3VtbWFyYXppbmchOiBib29sZWFuO1xyXG4gIHN1bW1hcml6ZWRUZXh0ITogc3RyaW5nO1xyXG4gIG1hcmtlZFN1bW1hcml6ZWRUZXh0ITogc3RyaW5nO1xyXG4gIHN1bW1hcml6ZUZlYXR1cmVMb2NhbFN0b3JhZ2VLZXkhOiBzdHJpbmc7XHJcbiAgcmVwaHJhc2VGZWF0dXJlTG9jYWxTdG9yYWdlS2V5ITogc3RyaW5nO1xyXG4gIGlzTW9iaWxlITogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVUZXh0U2VydmljZTogVGxkVHJhbnNsYXRlVGV4dFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaXBib2FyZDogQ2xpcGJvYXJkLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbGVydHM6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBUbGRUcmFuc2xhdGVDb25maWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0bGRTY3JvbGxTZXJ2aWNlOiBUbGRTY3JvbGxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0bGRTeXN0ZW06IFRsZFRyYW5zbGF0ZVN5c3RlbU1hbmFnZW1lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdWRpb1NlcnZpY2U6IEF1ZGlvUmVjb3JkU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdm9pY2VJbnB1dFNlcnZpY2U6IFRsZFZvaWNlSW5wdXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWxlU2VydmljZTogVGxkVHJhbnNsYXRlRmlsZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxsbVNlcnZpY2U6IExMTVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGtleWNsb2FrOiBLZXljbG9ha1NlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNNb2JpbGUgPSBSZXNvbHV0aW9uSGVscGVyLmlzTW9iaWxlUmVzKCk7XHJcbiAgICBcclxuICAgIHRoaXMuc3VtbWFyaXplRmVhdHVyZUxvY2FsU3RvcmFnZUtleSA9IHRoaXMua2V5Y2xvYWsuZ2V0S2V5Y2xvYWtJbnN0YW5jZSgpPy50b2tlblBhcnNlZCA/IGBzdW1tYXJpemVGZWF0dXJlRGlhbG9nU2hvd25fJHtIYXNoSGVscGVyLmhhc2hTdHJpbmcodGhpcy5rZXljbG9hay5nZXRLZXljbG9ha0luc3RhbmNlKCkudG9rZW5QYXJzZWQuZW1haWwpfWAgOiAnc3VtbWFyaXplRmVhdHVyZURpYWxvZ1Nob3duJztcclxuICAgIHRoaXMucmVwaHJhc2VGZWF0dXJlTG9jYWxTdG9yYWdlS2V5ID0gdGhpcy5rZXljbG9hay5nZXRLZXljbG9ha0luc3RhbmNlKCk/LnRva2VuUGFyc2VkID8gYHJlcGhyYXNlRmVhdHVyZURpYWxvZ1Nob3duXyR7SGFzaEhlbHBlci5oYXNoU3RyaW5nKHRoaXMua2V5Y2xvYWsuZ2V0S2V5Y2xvYWtJbnN0YW5jZSgpLnRva2VuUGFyc2VkLmVtYWlsKX1gIDogJ3JlcGhyYXNlRmVhdHVyZURpYWxvZ1Nob3duJztcclxuXHJcbiAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmxpc3Rlbk9uQ2hhbmdlcygpO1xyXG4gICAgdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5zb3VyY2VDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5jbGVhclN1bW1hcml6ZSgpO1xyXG4gICAgICB0aGlzLmlzUmVwaHJhc2VBY3RpdmUgPSBmYWxzZTtcclxuICAgIH0pXHJcbiAgICB0aGlzLmRpY3RhdGVDb25maWcgPSB7XHJcbiAgICAgIG1heExlbmd0aDogdGhpcy5jb25maWcuc3BlZWNoQ29uZmlnPy5vbmxpbmVBc3I/Lm1heGltdW1SZWNvcmRUaW1lLFxyXG4gICAgICBhcGlVcmw6IHRoaXMuY29uZmlnLnNwZWVjaENvbmZpZy5vbmxpbmVBc3I/LnVybCxcclxuICAgICAgYXBpS2V5OiB0aGlzLmNvbmZpZy5zcGVlY2hDb25maWcuYXBpS2V5XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52aXNpYmxlRXh0ZW5zaW9ucyA9IHRoaXMuYWxsb3dlZEZpbGVUeXBlcy5zbGljZSgwLCB0aGlzLnZpc2libGVFeHRlbnNpb25Db3VudCkuam9pbihcIiwgXCIpO1xyXG4gICAgdGhpcy5hbGxvd2VkRmlsZVR5cGVzLmZvckVhY2goKGVsKSA9PiB0aGlzLmFsbG93ZWRUeXBlc1dpdGhvdXREb3RzLnB1c2goZWwucmVwbGFjZSgnLicsICcnKSkpO1xyXG5cclxuICAgIHRoaXMubWF4U2l6ZU1CID0gQ29udmVyc2lvbkhlbHBlci5ieXRlc1RvTWIodGhpcy5jb25maWcuZmlsZUNvbmZpZy5tYXhTaXplKTtcclxuXHJcbiAgICB0aGlzLnRsZFN5c3RlbS5nZXRBY3RpdmVEYXRhKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoeCwgeSkgPT4geCAmJiB5ICYmIHgubGFuZ3VhZ2VJZCA9PSB5Lmxhbmd1YWdlSWQpKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHN5c3QpID0+IHtcclxuICAgICAgICBpZiAoIXN5c3QpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRhLnNldChzeXN0KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRGF0YSgpLnJldHJhbnNsYXRlKSB7XHJcbiAgICAgICAgICB0aGlzLmNsZWFyU3VtbWFyaXplKCk7XHJcbiAgICAgICAgICB0aGlzLmlzUmVwaHJhc2VBY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UucmV0cmFuc2xhdGUoeyBzeXN0ZW1DaGFuZ2VkOiB0cnVlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG5cclxuICAgIHRoaXMudGxkU2Nyb2xsU2VydmljZS5zdWJzY3JpYmVUb1Njcm9sbCgpO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5zcGVlY2hDb25maWcub25saW5lQXNyPy5lbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuYXVkaW9TZXJ2aWNlLm9uUmVjb3JkU3RhcnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5jaGFuZ2VTb3VyY2UoeyBwaHJhc2U6IFwiXCIgfSk7XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLnZvaWNlSW5wdXRTZXJ2aWNlLm9uVHJhbnNjcmlidGlvblRleHRVcGRhdGVkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBJVHJhbnNjcmlwdGlvblVwZGF0ZU1vZGVsKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmNoYW5nZVNvdXJjZSh7IHBocmFzZTogZXZlbnQudGV4dCwgc3dhcFN5c3RlbXM6IGZhbHNlLCBkaXNhYmxlQXV0b21hdGljVHJhbnNsYXRpb246ICFldmVudC5jb21wbGV0ZWQgfSk7XHJcbiAgICAgICAgICBpZiAoZXZlbnQuY29tcGxldGVkICYmICghZXZlbnQudGV4dCB8fCBldmVudC50ZXh0ID09PSBcIlwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFsZXJ0cy53YXJuaW5nKGBFUlJPUlMuQVVESU8uJHtBdWRpb0Vycm9yQ2FzZS5OT19URVhUX1JFQ09HTklaRUR9YClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29weSgpIHtcclxuICAgIHRoaXMuY2xpcGJvYXJkLmNvcHkodGhpcy50cmFuc2xhdGVkVGV4dCk7XHJcbiAgICB0aGlzLmFsZXJ0cy5zdWNjZXNzKFwiVExEX1RSQU5TTEFURS5URVhUX0NPUElFRFwiLCB7IGlkOiB0aGlzLmNvcHlNZXNzYWdlSWQsIGNsb3NlQnV0dG9uSWQ6IHRoaXMuY29weU1lc3NhZ2VDbG9zZUJ1dHRvbklkLCBwYXJlbnRJZDogdGhpcy5jb3B5QnV0dG9uSWQgfSk7XHJcbiAgfVxyXG5cclxuICBjb3B5U3VtbWFyaXplZFRleHQoKSB7XHJcbiAgICB0aGlzLmNsaXBib2FyZC5jb3B5KHRoaXMuc3VtbWFyaXplZFRleHQpO1xyXG4gICAgdGhpcy5hbGVydHMuc3VjY2VzcyhcIlRMRF9UUkFOU0xBVEUuU1VNTUFSWS5DT1BJRURcIik7XHJcbiAgICB0aGlzLnN1bW1hcnlDb3B5UGxhdXNpYmxlKCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCkge1xyXG4gICAgdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5vblRyYW5zbGF0ZUJ1dHRvbkNsaWNrKCk7XHJcbiAgICB0aGlzLmNsZWFyU3VtbWFyaXplKCk7XHJcbiAgICB0aGlzLmlzUmVwaHJhc2VBY3RpdmUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNob3dSZXBocmFzZU9wdGlvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzUmVwaHJhc2VBY3RpdmUgPSB0cnVlO1xyXG4gICAgdGhpcy5zY3JvbGwoJy5yZXBocmFzZS13cmFwcGVyJyk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVTdW1tYXJ5KCkge1xyXG4gICAgdGhpcy5zdW1tYXJpemVkVGV4dCA9ICcnO1xyXG4gICAgdGhpcy5tYXJrZWRTdW1tYXJpemVkVGV4dCA9ICcnO1xyXG4gICAgdGhpcy5pc1N1bW1hcmF6aW5nID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLnNjcm9sbCgnLnN1bW1hcnktd3JhcHBlcicpO1xyXG5cclxuICAgIHRoaXMubGxtU2VydmljZVxyXG4gICAgICAuc3VtbWFyaXplKHsgbGFuZ3VhZ2U6IHRoaXMudGFyZ2V0TGFuZ3VhZ2UsIHRleHQ6IHRoaXMudHJhbnNsYXRlZFRleHQsIHVzZUNhc2U6IExMTVN1bW1hcnlVc2VDYXNlLkJyaWVmIH0pXHJcbiAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+ICh0aGlzLmlzU3VtbWFyYXppbmcgPSBmYWxzZSkpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3VtbWFyaXplZFRleHQgPSByZXNwb25zZTtcclxuICAgICAgICAgIHRoaXMubWFya2VkU3VtbWFyaXplZFRleHQgPSBtYXJrZWQucGFyc2UocmVzcG9uc2UpIGFzIHN0cmluZztcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN1bW1hcnlQbGF1c2libGUoKTtcclxuICB9XHJcblxyXG4gIHN3aXRjaEZvY3VzRnJvbUNvcHkoZXZlbnQpIHtcclxuICAgIGNvbnN0IGNvcHlNZXNzYWdlQ2xvc2VCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNvcHlNZXNzYWdlQ2xvc2VCdXR0b25JZCk/LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYnV0dG9uXCIpPy5pdGVtKDApO1xyXG4gICAgaWYgKGNvcHlNZXNzYWdlQ2xvc2VCdXR0b24pIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgY29weU1lc3NhZ2VDbG9zZUJ1dHRvbi5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsZUNoYW5nZShmaWxlczogRmlsZVtdKSB7XHJcbiAgICB0aGlzLm9uRmlsZUNoYW5nZS5lbWl0KGZpbGVzKTtcclxuICB9XHJcblxyXG4gIGZpbGVVcGxvYWRFcnJvcihlcnJvcjogYW55KSB7XHJcbiAgICB0aGlzLmZpbGVTZXJ2aWNlLmZpbGVVcGxvYWRFcnJvcihlcnJvciBhcyBGaWxlVXBsb2FkRXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVUb1RyYW5zbGF0ZWRVcmwoKSB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh0aGlzLnRyYW5zbGF0ZVVybFJlZGlyZWN0KTtcclxuICB9XHJcblxyXG4gIGRpY3RhdGVTdGFydFN0b3AoaXNEaWN0YXRpbmc6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHBocmFzZSA9IGAke3RoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2Uuc291cmNlVGV4dH0ke3RoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2Uuc291cmNlVGV4dD8ubGVuZ3RoID4gMCA/IFwiIFwiIDogXCJcIn0ke3RoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2Uuc291cmNlVGV4dEh5cG90aGVzaXN9YDtcclxuICAgIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UuaXNEaWN0YXRpbmcgPSBpc0RpY3RhdGluZztcclxuICAgIC8vIFRyYW5zbGF0aW9uIGhhcyBlbmRlZC5cclxuICAgIGlmICghaXNEaWN0YXRpbmcpIHtcclxuICAgICAgaWYgKHRoaXMuY29uZmlnLnNwZWVjaENvbmZpZy5vbmxpbmVBc3IucHVuY3R1YXRpb25NZXNzYWdlICYmIHBocmFzZT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuYWxlcnRzLndhcm5pbmcoXCJBVURJTy5QVU5DVFVBVElPTl9NRVNTQUdFXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmNoYW5nZVNvdXJjZShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwaHJhc2UsXHJcbiAgICAgICAgICBkaXNhYmxlQXV0b21hdGljVHJhbnNsYXRpb246IHRoaXMuaXNEaWN0YXRpbmcgfHwgdGhpcy5jb25maWcuYXVkaW9Db25maWcuZGlzYWJsZUF1dG9tYXRpY1RyYW5zbGF0aW9uXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UuY2hhbmdlU291cmNlSHlwb3RoZXNpcyhcIlwiKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmNsZWFyU291cmNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaWN0YXRlUmVzdWx0KHJlc3VsdDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmNoYW5nZVNvdXJjZUh5cG90aGVzaXMoXCJcIik7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmNoYW5nZVNvdXJjZSh7IHBocmFzZTogcmVzdWx0LCBkaXNhYmxlQXV0b21hdGljVHJhbnNsYXRpb246IHRoaXMuaXNEaWN0YXRpbmcgfSlcclxuICB9XHJcblxyXG4gIGRpY3RhdGVQYXJ0aWFsUmVzdWx0KHBhcnRpYWxSZXN1bHQ6IHN0cmluZykge1xyXG4gICAgdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5jaGFuZ2VTb3VyY2VIeXBvdGhlc2lzKHBhcnRpYWxSZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgZGljdGF0ZUVycm9yKGVycm9yOiBBdWRpb0Vycm9yQ2FzZSkge1xyXG4gICAgaWYgKGVycm9yID09PSBBdWRpb0Vycm9yQ2FzZS5NQVhfVElNRV9FWENFRURFRCkge1xyXG4gICAgICBsZXQgdGltZVN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGNvbnN0IG1heExlbmd0aFRpbWUgPSBuZXcgRGF0ZSgwLCAwLCAwLCAwLCAwLCB0aGlzLmNvbmZpZy5zcGVlY2hDb25maWcub25saW5lQXNyLm1heGltdW1SZWNvcmRUaW1lKTtcclxuXHJcbiAgICAgIGNvbnN0IG1pbnV0ZXMgPSBtYXhMZW5ndGhUaW1lLmdldE1pbnV0ZXMoKTtcclxuICAgICAgaWYgKG1pbnV0ZXMgPiAwKSB7XHJcbiAgICAgICAgdGltZVN0cmluZyArPSBgJHttaW51dGVzfSBtaW51dGVzYDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc2Vjb25kcyA9IG1heExlbmd0aFRpbWUuZ2V0U2Vjb25kcygpO1xyXG4gICAgICBpZiAoc2Vjb25kcyA+IDApIHtcclxuICAgICAgICB0aW1lU3RyaW5nICs9IGAke3NlY29uZHN9IHNlY29uZHNgXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hbGVydHMud2FybmluZyhgRVJST1JTLkFVRElPLiR7ZXJyb3J9YCwgeyB0aW1lU3RyaW5nIH0pO1xyXG4gICAgfSBlbHNlIGlmIChlcnJvciA9PT0gQXVkaW9FcnJvckNhc2UuTk9fU1BFRUNIKSB7XHJcbiAgICAgIHRoaXMuYWxlcnRzLndhcm5pbmcoYEVSUk9SUy5BVURJTy4ke2Vycm9yfWApO1xyXG4gICAgfSBlbHNlIGlmIChlcnJvciA9PT0gQXVkaW9FcnJvckNhc2UuTUlDX05PVF9BTExPV0VEKSB7XHJcbiAgICAgIHRoaXMuYWxlcnRzLndhcm5pbmcoYEVSUk9SUy5BVURJTy4ke2Vycm9yfWApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hbGVydHMudW5oYW5kZWxlZEVycm9yKHsgRXJyb3JDb2RlOiBlcnJvciB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyU291cmNlKCkge1xyXG4gICAgdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5jbGVhclNvdXJjZSgpO1xyXG4gICAgdGhpcy5jbGVhclN1bW1hcml6ZSgpO1xyXG4gICAgdGhpcy5pc1JlcGhyYXNlQWN0aXZlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2Uuc3RvcExpc3RlbmluZ1RvQ2hhbmdlcygpO1xyXG4gICAgdGhpcy50bGRTY3JvbGxTZXJ2aWNlLnVuc3Vic2NyaWJlVG9TY3JvbGwoKTtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dChudWxsKVxyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VQcm9ncmVzc0luZGljYXRvcigpIHtcclxuICAgIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UuaGlkZVByb2dyZXNzSW5kaWNhdG9yKCk7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLnN0b3BUcmFuc2xhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgb3BlbkZpbGVVcGxvYWQoKTogdm9pZCB7XHJcbiAgICBjb25zdCB1cGxvYWRCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudXBsb2FkLWJ1dHRvbicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgdXBsb2FkQnV0dG9uLmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1bW1hcnlQbGF1c2libGUoKTogdm9pZCB7XHJcbiAgICBQbGF1c2libGVIZWxwZXIuY3VzdG9tRXZlbnQoTExNQWN0aW9ucy5TVU1NQVJZLnRvTG93ZXJDYXNlKCksIHsgYWN0aW9uOiAnc3VtbWFyeScgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1bW1hcnlDb3B5UGxhdXNpYmxlKCk6IHZvaWQge1xyXG4gICAgUGxhdXNpYmxlSGVscGVyLmN1c3RvbUV2ZW50KExMTUFjdGlvbnMuU1VNTUFSWS50b0xvd2VyQ2FzZSgpLCB7IGFjdGlvbjogJ2NvcHknIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY3JvbGwoZWxlbWVudENsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRyYW5zbGF0ZWQtc291cmNlJyk7XHJcbiAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGVsZW1lbnRDbGFzc05hbWUpLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhclN1bW1hcml6ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3VtbWFyaXplZFRleHQgPSBudWxsO1xyXG4gICAgdGhpcy5tYXJrZWRTdW1tYXJpemVkVGV4dCA9IG51bGw7XHJcbiAgfVxyXG59XHJcbiIsIjwhLS0gTk9URS4gdGxkLXNvdXJjZS1hbmQtdGFyZ2V0LXdyYXBwZXIgdXNlcyBtdWx0aXBsZSBjb250ZW50IHByb2plY3Rpb25zLCBzbyBtaWdodCBzZWVtIGNvbmZ1c2luZyBmaXJzdCwgYnV0IGVsZW1lbnRzIGFyZSBkaXNwbGF5ZWQgYXQgdGhlaXIgcGxhY2VzIGJhc2VkIG9uIHRsZC1zb3VyY2UtYW5kLXRhcmdldC13cmFwcGVyIGNvbXBvbmVudFxyXG5odHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvY29udGVudC1wcm9qZWN0aW9uI211bHRpLXNsb3QtY29udGVudC1wcm9qZWN0aW9uXHJcbi0tPlxyXG48dGxkLXNvdXJjZS1hbmQtdGFyZ2V0LXdyYXBwZXJcclxuXHRbdGV4dFRvU3BlZWNoU291cmNlU2V0dGluZ3NdPVwidGV4dFRvU3BlZWNoU291cmNlU2V0dGluZ3NcIlxyXG5cdFtjbGVhclNvdXJjZVZpc2libGVdPVwic291cmNlPy5sZW5ndGggPiAwXCJcclxuXHQob25Tb3VyY2VDbGVhcik9XCJjbGVhclNvdXJjZSgpXCJcclxuXHRbY2xlYXJEaXNhYmxlZF09XCJ0ZXh0YXJlYURpc2FibGVkXCJcclxuXHRbY2xlYXJTb3VyY2VUb29sdGlwXT1cIidUTERfVFJBTlNMQVRFLkNMRUFSX1NPVVJDRV9UT09MVElQJ1wiXHJcblx0W25nQ2xhc3NdPVwieyAnaGlnaGxpZ2h0LWFjdGl2ZSc6IGhpZ2hsaWdodCwgJ2VtcHR5LXRhcmdldCc6IGlzRW1wdHlUYXJnZXQgfVwiXHJcbj5cclxuXHQ8ZGl2IHNvdXJjZU1haW4gY2xhc3M9XCJzb3VyY2UtbWFpblwiIGZ4TGF5b3V0PVwiY29sdW1uXCI+XHJcblx0XHQ8dGxkLXRyYW5zbGF0ZS1zb3VyY2UgW3RleHRhcmVhRGlzYWJsZWRdPVwidGV4dGFyZWFEaXNhYmxlZFwiICNzb3VyY2VDb21wb25lbnQgZnhGbGV4IFtzb3VyY2VQYXJhZ3JhcGhzXT1cInNvdXJjZVBhcmFncmFwaHNcIj48L3RsZC10cmFuc2xhdGUtc291cmNlPlxyXG5cdDwvZGl2PlxyXG5cdDxuZy1jb250YWluZXIgZGljdGF0aW9uICpuZ0lmPVwiYXVkaW9JbnB1dFZpc2libGUoKVwiPlxyXG5cdFx0PHRsZC1kaWN0YXRlXHJcblx0XHRcdCNkaWN0YXRlXHJcblx0XHRcdFtjb25maWd1cmF0aW9uXT1cImRpY3RhdGVDb25maWdcIlxyXG5cdFx0XHRbbmdDbGFzc109XCJ7ICdmdWxsLXdpZHRoJzogIWZpbGVVcGxvYWQgfVwiXHJcblx0XHRcdChpc0RpY3RhdGluZyk9XCJkaWN0YXRlU3RhcnRTdG9wKCRldmVudClcIlxyXG5cdFx0XHQocmVzdWx0KT1cImRpY3RhdGVSZXN1bHQoJGV2ZW50KVwiXHJcblx0XHRcdChwYXJ0aWFsUmVzdWx0KT1cImRpY3RhdGVQYXJ0aWFsUmVzdWx0KCRldmVudClcIlxyXG5cdFx0XHQob25FcnJvcik9XCJkaWN0YXRlRXJyb3IoJGV2ZW50KVwiXHJcblx0XHRcdFtzeXN0ZW1JZF09XCJvbmxpbmVBc3JTeXN0ZW1JZCgpXCJcclxuXHRcdD5cclxuXHRcdDwvdGxkLWRpY3RhdGU+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblxyXG5cdDxidXR0b24gY29tcGFjdFVwbG9hZCBtYXQtaWNvbi1idXR0b24gW21hdFRvb2x0aXBdPVwiJ1RPT0xUSVBTLlVQTE9BRCcgfCB0cmFuc2xhdGVcIiBbZGlzYWJsZWRdPVwiZmlsZVVwbG9hZERpc2FibGVkXCIgKGNsaWNrKT1cIm9wZW5GaWxlVXBsb2FkKClcIj5cclxuXHRcdDxtYXQtaWNvbiBbc3ZnSWNvbl09XCIndXBsb2FkJ1wiPjwvbWF0LWljb24+XHJcblx0PC9idXR0b24+XHJcblxyXG5cdDxuZy1jb250YWluZXIgc291cmNlQWN0aW9ucz5cclxuXHRcdDxkaXYgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiIFtjbGFzcy5iYXNpYy1wYWRkaW5nXT1cImZpbGVVcGxvYWRcIiBmeExheW91dEdhcD1cIjFlbVwiPlxyXG5cdFx0XHQ8ZGl2IFtjbGFzcy5oaWRkZW5dPVwiIWZpbGVVcGxvYWRcIiBjbGFzcz1cImZpbGUtdXBsb2FkLXdyYXBwZXJcIj5cclxuXHRcdFx0XHQ8bGliLWZpbGUtdXBsb2FkXHJcblx0XHRcdFx0XHQoZmlsZUNoYW5nZSk9XCJmaWxlQ2hhbmdlKCRldmVudClcIlxyXG5cdFx0XHRcdFx0W2FjY2VwdF09XCJhbGxvd2VkRmlsZVR5cGVzXCJcclxuXHRcdFx0XHRcdFttYXhTaXplXT1cIm1heEZpbGVVcGxvYWRTaXplXCJcclxuXHRcdFx0XHRcdFt1cGxvYWRJY29uTmFtZV09XCJ1cGxvYWRJY29uTmFtZVwiXHJcblx0XHRcdFx0XHRbZXh0ZW5kZWRBY2NlcHRMaXN0XT1cImV4dGVuZGVkRmlsZVR5cGVzXCJcclxuXHRcdFx0XHRcdFttdWx0aXBsZV09XCJtdWx0aXBsZUZpbGVzXCJcclxuXHRcdFx0XHRcdChlcnJvckV2ZW50KT1cImZpbGVVcGxvYWRFcnJvcigkZXZlbnQpXCJcclxuXHRcdFx0XHRcdFtmaWxlUHJldmlld1Byb2dyZXNzXT1cImZpbGVQcmV2aWV3UHJvZ3Jlc3NcIlxyXG5cdFx0XHRcdFx0W2Rpc2FibGVkXT1cImZpbGVVcGxvYWREaXNhYmxlZFwiXHJcblx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ1cGxvYWQtZmlsZS10ZXh0XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaW5mb1wiPlxyXG5cdFx0XHRcdFx0XHRcdDxzcGFuIFtpbm5lckhUTUxdPVwiJ0ZJTEVfVVBMT0FELlVQTE9BRCcgfCB0cmFuc2xhdGVcIiBjbGFzcz1cImFjY2VudC1jb2xvclwiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8c3Bhbj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gW2lubmVySFRNTF09XCInRklMRV9VUExPQUQuRFJBR19BTkRfRFJPUCcgfCB0cmFuc2xhdGVcIiBmeEhpZGUubHQtc20+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdDxzcGFuIFtpbm5lckhUTUxdPVwiJ0ZJTEVfVVBMT0FELicgKyAobXVsdGlwbGVGaWxlcyA/ICdGSUxFUycgOiAnRklMRScpIHwgdHJhbnNsYXRlXCIgW25nQ2xhc3MubHQtc21dPVwiJ2FjY2VudC1jb2xvcidcIj48L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZmlsZS11cGxvYWQtZXh0ZW5zaW9ucyB0ZXh0LW1cIj5cclxuXHRcdFx0XHRcdFx0XHQoJm5ic3A7PHNwYW4+e3sgdmlzaWJsZUV4dGVuc2lvbnMgfX0uPC9zcGFuPiZuYnNwO1xyXG5cdFx0XHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwibWF4U2l6ZU1CXCIgY2xhc3M9XCJmaWxlLXVwbG9hZC1tYXgtc2l6ZVwiIFtpbm5lckhUTUxdPVwiJ0ZJTEVfVVBMT0FELkxJTUlUU19NQicgfCB0cmFuc2xhdGUgOiB7IG1heFNpemVNQjogbWF4U2l6ZU1CIH1cIj48L3NwYW4+Jm5ic3A7KVxyXG5cdFx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC9saWItZmlsZS11cGxvYWQ+XHJcblx0XHRcdFx0PGxpYi1vcGVuLWV4dGVuc2lvbi1kaWFsb2cgKm5nSWY9XCJzaG93RXh0ZW5zaW9uUG9wdXBcIiBbZXh0ZW5zaW9uc109XCJhbGxvd2VkVHlwZXNXaXRob3V0RG90c1wiPiA8L2xpYi1vcGVuLWV4dGVuc2lvbi1kaWFsb2c+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC9kaXY+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblxyXG5cdDxkaXYgdGFyZ2V0TWFpbiBjbGFzcz1cInRhcmdldC1tYWluXCI+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFbXB0eVRhcmdldDsgZWxzZSB0cmFuc2xhdGVkVGV4dEJsb2NrXCI+XHJcblx0XHRcdDxwICpuZ0lmPVwic2hvd1RhcmdldFBsYWNlaG9sZGVyXCIgY2xhc3M9XCJkZXNjcmlwdGlvbi10ZXh0IHRhcmdldC1lbXB0eVwiIFtpbm5lckh0bWxdPVwiJ1RMRF9UUkFOU0xBVEUuVEFSR0VUX0RFU0NSSVBUSU9OJyB8IHRyYW5zbGF0ZVwiPjwvcD5cclxuXHRcdDwvbmctY29udGFpbmVyPlxyXG5cdDwvZGl2PlxyXG5cclxuXHQ8bmctY29udGFpbmVyIHRhcmdldEFjdGlvbnM+XHJcblx0XHQ8ZGl2IGNsYXNzPVwidGxkLXRyYW5zbGF0ZS10YXJnZXQtZm9vdGVyIGJhc2ljLXBhZGRpbmdcIiAqbmdJZj1cInNob3dQcm9ncmVzc0luZGljYXRvclwiPlxyXG5cdFx0XHQ8cHJvZ3Jlc3MtaW5kaWNhdG9yIChvbkNsb3NlKT1cImNsb3NlUHJvZ3Jlc3NJbmRpY2F0b3IoKVwiICpuZ0lmPVwic2hvd1Byb2dyZXNzSW5kaWNhdG9yXCI+PC9wcm9ncmVzcy1pbmRpY2F0b3I+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L25nLWNvbnRhaW5lcj5cclxuPC90bGQtc291cmNlLWFuZC10YXJnZXQtd3JhcHBlcj5cclxuXHJcbjwhLS0gdGVtcGxhdGVzIHVzZWQgZm9yIGVsc2UgYmxvY2tzIGluIHRhcmdldCBjb250YWluZXIgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjdHJhbnNsYXRlZFRleHRCbG9jaz5cclxuXHQ8ZGl2IFtjbGFzcy50cmFuc2xhdGVkLXNvdXJjZS1vdmVyZmxvd109XCJ0YXJnZXRXcmFwcGVyT3ZlcmZsb3dcIiBjbGFzcz1cInRyYW5zbGF0ZWQtc291cmNlXCI+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIXVybFRvVHJhbnNsYXRlXCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJ0YXJnZXQtd3JhcHBlci1hY3Rpb24tYnV0dG9uc1wiPlxyXG5cdFx0XHRcdDxidXR0b25cclxuXHRcdFx0XHRcdG1hdC1pY29uLWJ1dHRvblxyXG5cdFx0XHRcdFx0Km5nSWY9XCJmaXJzdFBhcmFncmFwaFRyYW5zbGF0ZWRcIlxyXG5cdFx0XHRcdFx0Y2xhc3M9XCJ0bGQtY29weS10cmFuc2xhdGlvblwiXHJcblx0XHRcdFx0XHQoY2xpY2spPVwiY29weSgpXCJcclxuXHRcdFx0XHRcdFttYXRUb29sdGlwXT1cIidUT09MVElQUy5DT1BZJyB8IHRyYW5zbGF0ZVwiXHJcblx0XHRcdFx0XHRbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImNvcHlNZXNzYWdlSWRcIlxyXG5cdFx0XHRcdFx0W2F0dHIuSWRdPVwiY29weUJ1dHRvbklkXCJcclxuXHRcdFx0XHRcdChrZXlkb3duLlRhYik9XCJzd2l0Y2hGb2N1c0Zyb21Db3B5KCRldmVudClcIlxyXG5cdFx0XHRcdD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInQVJJQV9MQUJFTFMuQ09QWScgfCB0cmFuc2xhdGVcIj4gY29udGVudF9jb3B5IDwvc3Bhbj5cclxuXHRcdFx0XHQ8L2J1dHRvbj5cclxuXHJcblx0XHRcdFx0PGJ1dHRvblxyXG5cdFx0XHRcdFx0bWF0LWljb24tYnV0dG9uXHJcblx0XHRcdFx0XHQqbmdJZj1cImZpcnN0UGFyYWdyYXBoVHJhbnNsYXRlZCB8fCB0cmFuc2xhdGlvbkVycm9yXCJcclxuXHRcdFx0XHRcdGNsYXNzPVwidGxkLXJlZnJlc2gtdHJhbnNsYXRpb25cIlxyXG5cdFx0XHRcdFx0W21hdFRvb2x0aXBdPVwiJ1RPT0xUSVBTLlJFRlJFU0gnIHwgdHJhbnNsYXRlXCJcclxuXHRcdFx0XHRcdChjbGljayk9XCJyZWZyZXNoKClcIlxyXG5cdFx0XHRcdD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInQVJJQV9MQUJFTFMuUkVGUkVTSCcgfCB0cmFuc2xhdGVcIj4gcmVmcmVzaCA8L3NwYW4+XHJcblx0XHRcdFx0PC9idXR0b24+XHJcblxyXG5cdFx0XHRcdDxkaXYgW21hdFRvb2x0aXBdPVwiJ1RMRF9UUkFOU0xBVEUuUkVQSFJBU0UuVE9PTFRJUCcgfCB0cmFuc2xhdGVcIj5cclxuXHRcdFx0XHRcdEBpZiAoaXNMbG1FbmFibGVkICYmIGZpcnN0UGFyYWdyYXBoVHJhbnNsYXRlZCkge1xyXG5cdFx0XHRcdFx0PGxpYi1uZXctZmVhdHVyZS1kaWFsb2ctd3JhcHBlclxyXG5cdFx0XHRcdFx0XHQjcmVwaHJhc2VGZWF0dXJlXHJcblx0XHRcdFx0XHRcdFt0aXRsZUxvY2FsaXphdGlvbktleV09XCInVExEX1RSQU5TTEFURS5SRVBIUkFTRS5ORVdfRkVBVFVSRS5USVRMRSdcIlxyXG5cdFx0XHRcdFx0XHRbZGVzY3JpcHRpb25Mb2NhbGl6YXRpb25LZXldPVwiJ1RMRF9UUkFOU0xBVEUuUkVQSFJBU0UuTkVXX0ZFQVRVUkUuREVTQ1JJUFRJT04nXCJcclxuXHRcdFx0XHRcdFx0W2Nsb3NlTG9jYWxpemF0aW9uS2V5XT1cIidUTERfVFJBTlNMQVRFLlJFUEhSQVNFLk5FV19GRUFUVVJFLkNMT1NFJ1wiXHJcblx0XHRcdFx0XHRcdFtmZWF0dXJlQ2xhc3NOYW1lXT1cIid0bGQtcmVwaHJhc2UnXCJcclxuXHRcdFx0XHRcdFx0W2ZlYXR1cmVMb2NhbFN0b3JhZ2VLZXldPVwicmVwaHJhc2VGZWF0dXJlTG9jYWxTdG9yYWdlS2V5XCJcclxuXHRcdFx0XHRcdFx0W3RpbWVvdXRdPVwiMTAwMFwiXHJcblx0XHRcdFx0XHRcdFttYXhXaWR0aF09XCJpc01vYmlsZSA/IDMyMCA6IDQwMFwiXHJcblx0XHRcdFx0XHQ+PC9saWItbmV3LWZlYXR1cmUtZGlhbG9nLXdyYXBwZXI+XHJcblx0XHRcdFx0XHRcdDxidXR0b25cclxuXHRcdFx0XHRcdFx0XHRtYXQtaWNvbi1idXR0b25cclxuXHRcdFx0XHRcdFx0XHRjbGFzcz1cInRsZC1yZXBocmFzZVwiXHJcblx0XHRcdFx0XHRcdFx0W2NsYXNzLnJlcGhyYXNlLWZlYXR1cmUtYWN0aXZlXT1cInJlcGhyYXNlRmVhdHVyZT8uZmVhdHVyZUFjdGl2ZSgpXCJcclxuXHRcdFx0XHRcdFx0XHRbZGlzYWJsZWRdPVwiaXNUcmFuc2xhdGluZyB8fCBpc1N1bW1hcmF6aW5nXCJcclxuXHRcdFx0XHRcdFx0XHQoY2xpY2spPVwic2hvd1JlcGhyYXNlT3B0aW9ucygpXCJcclxuXHRcdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtaWNvbiBbc3ZnSWNvbl09XCIncmVwaHJhc2UnXCIgYXJpYS1oaWRkZW49XCJmYWxzZVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0FSSUFfTEFCRUxTLlJFUEhSQVNFJyB8IHRyYW5zbGF0ZVwiPjwvbWF0LWljb24+XHJcblx0XHRcdFx0XHRcdDwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cclxuXHRcdFx0XHQ8ZGl2IFttYXRUb29sdGlwXT1cIihpc1RleHRTdW1tYXJpemFibGUgPyAnVE9PTFRJUFMuQ1JFQVRFX1NVTU1BUlknIDogJ1RMRF9UUkFOU0xBVEUuU1VNTUFSWS5ESVNBQkxFRCcpIHwgdHJhbnNsYXRlXCI+XHJcblx0XHRcdFx0XHRAaWYgKGlzTGxtRW5hYmxlZCAmJiBmaXJzdFBhcmFncmFwaFRyYW5zbGF0ZWQpIHtcclxuXHRcdFx0XHRcdDxsaWItbmV3LWZlYXR1cmUtZGlhbG9nLXdyYXBwZXJcclxuXHRcdFx0XHRcdFx0I3N1bW1hcml6ZUZlYXR1cmVcclxuXHRcdFx0XHRcdFx0W3RpdGxlTG9jYWxpemF0aW9uS2V5XT1cIidUTERfVFJBTlNMQVRFLlNVTU1BUlkuTkVXX0ZFQVRVUkUuVElUTEUnXCJcclxuXHRcdFx0XHRcdFx0W2Rlc2NyaXB0aW9uTG9jYWxpemF0aW9uS2V5XT1cIidUTERfVFJBTlNMQVRFLlNVTU1BUlkuTkVXX0ZFQVRVUkUuREVTQ1JJUFRJT04nXCJcclxuXHRcdFx0XHRcdFx0W2Nsb3NlTG9jYWxpemF0aW9uS2V5XT1cIidUTERfVFJBTlNMQVRFLlNVTU1BUlkuTkVXX0ZFQVRVUkUuQ0xPU0UnXCJcclxuXHRcdFx0XHRcdFx0W2ZlYXR1cmVDbGFzc05hbWVdPVwiJ3RsZC1jcmVhdGUtc3VtbWFyeSdcIlxyXG5cdFx0XHRcdFx0XHRbZmVhdHVyZUxvY2FsU3RvcmFnZUtleV09XCJzdW1tYXJpemVGZWF0dXJlTG9jYWxTdG9yYWdlS2V5XCJcclxuXHRcdFx0XHRcdFx0W3RpbWVvdXRdPVwiMTAwMFwiXHJcblx0XHRcdFx0XHQ+PC9saWItbmV3LWZlYXR1cmUtZGlhbG9nLXdyYXBwZXI+XHJcblxyXG5cdFx0XHRcdFx0PGJ1dHRvblxyXG5cdFx0XHRcdFx0XHRtYXQtaWNvbi1idXR0b25cclxuXHRcdFx0XHRcdFx0Y2xhc3M9XCJ0bGQtY3JlYXRlLXN1bW1hcnlcIlxyXG5cdFx0XHRcdFx0XHRbY2xhc3Muc3VtbWFyaXplLWZlYXR1cmUtYWN0aXZlXT1cInN1bW1hcml6ZUZlYXR1cmU/LmZlYXR1cmVBY3RpdmUoKVwiXHJcblx0XHRcdFx0XHRcdFtkaXNhYmxlZF09XCJpc1RyYW5zbGF0aW5nIHx8IGlzU3VtbWFyYXppbmcgfHwgIWlzVGV4dFN1bW1hcml6YWJsZVwiXHJcblx0XHRcdFx0XHRcdChjbGljayk9XCJjcmVhdGVTdW1tYXJ5KClcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHQ8bWF0LWljb24gW3N2Z0ljb25dPVwiJ3N1bW1hcml6ZSdcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInQVJJQV9MQUJFTFMuQ1JFQVRFX1NVTU1BUlknIHwgdHJhbnNsYXRlXCI+PC9tYXQtaWNvbj5cclxuXHRcdFx0XHRcdDwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDx0bGQtdGV4dC10by1zcGVlY2ggKm5nSWY9XCJ0ZXh0VG9TcGVlY2hUYXJnZXRTZXR0aW5ncyAmJiBmaXJzdFBhcmFncmFwaFRyYW5zbGF0ZWRcIiBbc2V0dGluZ3NdPVwidGV4dFRvU3BlZWNoVGFyZ2V0U2V0dGluZ3NcIj4gPC90bGQtdGV4dC10by1zcGVlY2g+XHJcblx0XHRcdDwvZGl2PlxyXG5cclxuXHRcdFx0PGRpdiBjbGFzcz1cImhpZ2hsaWdodC10cmVlLXdyYXBwZXJcIj5cclxuXHRcdFx0XHQ8dGxkLWhpZ2hsaWdodC10cmVlICpuZ0Zvcj1cImxldCBwYXJhZ3JhcGggb2YgdGFyZ2V0UGFyYWdyYXBoc1wiIFtoaWdobGlnaHRdPVwiaGlnaGxpZ2h0XCIgW3RyZWVdPVwicGFyYWdyYXBoXCI+IDwvdGxkLWhpZ2hsaWdodC10cmVlPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHJcblx0XHRcdDxkaXYgKm5nSWY9XCJpc1N1bW1hcmF6aW5nIHx8IHN1bW1hcml6ZWRUZXh0XCIgY2xhc3M9XCJzdW1tYXJ5LXdyYXBwZXJcIj5cclxuXHRcdFx0XHQ8cCBjbGFzcz1cInN1bW1hcnktdGl0bGVcIj57eyBcIlRMRF9UUkFOU0xBVEUuU1VNTUFSWS5USVRMRVwiIHwgdHJhbnNsYXRlIH19PC9wPlxyXG5cclxuXHRcdFx0XHQ8cCAqbmdJZj1cImlzU3VtbWFyYXppbmdcIiBjbGFzcz1cImNyZWF0aW5nLXByb2dyZXNzXCI+e3sgXCJUTERfVFJBTlNMQVRFLlNVTU1BUlkuQ1JFQVRJTkdcIiB8IHRyYW5zbGF0ZSB9fTxzcGFuIGNsYXNzPVwiZG90LWxvYWRpbmdcIj4uLi48L3NwYW4+PC9wPlxyXG5cclxuXHRcdFx0XHQ8cCBbaW5uZXJIVE1MXT1cIm1hcmtlZFN1bW1hcml6ZWRUZXh0XCI+PC9wPlxyXG5cclxuXHRcdFx0XHQ8YnV0dG9uXHJcblx0XHRcdFx0XHRtYXQtaWNvbi1idXR0b25cclxuXHRcdFx0XHRcdCpuZ0lmPVwic3VtbWFyaXplZFRleHRcIlxyXG5cdFx0XHRcdFx0W25nQ2xhc3MubHQtc21dPVwiJ3N1bW1hcnktbW9iaWxlJ1wiXHJcblx0XHRcdFx0XHRjbGFzcz1cInN1bW1hcnktY29weS1idG5cIlxyXG5cdFx0XHRcdFx0KGNsaWNrKT1cImNvcHlTdW1tYXJpemVkVGV4dCgpXCJcclxuXHRcdFx0XHRcdFttYXRUb29sdGlwXT1cIidUT09MVElQUy5DT1BZJyB8IHRyYW5zbGF0ZVwiXHJcblx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidBUklBX0xBQkVMUy5DT1BZJyB8IHRyYW5zbGF0ZVwiPiBjb250ZW50X2NvcHkgPC9zcGFuPlxyXG5cdFx0XHRcdDwvYnV0dG9uPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHJcblx0XHRcdDxkaXYgKm5nSWY9XCJpc1JlcGhyYXNlQWN0aXZlXCIgY2xhc3M9XCJyZXBocmFzZS13cmFwcGVyXCI+XHJcblx0XHRcdFx0PHRsZC1yZXBocmFzZSBbdGV4dF09XCJ0cmFuc2xhdGVkVGV4dFwiIFtkaXNhYmxlZF09XCJpc1RyYW5zbGF0aW5nXCIgW2xhbmd1YWdlXT1cInRhcmdldExhbmd1YWdlXCI+PC90bGQtcmVwaHJhc2U+XHJcblx0XHRcdDwvZGl2Plx0XHJcblxyXG5cdFx0XHQ8ZGl2ICpuZ0lmPVwiZmlyc3RQYXJhZ3JhcGhUcmFuc2xhdGVkICYmIGRpY3Rpb25hcnlFbnRyeVwiIGNsYXNzPVwiZGljdGlvbmFyeS13cmFwcGVyXCI+XHJcblx0XHRcdFx0PHRsZC1kaWN0aW9uYXJ5IFtkaWN0aW9uYXJ5XT1cImRpY3Rpb25hcnlFbnRyeVwiPjwvdGxkLWRpY3Rpb25hcnk+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblxyXG5cdFx0PGRpdiAqbmdJZj1cInVybFRvVHJhbnNsYXRlXCIgY2xhc3M9XCJ0YXJnZXQtdXJsLWNvbnRhaW5lclwiPlxyXG5cdFx0XHQ8YSBbYXR0ci5ocmVmXT1cInRyYW5zbGF0ZVVybFJlZGlyZWN0XCIgdGFyZ2V0PVwiX2JsYW5rXCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiIGNsYXNzPVwiZ28tdG8td2VidHJhbnNsYXRlXCI+XHJcblx0XHRcdFx0e3sgdXJsVG9UcmFuc2xhdGUgfX1cclxuXHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCIgY29sb3I9XCJhY2NlbnRcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInQVJJQV9MQUJFTFMuT1BFTl9JTl9ORVcnXCI+IG9wZW5faW5fbmV3IDwvc3Bhbj5cclxuXHRcdFx0PC9hPlxyXG5cdFx0PC9kaXY+XHJcblx0PC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
365
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGxkLXRyYW5zbGF0ZS10ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RsZC10cmFuc2xhdGUvc3JjL2xpYi9tb2R1bGVzL3RsZC10ZXh0L2NvbXBvbmVudHMvdGxkLXRyYW5zbGF0ZS10ZXh0L3RsZC10cmFuc2xhdGUtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90bGQtdHJhbnNsYXRlL3NyYy9saWIvbW9kdWxlcy90bGQtdGV4dC9jb21wb25lbnRzL3RsZC10cmFuc2xhdGUtdGV4dC90bGQtdHJhbnNsYXRlLXRleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxjQUFjLEVBQTZCLE1BQU0sMkJBQTJCLENBQUM7QUFRdEYsT0FBTyxFQUE0QixnQkFBZ0IsRUFBbUIsVUFBVSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvSixPQUFPLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNoQyxNQUFNLE9BQU8seUJBQXlCO0lBNEdqQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7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R0FBRyxFQUFFO1lBQ2QsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQy9ELFNBQVMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7SUFDbkMsQ0FBQzt3R0E3VVUseUJBQXlCOzRGQUF6Qix5QkFBeUIsK1dDeEJ0Qyx1NVRBc01BOzs0RkQ5S2EseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLG9CQUFvQjt5YUFLQSxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDTixnQkFBZ0I7c0JBQXJDLFNBQVM7dUJBQUMsU0FBUztnQkFDWCxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jbGlwYm9hcmQnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBzaWduYWwsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaW5hbGl6ZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBBdWRpb0Vycm9yQ2FzZSwgSVRyYW5zY3JpcHRpb25VcGRhdGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3RsZC1hdWRpby9tb2RlbHMnO1xyXG5pbXBvcnQgeyBJRGljdGF0ZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi8uLi8uLi90bGQtYXVkaW8vbW9kZWxzL2RpY3RhdGUtY29uZmlndXJhdGlvbmkubW9kZWwnO1xyXG5pbXBvcnQgeyBBdWRpb1JlY29yZFNlcnZpY2UsIFRsZFZvaWNlSW5wdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdGxkLWF1ZGlvL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgVGxkVHJhbnNsYXRlU3lzdGVtTWFuYWdlbWVudFNlcnZpY2UsIFRsZFRyYW5zbGF0ZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi90bGQtY29tbW9uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgVGxkU2Nyb2xsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3RsZC1jb21tb24vc2VydmljZXMvc2Nyb2xsL3RsZC1zY3JvbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IFRsZFRyYW5zbGF0ZUZpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdGxkLWRvY3VtZW50L3NlcnZpY2VzJztcclxuaW1wb3J0IHsgVGxkVHJhbnNsYXRlVGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90bGQtdHJhbnNsYXRlLXRleHQuc2VydmljZSc7XHJcbmltcG9ydCB7IFRsZFRyYW5zbGF0ZVNvdXJjZUNvbXBvbmVudCB9IGZyb20gJy4uL3RsZC10cmFuc2xhdGUtc291cmNlL3RsZC10cmFuc2xhdGUtc291cmNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFjdGl2ZURhdGEsIEFsZXJ0U2VydmljZSwgQ29udmVyc2lvbkhlbHBlciwgRmlsZVVwbG9hZEVycm9yLCBIYXNoSGVscGVyLCBQbGF1c2libGVIZWxwZXIsIFJlc29sdXRpb25IZWxwZXIsIExMTUFjdGlvbnMgfSBmcm9tICdAdGlsZGUtbmxwL25neC1jb21tb24nO1xyXG5pbXBvcnQgeyBUbGREaWN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vdGxkLWF1ZGlvJztcclxuaW1wb3J0IHsgTExNU2VydmljZSwgTExNU3VtbWFyeVVzZUNhc2UgfSBmcm9tICdAdGlsZGUtbmxwL25neC1zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IG1hcmtlZCB9IGZyb20gJ21hcmtlZCc7XHJcbmltcG9ydCB7IEtleWNsb2FrU2VydmljZSB9IGZyb20gJ2tleWNsb2FrLWFuZ3VsYXInO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndGxkLXRyYW5zbGF0ZS10ZXh0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGxkLXRyYW5zbGF0ZS10ZXh0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90bGQtdHJhbnNsYXRlLXRleHQuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGxkVHJhbnNsYXRlVGV4dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKFwic291cmNlQ29tcG9uZW50XCIpIHNvdXJjZUNvbXBvbmVudDogVGxkVHJhbnNsYXRlU291cmNlQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWN0YXRlXCIpIGRpY3RhdGVDb21wb25lbnQ6IFRsZERpY3RhdGVDb21wb25lbnQ7XHJcbiAgQElucHV0KCkgZmlsZVByZXZpZXdQcm9ncmVzczogbnVtYmVyO1xyXG4gIEBPdXRwdXQoKSBvbkZpbGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxGaWxlW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlW10+KCk7XHJcblxyXG4gIGFjdGl2ZURhdGEgPSBzaWduYWw8QWN0aXZlRGF0YSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcclxuICBnZXQgc3lzdGVtSWQoKSB7IHJldHVybiB0aGlzLmFjdGl2ZURhdGEoKT8uc3lzdGVtSWQ7IH07XHJcbiAgLy9wYXJhbXMgZnJvbSBjb25maWcgc2VydmljZS5cclxuICBnZXQgYWxsb3dlZEZpbGVUeXBlcygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLmNvbmZpZy5maWxlQ29uZmlnLmFsbG93ZWRGaWxlVHlwZXM7IH07XHJcbiAgZ2V0IGV4dGVuZGVkRmlsZVR5cGVzKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMuY29uZmlnLmZpbGVDb25maWcuZXh0ZW5kZWRGaWxlVHlwZXM7IH07XHJcbiAgZ2V0IGFwcElkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmNvbmZpZy5jb3JlQ29uZmlnLmFwcElkOyB9O1xyXG4gIGdldCBoaWdobGlnaHQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmNvbmZpZy50ZXh0Q29uZmlnLmhpZ2hsaWdodDsgfTtcclxuICBnZXQgZmlsZVVwbG9hZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY29uZmlnLmZpbGVDb25maWcuZmlsZVVwbG9hZCAmJiAhdGhpcy5pc01vYmlsZSAmJiAhKHRoaXMuaXNEaWN0YXRpbmcgfHwgdGhpcy5hdWRpb1NlcnZpY2U/LmlzUmVjb3JkaW5nIHx8IHRoaXMudm9pY2VJbnB1dFNlcnZpY2UuaXNQcm9jZXNzaW5nKSAmJiAhdGhpcy5zb3VyY2U/Lmxlbmd0aCB9O1xyXG4gIGdldCBpc0F1dGgoKSB7IHJldHVybiB0aGlzLmNvbmZpZy5jb3JlQ29uZmlnLmlzQXV0aDsgfTtcclxuICBnZXQgbWF4RmlsZVVwbG9hZFNpemUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuY29uZmlnLmZpbGVDb25maWcubWF4U2l6ZTsgfTtcclxuICBnZXQgbXVsdGlwbGVGaWxlcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY29uZmlnLmZpbGVDb25maWcubnVtYmVyT2ZGaWxlc0FsbG93ZWQgPiAxOyB9O1xyXG4gIGdldCB1cGRhdGVUcmFuc2xhdGlvblVybCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5jb25maWcudGV4dENvbmZpZy51cGRhdGVUcmFuc2xhdGlvblVybDsgfTtcclxuICBnZXQgYWxsb3dXZWJzaXRlVHJhbnNsYXRpb24oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmNvbmZpZy50ZXh0Q29uZmlnLmFsbG93V2Vic2l0ZVRyYW5zbGF0aW9uOyB9O1xyXG4gIGdldCBhdXRvUmVkaXJlY3RUb1dlYlRyYW5zbGF0ZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY29uZmlnLnRleHRDb25maWcuYXV0b1JlZGlyZWN0VG9XZWJUcmFuc2xhdGU7IH07XHJcbiAgZ2V0IHdlYldpZGdldFJlZGlyZWN0VXJsUHJlZml4KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmNvbmZpZy50ZXh0Q29uZmlnLndlYldpZGdldFJlZGlyZWN0VXJsUHJlZml4OyB9O1xyXG4gIGdldCB3ZWJXaWRnZXRSZWRpcmVjdFVybFBvc2ZpeCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5jb25maWcudGV4dENvbmZpZy53ZWJXaWRnZXRSZWRpcmVjdFVybFBvc2ZpeDsgfTtcclxuICBnZXQgdGV4dGFyZWFEaXNhYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuYXVkaW9TZXJ2aWNlLmlzUmVjb3JkaW5nIHx8IHRoaXMudm9pY2VJbnB1dFNlcnZpY2UuaXNQcm9jZXNzaW5nIHx8IHRoaXMuaXNEaWN0YXRpbmcgfHwgdGhpcy50bGRTeXN0ZW0ubm9TeXN0ZW1zRXJyb3IgfTtcclxuICBnZXQgZmlsZVVwbG9hZERpc2FibGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy50bGRTeXN0ZW0ubm9TeXN0ZW1zRXJyb3IgfTtcclxuICBnZXQgaXNEaWN0YXRpbmcoKSB7IHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmlzRGljdGF0aW5nOyB9O1xyXG4gIGdldCBzb3VyY2VMYW5ndWFnZSgpIHsgcmV0dXJuIHRoaXMuYWN0aXZlRGF0YSgpPy5zb3VyY2VMYW5nLmxhbmc7IH1cclxuICBnZXQgdGFyZ2V0TGFuZ3VhZ2UoKSB7IHJldHVybiB0aGlzLmFjdGl2ZURhdGEoKT8udGFyZ2V0TGFuZy5sYW5nOyB9XHJcbiAgZ2V0IGhhc1RyYW5zbGF0ZWRQYXJhZ3JhcGhzKCkgeyByZXR1cm4gdGhpcy50YXJnZXRQYXJhZ3JhcGhzPy5sZW5ndGggPiAwIH1cclxuICBnZXQgaXNFbXB0eVRhcmdldCgpIHsgcmV0dXJuICF0aGlzLmhhc1RyYW5zbGF0ZWRQYXJhZ3JhcGhzICYmICF0aGlzLnVybFRvVHJhbnNsYXRlICYmICF0aGlzLmhhc0RpY3Rpb25hcnkgfVxyXG4gIGdldCBzaG93VGFyZ2V0UGxhY2Vob2xkZXIoKSB7IHJldHVybiB0aGlzLmNvbmZpZy50ZXh0Q29uZmlnLnNob3dUYXJnZXRQbGFjZWhvbGRlciB9XHJcbiAgZ2V0IHNob3dFeHRlbnNpb25Qb3B1cCgpIHsgcmV0dXJuIHRoaXMuY29uZmlnLnRleHRDb25maWcuc2hvd0V4dGVuc2lvblBvcHVwICYmIHRoaXMudmlzaWJsZUV4dGVuc2lvbkNvdW50IDwgdGhpcy5hbGxvd2VkRmlsZVR5cGVzLmxlbmd0aCB9XHJcbiAgZ2V0IHZpc2libGVFeHRlbnNpb25Db3VudCgpIHsgcmV0dXJuIHRoaXMuY29uZmlnLnRleHRDb25maWcudmlzaWJsZUV4dGVuc2lvbkNvdW50IH07XHJcbiAgZ2V0IHRleHRUb1NwZWVjaFRhcmdldFNldHRpbmdzKCkgeyByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS50ZXh0VG9TcGVlY2hUYXJnZXRTZXR0aW5ncyB9O1xyXG4gIGdldCB0ZXh0VG9TcGVlY2hTb3VyY2VTZXR0aW5ncygpIHsgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UudGV4dFRvU3BlZWNoU291cmNlU2V0dGluZ3MgfTtcclxuICBnZXQgdXBsb2FkSWNvbk5hbWUoKSB7IHJldHVybiB0aGlzLmNvbmZpZy5jb3JlQ29uZmlnLnVwbG9hZEljb25OYW1lIH07XHJcbiAgZ2V0IGlzTGxtRW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuY29uZmlnLmxsbUNvbmZpZy5pc0VuYWJsZWQgfTtcclxuXHJcbiAgYXVkaW9JbnB1dFZpc2libGUgPSBjb21wdXRlZCgoKSA9PiB7IHJldHVybiB0aGlzLmNvbmZpZy5zcGVlY2hDb25maWcub25saW5lQXNyPy5lbmFibGVkICYmIHRoaXMub25saW5lQXNyU3lzdGVtSWQoKTsgfSk7XHJcbiAgdGFyZ2V0U2VudGVuY2VTZWxlY3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGdldCB1cmxUb1RyYW5zbGF0ZSgpIHsgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UudXJsVG9UcmFuc2xhdGU7IH07XHJcblxyXG4gIG9ubGluZUFzclN5c3RlbUlkID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3Qgb25saW5lU3lzdGVtcyA9IHRoaXMudGxkU3lzdGVtLm9ubGluZUFTclN5c3RlbXMoKTtcclxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuYWN0aXZlRGF0YSgpO1xyXG5cclxuICAgIGlmICghdGhpcy5jb25maWcuc3BlZWNoQ29uZmlnLm9ubGluZUFzcj8uZW5hYmxlZCAmJiBvbmxpbmVTeXN0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb25saW5lU3lzdGVtcy5maW5kKChvbmxpbmVTeXN0ZW0pID0+IG9ubGluZVN5c3RlbS5sYW5ndWFnZSA9PT0gYWN0aXZlPy5zb3VyY2VMYW5nLmxhbmcpPy5zeXN0ZW1JZDtcclxuICB9KTtcclxuXHJcbiAgYWxsb3dlZFR5cGVzV2l0aG91dERvdHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHJlYWRvbmx5IGNvcHlNZXNzYWdlSWQgPSBcInRsZC1jb3B5LXN1Y2Nlc3NcIjtcclxuICByZWFkb25seSBjb3B5TWVzc2FnZUNsb3NlQnV0dG9uSWQgPSBcInRsZC1jb3B5LXN1Y2Nlc3MtY2xvc2VcIjtcclxuICByZWFkb25seSBjb3B5QnV0dG9uSWQgPSBcInRsZC1jb3B5LXRvLWNsaXBib2FyZFwiO1xyXG5cclxuICBnZXQgdHJhbnNsYXRlZFRleHQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLnRyYW5zbGF0ZWRUZXh0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpcnN0UGFyYWdyYXBoVHJhbnNsYXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmZpcnN0UGFyYWdyYXBoVHJhbnNsYXRlZDtcclxuICB9XHJcblxyXG4gIGdldCBpc1RyYW5zbGF0aW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UuaXNUcmFuc2xhdGluZztcclxuICB9XHJcblxyXG4gIGdldCB0cmFuc2xhdGlvbkVycm9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc291cmNlICYmICF0aGlzLmlzVHJhbnNsYXRpbmc7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNUZXh0U3VtbWFyaXphYmxlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2Uuc291cmNlVGV4dD8ubGVuZ3RoID4gMzAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0RpY3Rpb25hcnkoKSB7IHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmhhc0RpY3Rpb25hcnk7IH1cclxuICBnZXQgZGljdGlvbmFyeUVudHJ5KCkgeyByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5kaWN0aW9uYXJ5RW50cnk7IH1cclxuICBnZXQgc291cmNlKCkgeyByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5zb3VyY2VUZXh0OyB9XHJcbiAgZ2V0IHRyYW5zbGF0ZVVybFJlZGlyZWN0KCkgeyByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS50cmFuc2xhdGVVcmxSZWRpcmVjdDsgfVxyXG4gIGdldCBzaG93UHJvZ3Jlc3NJbmRpY2F0b3IoKSB7IHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLnNob3VsZFNob3dQcm9ncmVzc0luZGljYXRvcjsgfVxyXG4gIGdldCBwYXJhZ3JhcGhzKCkgeyByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5wYXJhZ3JhcGhzOyB9O1xyXG4gIGdldCBzb3VyY2VQYXJhZ3JhcGhzKCkgeyByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5zb3VyY2VQYXJhZ3JhcGhzOyB9XHJcbiAgZ2V0IHRhcmdldFBhcmFncmFwaHMoKSB7IHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLnRhcmdldFBhcmFncmFwaHM7IH1cclxuXHJcbiAgZ2V0IHRhcmdldFdyYXBwZXJPdmVyZmxvdygpIHtcclxuICAgIGNvbnN0IHRhcmdldFdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGFyZ2V0LW1haW4nKTtcclxuICAgIGNvbnN0IHRhcmdldFdyYXBwZXJPdmVyZmxvdyA9IHRhcmdldFdyYXBwZXIuc2Nyb2xsSGVpZ2h0ID4gdGFyZ2V0V3JhcHBlci5jbGllbnRIZWlnaHQ7XHJcbiAgICByZXR1cm4gdGFyZ2V0V3JhcHBlck92ZXJmbG93O1xyXG4gIH1cclxuXHJcbiAgZGljdGF0ZUNvbmZpZzogSURpY3RhdGVDb25maWd1cmF0aW9uO1xyXG4gIHZpc2libGVFeHRlbnNpb25zOiBzdHJpbmc7XHJcbiAgbWF4U2l6ZU1COiBudW1iZXI7XHJcblxyXG4gIGlzUmVwaHJhc2VBY3RpdmUhOiBib29sZWFuO1xyXG4gIGlzU3VtbWFyYXppbmchOiBib29sZWFuO1xyXG4gIHN1bW1hcml6ZWRUZXh0ITogc3RyaW5nO1xyXG4gIG1hcmtlZFN1bW1hcml6ZWRUZXh0ITogc3RyaW5nO1xyXG4gIHN1bW1hcml6ZUZlYXR1cmVMb2NhbFN0b3JhZ2VLZXkhOiBzdHJpbmc7XHJcbiAgcmVwaHJhc2VGZWF0dXJlTG9jYWxTdG9yYWdlS2V5ITogc3RyaW5nO1xyXG4gIGlzTW9iaWxlITogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVUZXh0U2VydmljZTogVGxkVHJhbnNsYXRlVGV4dFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaXBib2FyZDogQ2xpcGJvYXJkLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbGVydHM6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBUbGRUcmFuc2xhdGVDb25maWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0bGRTY3JvbGxTZXJ2aWNlOiBUbGRTY3JvbGxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0bGRTeXN0ZW06IFRsZFRyYW5zbGF0ZVN5c3RlbU1hbmFnZW1lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdWRpb1NlcnZpY2U6IEF1ZGlvUmVjb3JkU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdm9pY2VJbnB1dFNlcnZpY2U6IFRsZFZvaWNlSW5wdXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWxlU2VydmljZTogVGxkVHJhbnNsYXRlRmlsZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxsbVNlcnZpY2U6IExMTVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGtleWNsb2FrOiBLZXljbG9ha1NlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNNb2JpbGUgPSBSZXNvbHV0aW9uSGVscGVyLmlzTW9iaWxlUmVzKCk7XHJcbiAgICBcclxuICAgIHRoaXMuc3VtbWFyaXplRmVhdHVyZUxvY2FsU3RvcmFnZUtleSA9IHRoaXMua2V5Y2xvYWsuZ2V0S2V5Y2xvYWtJbnN0YW5jZSgpPy50b2tlblBhcnNlZCA/IGBzdW1tYXJpemVGZWF0dXJlRGlhbG9nU2hvd25fJHtIYXNoSGVscGVyLmhhc2hTdHJpbmcodGhpcy5rZXljbG9hay5nZXRLZXljbG9ha0luc3RhbmNlKCkudG9rZW5QYXJzZWQuZW1haWwpfWAgOiAnc3VtbWFyaXplRmVhdHVyZURpYWxvZ1Nob3duJztcclxuICAgIHRoaXMucmVwaHJhc2VGZWF0dXJlTG9jYWxTdG9yYWdlS2V5ID0gdGhpcy5rZXljbG9hay5nZXRLZXljbG9ha0luc3RhbmNlKCk/LnRva2VuUGFyc2VkID8gYHJlcGhyYXNlRmVhdHVyZURpYWxvZ1Nob3duXyR7SGFzaEhlbHBlci5oYXNoU3RyaW5nKHRoaXMua2V5Y2xvYWsuZ2V0S2V5Y2xvYWtJbnN0YW5jZSgpLnRva2VuUGFyc2VkLmVtYWlsKX1gIDogJ3JlcGhyYXNlRmVhdHVyZURpYWxvZ1Nob3duJztcclxuXHJcbiAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmxpc3Rlbk9uQ2hhbmdlcygpO1xyXG4gICAgdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5zb3VyY2VDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5jbGVhclN1bW1hcml6ZSgpO1xyXG4gICAgICB0aGlzLmlzUmVwaHJhc2VBY3RpdmUgPSBmYWxzZTtcclxuICAgIH0pXHJcbiAgICB0aGlzLmRpY3RhdGVDb25maWcgPSB7XHJcbiAgICAgIG1heExlbmd0aDogdGhpcy5jb25maWcuc3BlZWNoQ29uZmlnPy5vbmxpbmVBc3I/Lm1heGltdW1SZWNvcmRUaW1lLFxyXG4gICAgICBhcGlVcmw6IHRoaXMuY29uZmlnLnNwZWVjaENvbmZpZy5vbmxpbmVBc3I/LnVybCxcclxuICAgICAgYXBpS2V5OiB0aGlzLmNvbmZpZy5zcGVlY2hDb25maWcuYXBpS2V5XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52aXNpYmxlRXh0ZW5zaW9ucyA9IHRoaXMuYWxsb3dlZEZpbGVUeXBlcy5zbGljZSgwLCB0aGlzLnZpc2libGVFeHRlbnNpb25Db3VudCkuam9pbihcIiwgXCIpO1xyXG4gICAgdGhpcy5hbGxvd2VkRmlsZVR5cGVzLmZvckVhY2goKGVsKSA9PiB0aGlzLmFsbG93ZWRUeXBlc1dpdGhvdXREb3RzLnB1c2goZWwucmVwbGFjZSgnLicsICcnKSkpO1xyXG5cclxuICAgIHRoaXMubWF4U2l6ZU1CID0gQ29udmVyc2lvbkhlbHBlci5ieXRlc1RvTWIodGhpcy5jb25maWcuZmlsZUNvbmZpZy5tYXhTaXplKTtcclxuXHJcbiAgICB0aGlzLnRsZFN5c3RlbS5nZXRBY3RpdmVEYXRhKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoeCwgeSkgPT4geCAmJiB5ICYmIHgubGFuZ3VhZ2VJZCA9PSB5Lmxhbmd1YWdlSWQpKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHN5c3QpID0+IHtcclxuICAgICAgICBpZiAoIXN5c3QpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRhLnNldChzeXN0KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRGF0YSgpLnJldHJhbnNsYXRlKSB7XHJcbiAgICAgICAgICB0aGlzLmNsZWFyU3VtbWFyaXplKCk7XHJcbiAgICAgICAgICB0aGlzLmlzUmVwaHJhc2VBY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UucmV0cmFuc2xhdGUoeyBzeXN0ZW1DaGFuZ2VkOiB0cnVlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG5cclxuICAgIHRoaXMudGxkU2Nyb2xsU2VydmljZS5zdWJzY3JpYmVUb1Njcm9sbCgpO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5zcGVlY2hDb25maWcub25saW5lQXNyPy5lbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuYXVkaW9TZXJ2aWNlLm9uUmVjb3JkU3RhcnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5jaGFuZ2VTb3VyY2UoeyBwaHJhc2U6IFwiXCIgfSk7XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLnZvaWNlSW5wdXRTZXJ2aWNlLm9uVHJhbnNjcmlidGlvblRleHRVcGRhdGVkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBJVHJhbnNjcmlwdGlvblVwZGF0ZU1vZGVsKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmNoYW5nZVNvdXJjZSh7IHBocmFzZTogZXZlbnQudGV4dCwgc3dhcFN5c3RlbXM6IGZhbHNlLCBkaXNhYmxlQXV0b21hdGljVHJhbnNsYXRpb246ICFldmVudC5jb21wbGV0ZWQgfSk7XHJcbiAgICAgICAgICBpZiAoZXZlbnQuY29tcGxldGVkICYmICghZXZlbnQudGV4dCB8fCBldmVudC50ZXh0ID09PSBcIlwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFsZXJ0cy53YXJuaW5nKGBFUlJPUlMuQVVESU8uJHtBdWRpb0Vycm9yQ2FzZS5OT19URVhUX1JFQ09HTklaRUR9YClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29weSgpIHtcclxuICAgIHRoaXMuY2xpcGJvYXJkLmNvcHkodGhpcy50cmFuc2xhdGVkVGV4dCk7XHJcbiAgICB0aGlzLmFsZXJ0cy5zdWNjZXNzKFwiVExEX1RSQU5TTEFURS5URVhUX0NPUElFRFwiLCB7IGlkOiB0aGlzLmNvcHlNZXNzYWdlSWQsIGNsb3NlQnV0dG9uSWQ6IHRoaXMuY29weU1lc3NhZ2VDbG9zZUJ1dHRvbklkLCBwYXJlbnRJZDogdGhpcy5jb3B5QnV0dG9uSWQgfSk7XHJcbiAgfVxyXG5cclxuICBjb3B5U3VtbWFyaXplZFRleHQoKSB7XHJcbiAgICB0aGlzLmNsaXBib2FyZC5jb3B5KHRoaXMuc3VtbWFyaXplZFRleHQpO1xyXG4gICAgdGhpcy5hbGVydHMuc3VjY2VzcyhcIlRMRF9UUkFOU0xBVEUuU1VNTUFSWS5DT1BJRURcIik7XHJcbiAgICB0aGlzLnN1bW1hcnlDb3B5UGxhdXNpYmxlKCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCkge1xyXG4gICAgdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5vblRyYW5zbGF0ZUJ1dHRvbkNsaWNrKCk7XHJcbiAgICB0aGlzLmNsZWFyU3VtbWFyaXplKCk7XHJcbiAgICB0aGlzLmlzUmVwaHJhc2VBY3RpdmUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNob3dSZXBocmFzZU9wdGlvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzUmVwaHJhc2VBY3RpdmUgPSB0cnVlO1xyXG4gICAgdGhpcy5zY3JvbGwoJy5yZXBocmFzZS13cmFwcGVyJyk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVTdW1tYXJ5KCkge1xyXG4gICAgdGhpcy5zdW1tYXJpemVkVGV4dCA9ICcnO1xyXG4gICAgdGhpcy5tYXJrZWRTdW1tYXJpemVkVGV4dCA9ICcnO1xyXG4gICAgdGhpcy5pc1N1bW1hcmF6aW5nID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLnNjcm9sbCgnLnN1bW1hcnktd3JhcHBlcicpO1xyXG5cclxuICAgIHRoaXMubGxtU2VydmljZVxyXG4gICAgICAuc3VtbWFyaXplKHsgbGFuZ3VhZ2U6IHRoaXMudGFyZ2V0TGFuZ3VhZ2UsIHRleHQ6IHRoaXMudHJhbnNsYXRlZFRleHQsIHVzZUNhc2U6IExMTVN1bW1hcnlVc2VDYXNlLkJyaWVmIH0pXHJcbiAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+ICh0aGlzLmlzU3VtbWFyYXppbmcgPSBmYWxzZSkpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3VtbWFyaXplZFRleHQgPSByZXNwb25zZTtcclxuICAgICAgICAgIHRoaXMubWFya2VkU3VtbWFyaXplZFRleHQgPSBtYXJrZWQucGFyc2UocmVzcG9uc2UpIGFzIHN0cmluZztcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN1bW1hcnlQbGF1c2libGUoKTtcclxuICB9XHJcblxyXG4gIHN3aXRjaEZvY3VzRnJvbUNvcHkoZXZlbnQpIHtcclxuICAgIGNvbnN0IGNvcHlNZXNzYWdlQ2xvc2VCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNvcHlNZXNzYWdlQ2xvc2VCdXR0b25JZCk/LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYnV0dG9uXCIpPy5pdGVtKDApO1xyXG4gICAgaWYgKGNvcHlNZXNzYWdlQ2xvc2VCdXR0b24pIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgY29weU1lc3NhZ2VDbG9zZUJ1dHRvbi5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsZUNoYW5nZShmaWxlczogRmlsZVtdKSB7XHJcbiAgICB0aGlzLm9uRmlsZUNoYW5nZS5lbWl0KGZpbGVzKTtcclxuICB9XHJcblxyXG4gIGZpbGVVcGxvYWRFcnJvcihlcnJvcjogYW55KSB7XHJcbiAgICB0aGlzLmZpbGVTZXJ2aWNlLmZpbGVVcGxvYWRFcnJvcihlcnJvciBhcyBGaWxlVXBsb2FkRXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVUb1RyYW5zbGF0ZWRVcmwoKSB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh0aGlzLnRyYW5zbGF0ZVVybFJlZGlyZWN0KTtcclxuICB9XHJcblxyXG4gIGRpY3RhdGVTdGFydFN0b3AoaXNEaWN0YXRpbmc6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHBocmFzZSA9IGAke3RoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2Uuc291cmNlVGV4dH0ke3RoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2Uuc291cmNlVGV4dD8ubGVuZ3RoID4gMCA/IFwiIFwiIDogXCJcIn0ke3RoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2Uuc291cmNlVGV4dEh5cG90aGVzaXN9YDtcclxuICAgIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UuaXNEaWN0YXRpbmcgPSBpc0RpY3RhdGluZztcclxuICAgIC8vIFRyYW5zbGF0aW9uIGhhcyBlbmRlZC5cclxuICAgIGlmICghaXNEaWN0YXRpbmcpIHtcclxuICAgICAgaWYgKHRoaXMuY29uZmlnLnNwZWVjaENvbmZpZy5vbmxpbmVBc3IucHVuY3R1YXRpb25NZXNzYWdlICYmIHBocmFzZT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuYWxlcnRzLndhcm5pbmcoXCJBVURJTy5QVU5DVFVBVElPTl9NRVNTQUdFXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmNoYW5nZVNvdXJjZShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwaHJhc2UsXHJcbiAgICAgICAgICBkaXNhYmxlQXV0b21hdGljVHJhbnNsYXRpb246IHRoaXMuaXNEaWN0YXRpbmcgfHwgdGhpcy5jb25maWcuYXVkaW9Db25maWcuZGlzYWJsZUF1dG9tYXRpY1RyYW5zbGF0aW9uXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UuY2hhbmdlU291cmNlSHlwb3RoZXNpcyhcIlwiKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmNsZWFyU291cmNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaWN0YXRlUmVzdWx0KHJlc3VsdDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmNoYW5nZVNvdXJjZUh5cG90aGVzaXMoXCJcIik7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLmNoYW5nZVNvdXJjZSh7IHBocmFzZTogcmVzdWx0LCBkaXNhYmxlQXV0b21hdGljVHJhbnNsYXRpb246IHRoaXMuaXNEaWN0YXRpbmcgfSlcclxuICB9XHJcblxyXG4gIGRpY3RhdGVQYXJ0aWFsUmVzdWx0KHBhcnRpYWxSZXN1bHQ6IHN0cmluZykge1xyXG4gICAgdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5jaGFuZ2VTb3VyY2VIeXBvdGhlc2lzKHBhcnRpYWxSZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgZGljdGF0ZUVycm9yKGVycm9yOiBBdWRpb0Vycm9yQ2FzZSkge1xyXG4gICAgaWYgKGVycm9yID09PSBBdWRpb0Vycm9yQ2FzZS5NQVhfVElNRV9FWENFRURFRCkge1xyXG4gICAgICBsZXQgdGltZVN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGNvbnN0IG1heExlbmd0aFRpbWUgPSBuZXcgRGF0ZSgwLCAwLCAwLCAwLCAwLCB0aGlzLmNvbmZpZy5zcGVlY2hDb25maWcub25saW5lQXNyLm1heGltdW1SZWNvcmRUaW1lKTtcclxuXHJcbiAgICAgIGNvbnN0IG1pbnV0ZXMgPSBtYXhMZW5ndGhUaW1lLmdldE1pbnV0ZXMoKTtcclxuICAgICAgaWYgKG1pbnV0ZXMgPiAwKSB7XHJcbiAgICAgICAgdGltZVN0cmluZyArPSBgJHttaW51dGVzfSBtaW51dGVzYDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc2Vjb25kcyA9IG1heExlbmd0aFRpbWUuZ2V0U2Vjb25kcygpO1xyXG4gICAgICBpZiAoc2Vjb25kcyA+IDApIHtcclxuICAgICAgICB0aW1lU3RyaW5nICs9IGAke3NlY29uZHN9IHNlY29uZHNgXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hbGVydHMud2FybmluZyhgRVJST1JTLkFVRElPLiR7ZXJyb3J9YCwgeyB0aW1lU3RyaW5nIH0pO1xyXG4gICAgfSBlbHNlIGlmIChlcnJvciA9PT0gQXVkaW9FcnJvckNhc2UuTk9fU1BFRUNIKSB7XHJcbiAgICAgIHRoaXMuYWxlcnRzLndhcm5pbmcoYEVSUk9SUy5BVURJTy4ke2Vycm9yfWApO1xyXG4gICAgfSBlbHNlIGlmIChlcnJvciA9PT0gQXVkaW9FcnJvckNhc2UuTUlDX05PVF9BTExPV0VEKSB7XHJcbiAgICAgIHRoaXMuYWxlcnRzLndhcm5pbmcoYEVSUk9SUy5BVURJTy4ke2Vycm9yfWApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hbGVydHMudW5oYW5kZWxlZEVycm9yKHsgRXJyb3JDb2RlOiBlcnJvciB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyU291cmNlKCkge1xyXG4gICAgdGhpcy50cmFuc2xhdGVUZXh0U2VydmljZS5jbGVhclNvdXJjZSgpO1xyXG4gICAgdGhpcy5jbGVhclN1bW1hcml6ZSgpO1xyXG4gICAgdGhpcy5pc1JlcGhyYXNlQWN0aXZlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2Uuc3RvcExpc3RlbmluZ1RvQ2hhbmdlcygpO1xyXG4gICAgdGhpcy50bGRTY3JvbGxTZXJ2aWNlLnVuc3Vic2NyaWJlVG9TY3JvbGwoKTtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dChudWxsKVxyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VQcm9ncmVzc0luZGljYXRvcigpIHtcclxuICAgIHRoaXMudHJhbnNsYXRlVGV4dFNlcnZpY2UuaGlkZVByb2dyZXNzSW5kaWNhdG9yKCk7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVRleHRTZXJ2aWNlLnN0b3BUcmFuc2xhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgb3BlbkZpbGVVcGxvYWQoKTogdm9pZCB7XHJcbiAgICBjb25zdCB1cGxvYWRCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudXBsb2FkLWJ1dHRvbicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgdXBsb2FkQnV0dG9uLmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1bW1hcnlQbGF1c2libGUoKTogdm9pZCB7XHJcbiAgICBQbGF1c2libGVIZWxwZXIuY3VzdG9tRXZlbnQoTExNQWN0aW9ucy5TVU1NQVJZLnRvTG93ZXJDYXNlKCksIHsgYWN0aW9uOiAnc3VtbWFyeScgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1bW1hcnlDb3B5UGxhdXNpYmxlKCk6IHZvaWQge1xyXG4gICAgUGxhdXNpYmxlSGVscGVyLmN1c3RvbUV2ZW50KExMTUFjdGlvbnMuU1VNTUFSWS50b0xvd2VyQ2FzZSgpLCB7IGFjdGlvbjogJ2NvcHknIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY3JvbGwoZWxlbWVudENsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRyYW5zbGF0ZWQtc291cmNlJyk7XHJcbiAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGVsZW1lbnRDbGFzc05hbWUpLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhclN1bW1hcml6ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3VtbWFyaXplZFRleHQgPSBudWxsO1xyXG4gICAgdGhpcy5tYXJrZWRTdW1tYXJpemVkVGV4dCA9IG51bGw7XHJcbiAgfVxyXG59XHJcbiIsIjwhLS0gTk9URS4gdGxkLXNvdXJjZS1hbmQtdGFyZ2V0LXdyYXBwZXIgdXNlcyBtdWx0aXBsZSBjb250ZW50IHByb2plY3Rpb25zLCBzbyBtaWdodCBzZWVtIGNvbmZ1c2luZyBmaXJzdCwgYnV0IGVsZW1lbnRzIGFyZSBkaXNwbGF5ZWQgYXQgdGhlaXIgcGxhY2VzIGJhc2VkIG9uIHRsZC1zb3VyY2UtYW5kLXRhcmdldC13cmFwcGVyIGNvbXBvbmVudFxyXG5odHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvY29udGVudC1wcm9qZWN0aW9uI211bHRpLXNsb3QtY29udGVudC1wcm9qZWN0aW9uXHJcbi0tPlxyXG48dGxkLXNvdXJjZS1hbmQtdGFyZ2V0LXdyYXBwZXJcclxuXHRbdGV4dFRvU3BlZWNoU291cmNlU2V0dGluZ3NdPVwidGV4dFRvU3BlZWNoU291cmNlU2V0dGluZ3NcIlxyXG5cdFtjbGVhclNvdXJjZVZpc2libGVdPVwic291cmNlPy5sZW5ndGggPiAwXCJcclxuXHQob25Tb3VyY2VDbGVhcik9XCJjbGVhclNvdXJjZSgpXCJcclxuXHRbY2xlYXJEaXNhYmxlZF09XCJ0ZXh0YXJlYURpc2FibGVkXCJcclxuXHRbY2xlYXJTb3VyY2VUb29sdGlwXT1cIidUTERfVFJBTlNMQVRFLkNMRUFSX1NPVVJDRV9UT09MVElQJ1wiXHJcblx0W25nQ2xhc3NdPVwieyAnaGlnaGxpZ2h0LWFjdGl2ZSc6IGhpZ2hsaWdodCwgJ2VtcHR5LXRhcmdldCc6IGlzRW1wdHlUYXJnZXQgfVwiXHJcbj5cclxuXHQ8ZGl2IHNvdXJjZU1haW4gY2xhc3M9XCJzb3VyY2UtbWFpblwiIGZ4TGF5b3V0PVwiY29sdW1uXCI+XHJcblx0XHQ8dGxkLXRyYW5zbGF0ZS1zb3VyY2UgW3RleHRhcmVhRGlzYWJsZWRdPVwidGV4dGFyZWFEaXNhYmxlZFwiICNzb3VyY2VDb21wb25lbnQgZnhGbGV4IFtzb3VyY2VQYXJhZ3JhcGhzXT1cInNvdXJjZVBhcmFncmFwaHNcIj48L3RsZC10cmFuc2xhdGUtc291cmNlPlxyXG5cdDwvZGl2PlxyXG5cdDxuZy1jb250YWluZXIgZGljdGF0aW9uICpuZ0lmPVwiYXVkaW9JbnB1dFZpc2libGUoKVwiPlxyXG5cdFx0PHRsZC1kaWN0YXRlXHJcblx0XHRcdCNkaWN0YXRlXHJcblx0XHRcdFtjb25maWd1cmF0aW9uXT1cImRpY3RhdGVDb25maWdcIlxyXG5cdFx0XHRbbmdDbGFzc109XCJ7ICdmdWxsLXdpZHRoJzogIWZpbGVVcGxvYWQgfVwiXHJcblx0XHRcdChpc0RpY3RhdGluZyk9XCJkaWN0YXRlU3RhcnRTdG9wKCRldmVudClcIlxyXG5cdFx0XHQocmVzdWx0KT1cImRpY3RhdGVSZXN1bHQoJGV2ZW50KVwiXHJcblx0XHRcdChwYXJ0aWFsUmVzdWx0KT1cImRpY3RhdGVQYXJ0aWFsUmVzdWx0KCRldmVudClcIlxyXG5cdFx0XHQob25FcnJvcik9XCJkaWN0YXRlRXJyb3IoJGV2ZW50KVwiXHJcblx0XHRcdFtzeXN0ZW1JZF09XCJvbmxpbmVBc3JTeXN0ZW1JZCgpXCJcclxuXHRcdD5cclxuXHRcdDwvdGxkLWRpY3RhdGU+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblxyXG5cdDxidXR0b24gY29tcGFjdFVwbG9hZCBtYXQtaWNvbi1idXR0b24gW21hdFRvb2x0aXBdPVwiJ1RPT0xUSVBTLlVQTE9BRCcgfCB0cmFuc2xhdGVcIiBbZGlzYWJsZWRdPVwiZmlsZVVwbG9hZERpc2FibGVkXCIgKGNsaWNrKT1cIm9wZW5GaWxlVXBsb2FkKClcIj5cclxuXHRcdDxtYXQtaWNvbiBbc3ZnSWNvbl09XCIndXBsb2FkJ1wiPjwvbWF0LWljb24+XHJcblx0PC9idXR0b24+XHJcblxyXG5cdDxuZy1jb250YWluZXIgc291cmNlQWN0aW9ucz5cclxuXHRcdDxkaXYgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiIFtjbGFzcy5iYXNpYy1wYWRkaW5nXT1cImZpbGVVcGxvYWRcIiBmeExheW91dEdhcD1cIjFlbVwiPlxyXG5cdFx0XHQ8ZGl2IFtjbGFzcy5oaWRkZW5dPVwiIWZpbGVVcGxvYWRcIiBjbGFzcz1cImZpbGUtdXBsb2FkLXdyYXBwZXJcIj5cclxuXHRcdFx0XHQ8bGliLWZpbGUtdXBsb2FkXHJcblx0XHRcdFx0XHQoZmlsZUNoYW5nZSk9XCJmaWxlQ2hhbmdlKCRldmVudClcIlxyXG5cdFx0XHRcdFx0W2FjY2VwdF09XCJhbGxvd2VkRmlsZVR5cGVzXCJcclxuXHRcdFx0XHRcdFttYXhTaXplXT1cIm1heEZpbGVVcGxvYWRTaXplXCJcclxuXHRcdFx0XHRcdFt1cGxvYWRJY29uTmFtZV09XCJ1cGxvYWRJY29uTmFtZVwiXHJcblx0XHRcdFx0XHRbZXh0ZW5kZWRBY2NlcHRMaXN0XT1cImV4dGVuZGVkRmlsZVR5cGVzXCJcclxuXHRcdFx0XHRcdFttdWx0aXBsZV09XCJtdWx0aXBsZUZpbGVzXCJcclxuXHRcdFx0XHRcdChlcnJvckV2ZW50KT1cImZpbGVVcGxvYWRFcnJvcigkZXZlbnQpXCJcclxuXHRcdFx0XHRcdFtmaWxlUHJldmlld1Byb2dyZXNzXT1cImZpbGVQcmV2aWV3UHJvZ3Jlc3NcIlxyXG5cdFx0XHRcdFx0W2Rpc2FibGVkXT1cImZpbGVVcGxvYWREaXNhYmxlZFwiXHJcblx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ1cGxvYWQtZmlsZS10ZXh0XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaW5mb1wiPlxyXG5cdFx0XHRcdFx0XHRcdDxzcGFuIFtpbm5lckhUTUxdPVwiJ0ZJTEVfVVBMT0FELlVQTE9BRCcgfCB0cmFuc2xhdGVcIiBjbGFzcz1cImFjY2VudC1jb2xvclwiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8c3Bhbj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gW2lubmVySFRNTF09XCInRklMRV9VUExPQUQuRFJBR19BTkRfRFJPUCcgfCB0cmFuc2xhdGVcIiBmeEhpZGUubHQtc20+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdDxzcGFuIFtpbm5lckhUTUxdPVwiJ0ZJTEVfVVBMT0FELicgKyAobXVsdGlwbGVGaWxlcyA/ICdGSUxFUycgOiAnRklMRScpIHwgdHJhbnNsYXRlXCIgW25nQ2xhc3MubHQtc21dPVwiJ2FjY2VudC1jb2xvcidcIj48L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZmlsZS11cGxvYWQtZXh0ZW5zaW9ucyB0ZXh0LW1cIj5cclxuXHRcdFx0XHRcdFx0XHQoJm5ic3A7PHNwYW4+e3sgdmlzaWJsZUV4dGVuc2lvbnMgfX0uPC9zcGFuPiZuYnNwO1xyXG5cdFx0XHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwibWF4U2l6ZU1CXCIgY2xhc3M9XCJmaWxlLXVwbG9hZC1tYXgtc2l6ZVwiIFtpbm5lckhUTUxdPVwiJ0ZJTEVfVVBMT0FELkxJTUlUU19NQicgfCB0cmFuc2xhdGUgOiB7IG1heFNpemVNQjogbWF4U2l6ZU1CIH1cIj48L3NwYW4+Jm5ic3A7KVxyXG5cdFx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC9saWItZmlsZS11cGxvYWQ+XHJcblx0XHRcdFx0PGxpYi1vcGVuLWV4dGVuc2lvbi1kaWFsb2cgKm5nSWY9XCJzaG93RXh0ZW5zaW9uUG9wdXBcIiBbZXh0ZW5zaW9uc109XCJhbGxvd2VkVHlwZXNXaXRob3V0RG90c1wiPiA8L2xpYi1vcGVuLWV4dGVuc2lvbi1kaWFsb2c+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC9kaXY+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblxyXG5cdDxkaXYgdGFyZ2V0TWFpbiBjbGFzcz1cInRhcmdldC1tYWluXCI+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFbXB0eVRhcmdldDsgZWxzZSB0cmFuc2xhdGVkVGV4dEJsb2NrXCI+XHJcblx0XHRcdDxwICpuZ0lmPVwic2hvd1RhcmdldFBsYWNlaG9sZGVyXCIgY2xhc3M9XCJkZXNjcmlwdGlvbi10ZXh0IHRhcmdldC1lbXB0eVwiIFtpbm5lckh0bWxdPVwiJ1RMRF9UUkFOU0xBVEUuVEFSR0VUX0RFU0NSSVBUSU9OJyB8IHRyYW5zbGF0ZVwiPjwvcD5cclxuXHRcdDwvbmctY29udGFpbmVyPlxyXG5cdDwvZGl2PlxyXG5cclxuXHQ8bmctY29udGFpbmVyIHRhcmdldEFjdGlvbnM+XHJcblx0XHQ8ZGl2IGNsYXNzPVwidGxkLXRyYW5zbGF0ZS10YXJnZXQtZm9vdGVyIGJhc2ljLXBhZGRpbmdcIiAqbmdJZj1cInNob3dQcm9ncmVzc0luZGljYXRvclwiPlxyXG5cdFx0XHQ8cHJvZ3Jlc3MtaW5kaWNhdG9yIChvbkNsb3NlKT1cImNsb3NlUHJvZ3Jlc3NJbmRpY2F0b3IoKVwiICpuZ0lmPVwic2hvd1Byb2dyZXNzSW5kaWNhdG9yXCI+PC9wcm9ncmVzcy1pbmRpY2F0b3I+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L25nLWNvbnRhaW5lcj5cclxuPC90bGQtc291cmNlLWFuZC10YXJnZXQtd3JhcHBlcj5cclxuXHJcbjwhLS0gdGVtcGxhdGVzIHVzZWQgZm9yIGVsc2UgYmxvY2tzIGluIHRhcmdldCBjb250YWluZXIgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjdHJhbnNsYXRlZFRleHRCbG9jaz5cclxuXHQ8ZGl2IFtjbGFzcy50cmFuc2xhdGVkLXNvdXJjZS1vdmVyZmxvd109XCJ0YXJnZXRXcmFwcGVyT3ZlcmZsb3dcIiBjbGFzcz1cInRyYW5zbGF0ZWQtc291cmNlXCI+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIXVybFRvVHJhbnNsYXRlXCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJ0YXJnZXQtd3JhcHBlci1hY3Rpb24tYnV0dG9uc1wiPlxyXG5cdFx0XHRcdDxidXR0b25cclxuXHRcdFx0XHRcdG1hdC1pY29uLWJ1dHRvblxyXG5cdFx0XHRcdFx0Km5nSWY9XCJmaXJzdFBhcmFncmFwaFRyYW5zbGF0ZWRcIlxyXG5cdFx0XHRcdFx0Y2xhc3M9XCJ0bGQtY29weS10cmFuc2xhdGlvblwiXHJcblx0XHRcdFx0XHQoY2xpY2spPVwiY29weSgpXCJcclxuXHRcdFx0XHRcdFttYXRUb29sdGlwXT1cIidUT09MVElQUy5DT1BZJyB8IHRyYW5zbGF0ZVwiXHJcblx0XHRcdFx0XHRbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImNvcHlNZXNzYWdlSWRcIlxyXG5cdFx0XHRcdFx0W2F0dHIuSWRdPVwiY29weUJ1dHRvbklkXCJcclxuXHRcdFx0XHRcdChrZXlkb3duLlRhYik9XCJzd2l0Y2hGb2N1c0Zyb21Db3B5KCRldmVudClcIlxyXG5cdFx0XHRcdD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInQVJJQV9MQUJFTFMuQ09QWScgfCB0cmFuc2xhdGVcIj4gY29udGVudF9jb3B5IDwvc3Bhbj5cclxuXHRcdFx0XHQ8L2J1dHRvbj5cclxuXHJcblx0XHRcdFx0PGJ1dHRvblxyXG5cdFx0XHRcdFx0bWF0LWljb24tYnV0dG9uXHJcblx0XHRcdFx0XHQqbmdJZj1cImZpcnN0UGFyYWdyYXBoVHJhbnNsYXRlZCB8fCB0cmFuc2xhdGlvbkVycm9yXCJcclxuXHRcdFx0XHRcdGNsYXNzPVwidGxkLXJlZnJlc2gtdHJhbnNsYXRpb25cIlxyXG5cdFx0XHRcdFx0W21hdFRvb2x0aXBdPVwiJ1RPT0xUSVBTLlJFRlJFU0gnIHwgdHJhbnNsYXRlXCJcclxuXHRcdFx0XHRcdChjbGljayk9XCJyZWZyZXNoKClcIlxyXG5cdFx0XHRcdD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInQVJJQV9MQUJFTFMuUkVGUkVTSCcgfCB0cmFuc2xhdGVcIj4gcmVmcmVzaCA8L3NwYW4+XHJcblx0XHRcdFx0PC9idXR0b24+XHJcblxyXG5cdFx0XHRcdDxkaXYgW21hdFRvb2x0aXBdPVwiJ1RMRF9UUkFOU0xBVEUuUkVQSFJBU0UuVE9PTFRJUCcgfCB0cmFuc2xhdGVcIj5cclxuXHRcdFx0XHRcdEBpZiAoaXNMbG1FbmFibGVkICYmIGZpcnN0UGFyYWdyYXBoVHJhbnNsYXRlZCkge1xyXG5cdFx0XHRcdFx0PGxpYi1uZXctZmVhdHVyZS1kaWFsb2ctd3JhcHBlclxyXG5cdFx0XHRcdFx0XHQjcmVwaHJhc2VGZWF0dXJlXHJcblx0XHRcdFx0XHRcdFt0aXRsZUxvY2FsaXphdGlvbktleV09XCInVExEX1RSQU5TTEFURS5SRVBIUkFTRS5ORVdfRkVBVFVSRS5USVRMRSdcIlxyXG5cdFx0XHRcdFx0XHRbZGVzY3JpcHRpb25Mb2NhbGl6YXRpb25LZXldPVwiJ1RMRF9UUkFOU0xBVEUuUkVQSFJBU0UuTkVXX0ZFQVRVUkUuREVTQ1JJUFRJT04nXCJcclxuXHRcdFx0XHRcdFx0W2Nsb3NlTG9jYWxpemF0aW9uS2V5XT1cIidUTERfVFJBTlNMQVRFLlJFUEhSQVNFLk5FV19GRUFUVVJFLkNMT1NFJ1wiXHJcblx0XHRcdFx0XHRcdFtmZWF0dXJlQ2xhc3NOYW1lXT1cIid0bGQtcmVwaHJhc2UnXCJcclxuXHRcdFx0XHRcdFx0W2ZlYXR1cmVDb250YWluZXJDbGFzc05hbWVdPVwiJ3RhcmdldC1tYWluJ1wiXHJcblx0XHRcdFx0XHRcdFtmZWF0dXJlTG9jYWxTdG9yYWdlS2V5XT1cInJlcGhyYXNlRmVhdHVyZUxvY2FsU3RvcmFnZUtleVwiXHJcblx0XHRcdFx0XHRcdFt0aW1lb3V0XT1cIjEwMDBcIlxyXG5cdFx0XHRcdFx0XHRbbWF4V2lkdGhdPVwiaXNNb2JpbGUgPyAzMjAgOiA0MDBcIlxyXG5cdFx0XHRcdFx0PjwvbGliLW5ldy1mZWF0dXJlLWRpYWxvZy13cmFwcGVyPlxyXG5cdFx0XHRcdFx0XHQ8YnV0dG9uXHJcblx0XHRcdFx0XHRcdFx0bWF0LWljb24tYnV0dG9uXHJcblx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJ0bGQtcmVwaHJhc2VcIlxyXG5cdFx0XHRcdFx0XHRcdFtjbGFzcy5yZXBocmFzZS1mZWF0dXJlLWFjdGl2ZV09XCJyZXBocmFzZUZlYXR1cmU/LmZlYXR1cmVBY3RpdmUoKVwiXHJcblx0XHRcdFx0XHRcdFx0W2Rpc2FibGVkXT1cImlzVHJhbnNsYXRpbmcgfHwgaXNTdW1tYXJhemluZ1wiXHJcblx0XHRcdFx0XHRcdFx0KGNsaWNrKT1cInNob3dSZXBocmFzZU9wdGlvbnMoKVwiXHJcblx0XHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0XHQ8bWF0LWljb24gW3N2Z0ljb25dPVwiJ3JlcGhyYXNlJ1wiIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidBUklBX0xBQkVMUy5SRVBIUkFTRScgfCB0cmFuc2xhdGVcIj48L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHJcblx0XHRcdFx0PGRpdiBbbWF0VG9vbHRpcF09XCIoaXNUZXh0U3VtbWFyaXphYmxlID8gJ1RPT0xUSVBTLkNSRUFURV9TVU1NQVJZJyA6ICdUTERfVFJBTlNMQVRFLlNVTU1BUlkuRElTQUJMRUQnKSB8IHRyYW5zbGF0ZVwiPlxyXG5cdFx0XHRcdFx0QGlmIChpc0xsbUVuYWJsZWQgJiYgZmlyc3RQYXJhZ3JhcGhUcmFuc2xhdGVkKSB7XHJcblx0XHRcdFx0XHQ8bGliLW5ldy1mZWF0dXJlLWRpYWxvZy13cmFwcGVyXHJcblx0XHRcdFx0XHRcdCNzdW1tYXJpemVGZWF0dXJlXHJcblx0XHRcdFx0XHRcdFt0aXRsZUxvY2FsaXphdGlvbktleV09XCInVExEX1RSQU5TTEFURS5TVU1NQVJZLk5FV19GRUFUVVJFLlRJVExFJ1wiXHJcblx0XHRcdFx0XHRcdFtkZXNjcmlwdGlvbkxvY2FsaXphdGlvbktleV09XCInVExEX1RSQU5TTEFURS5TVU1NQVJZLk5FV19GRUFUVVJFLkRFU0NSSVBUSU9OJ1wiXHJcblx0XHRcdFx0XHRcdFtjbG9zZUxvY2FsaXphdGlvbktleV09XCInVExEX1RSQU5TTEFURS5TVU1NQVJZLk5FV19GRUFUVVJFLkNMT1NFJ1wiXHJcblx0XHRcdFx0XHRcdFtmZWF0dXJlQ2xhc3NOYW1lXT1cIid0bGQtY3JlYXRlLXN1bW1hcnknXCJcclxuXHRcdFx0XHRcdFx0W2ZlYXR1cmVDb250YWluZXJDbGFzc05hbWVdPVwiJ3RhcmdldC1tYWluJ1wiXHJcblx0XHRcdFx0XHRcdFtmZWF0dXJlTG9jYWxTdG9yYWdlS2V5XT1cInN1bW1hcml6ZUZlYXR1cmVMb2NhbFN0b3JhZ2VLZXlcIlxyXG5cdFx0XHRcdFx0XHRbdGltZW91dF09XCIxMDAwXCJcclxuXHRcdFx0XHRcdD48L2xpYi1uZXctZmVhdHVyZS1kaWFsb2ctd3JhcHBlcj5cclxuXHJcblx0XHRcdFx0XHQ8YnV0dG9uXHJcblx0XHRcdFx0XHRcdG1hdC1pY29uLWJ1dHRvblxyXG5cdFx0XHRcdFx0XHRjbGFzcz1cInRsZC1jcmVhdGUtc3VtbWFyeVwiXHJcblx0XHRcdFx0XHRcdFtjbGFzcy5zdW1tYXJpemUtZmVhdHVyZS1hY3RpdmVdPVwic3VtbWFyaXplRmVhdHVyZT8uZmVhdHVyZUFjdGl2ZSgpXCJcclxuXHRcdFx0XHRcdFx0W2Rpc2FibGVkXT1cImlzVHJhbnNsYXRpbmcgfHwgaXNTdW1tYXJhemluZyB8fCAhaXNUZXh0U3VtbWFyaXphYmxlXCJcclxuXHRcdFx0XHRcdFx0KGNsaWNrKT1cImNyZWF0ZVN1bW1hcnkoKVwiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdDxtYXQtaWNvbiBbc3ZnSWNvbl09XCInc3VtbWFyaXplJ1wiIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidBUklBX0xBQkVMUy5DUkVBVEVfU1VNTUFSWScgfCB0cmFuc2xhdGVcIj48L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0PC9idXR0b24+XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PHRsZC10ZXh0LXRvLXNwZWVjaCAqbmdJZj1cInRleHRUb1NwZWVjaFRhcmdldFNldHRpbmdzICYmIGZpcnN0UGFyYWdyYXBoVHJhbnNsYXRlZFwiIFtzZXR0aW5nc109XCJ0ZXh0VG9TcGVlY2hUYXJnZXRTZXR0aW5nc1wiPiA8L3RsZC10ZXh0LXRvLXNwZWVjaD5cclxuXHRcdFx0PC9kaXY+XHJcblxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiaGlnaGxpZ2h0LXRyZWUtd3JhcHBlclwiPlxyXG5cdFx0XHRcdDx0bGQtaGlnaGxpZ2h0LXRyZWUgKm5nRm9yPVwibGV0IHBhcmFncmFwaCBvZiB0YXJnZXRQYXJhZ3JhcGhzXCIgW2hpZ2hsaWdodF09XCJoaWdobGlnaHRcIiBbdHJlZV09XCJwYXJhZ3JhcGhcIj4gPC90bGQtaGlnaGxpZ2h0LXRyZWU+XHJcblx0XHRcdDwvZGl2PlxyXG5cclxuXHRcdFx0PGRpdiAqbmdJZj1cImlzU3VtbWFyYXppbmcgfHwgc3VtbWFyaXplZFRleHRcIiBjbGFzcz1cInN1bW1hcnktd3JhcHBlclwiPlxyXG5cdFx0XHRcdDxwIGNsYXNzPVwic3VtbWFyeS10aXRsZVwiPnt7IFwiVExEX1RSQU5TTEFURS5TVU1NQVJZLlRJVExFXCIgfCB0cmFuc2xhdGUgfX08L3A+XHJcblxyXG5cdFx0XHRcdDxwICpuZ0lmPVwiaXNTdW1tYXJhemluZ1wiIGNsYXNzPVwiY3JlYXRpbmctcHJvZ3Jlc3NcIj57eyBcIlRMRF9UUkFOU0xBVEUuU1VNTUFSWS5DUkVBVElOR1wiIHwgdHJhbnNsYXRlIH19PHNwYW4gY2xhc3M9XCJkb3QtbG9hZGluZ1wiPi4uLjwvc3Bhbj48L3A+XHJcblxyXG5cdFx0XHRcdDxwIFtpbm5lckhUTUxdPVwibWFya2VkU3VtbWFyaXplZFRleHRcIj48L3A+XHJcblxyXG5cdFx0XHRcdDxidXR0b25cclxuXHRcdFx0XHRcdG1hdC1pY29uLWJ1dHRvblxyXG5cdFx0XHRcdFx0Km5nSWY9XCJzdW1tYXJpemVkVGV4dFwiXHJcblx0XHRcdFx0XHRbbmdDbGFzcy5sdC1zbV09XCInc3VtbWFyeS1tb2JpbGUnXCJcclxuXHRcdFx0XHRcdGNsYXNzPVwic3VtbWFyeS1jb3B5LWJ0blwiXHJcblx0XHRcdFx0XHQoY2xpY2spPVwiY29weVN1bW1hcml6ZWRUZXh0KClcIlxyXG5cdFx0XHRcdFx0W21hdFRvb2x0aXBdPVwiJ1RPT0xUSVBTLkNPUFknIHwgdHJhbnNsYXRlXCJcclxuXHRcdFx0XHQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCIgYXJpYS1oaWRkZW49XCJmYWxzZVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0FSSUFfTEFCRUxTLkNPUFknIHwgdHJhbnNsYXRlXCI+IGNvbnRlbnRfY29weSA8L3NwYW4+XHJcblx0XHRcdFx0PC9idXR0b24+XHJcblx0XHRcdDwvZGl2PlxyXG5cclxuXHRcdFx0PGRpdiAqbmdJZj1cImlzUmVwaHJhc2VBY3RpdmVcIiBjbGFzcz1cInJlcGhyYXNlLXdyYXBwZXJcIj5cclxuXHRcdFx0XHQ8dGxkLXJlcGhyYXNlIFt0ZXh0XT1cInRyYW5zbGF0ZWRUZXh0XCIgW2Rpc2FibGVkXT1cImlzVHJhbnNsYXRpbmdcIiBbbGFuZ3VhZ2VdPVwidGFyZ2V0TGFuZ3VhZ2VcIj48L3RsZC1yZXBocmFzZT5cclxuXHRcdFx0PC9kaXY+XHRcclxuXHJcblx0XHRcdDxkaXYgKm5nSWY9XCJmaXJzdFBhcmFncmFwaFRyYW5zbGF0ZWQgJiYgZGljdGlvbmFyeUVudHJ5XCIgY2xhc3M9XCJkaWN0aW9uYXJ5LXdyYXBwZXJcIj5cclxuXHRcdFx0XHQ8dGxkLWRpY3Rpb25hcnkgW2RpY3Rpb25hcnldPVwiZGljdGlvbmFyeUVudHJ5XCI+PC90bGQtZGljdGlvbmFyeT5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHJcblx0XHQ8ZGl2ICpuZ0lmPVwidXJsVG9UcmFuc2xhdGVcIiBjbGFzcz1cInRhcmdldC11cmwtY29udGFpbmVyXCI+XHJcblx0XHRcdDxhIFthdHRyLmhyZWZdPVwidHJhbnNsYXRlVXJsUmVkaXJlY3RcIiB0YXJnZXQ9XCJfYmxhbmtcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCIgY2xhc3M9XCJnby10by13ZWJ0cmFuc2xhdGVcIj5cclxuXHRcdFx0XHR7eyB1cmxUb1RyYW5zbGF0ZSB9fVxyXG5cdFx0XHRcdDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIiBjb2xvcj1cImFjY2VudFwiIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidBUklBX0xBQkVMUy5PUEVOX0lOX05FVydcIj4gb3Blbl9pbl9uZXcgPC9zcGFuPlxyXG5cdFx0XHQ8L2E+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19