@vgroup/dialbox 0.1.86 → 0.1.87

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.
@@ -297,10 +297,10 @@ export class IncomingCallComponent {
297
297
  }
298
298
  }
299
299
  IncomingCallComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: IncomingCallComponent, deps: [{ token: i1.ExtensionService }, { token: i2.TwilioService }, { token: i3.NotificationService }], target: i0.ɵɵFactoryTarget.Component });
300
- IncomingCallComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: IncomingCallComponent, selector: "lib-incoming-call", inputs: { incomingCallData: "incomingCallData", newIncomingCallsList: "newIncomingCallsList", deviceId: "deviceId", isConcurrentIncoming: "isConcurrentIncoming" }, outputs: { closeIncomingCallDiv: "closeIncomingCallDiv", incomingCallsNewList: "incomingCallsNewList", selectedIncomingCallInfo: "selectedIncomingCallInfo" }, ngImport: i0, template: "<div class=\"call-container\" *ngIf=\"newIncomingCallsList?.length === 1\">\n <div style=\"display: flex; flex-direction: column; padding-left: 14rem;\">\n <div class=\"callToNum\">Incoming call on <br/><span>{{dedicatedNum}}</span></div>\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"newIncomingCallsList[0]?.img || incomingCallData?.img\" alt=\"\" width=\"120\" />\n </div>\n <div class=\"callerDetails\">\n <h1>{{newIncomingCallsList[0]?.userInfo?.c2cInformation?.name || incomingCallData?.name || '-'}}</h1>\n <p>{{newIncomingCallsList[0]?.userInfo?.displayNum ? newIncomingCallsList[0]?.userInfo?.c2cInformation?.number : newIncomingCallsList[0]?.userInfo?.c2cInformation?.number || incomingCallData?.displayNum || incomingCallData?.phone}}</p>\n </div>\n \n <!-- <div class=\"callerDetails\">\n <h1 [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{callData.name}}</h1>\n <p>{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\n <h4 style=\"margin-top: 4px\">{{timer}}</h4>\n </div> -->\n <div class=\"call-action-btns\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(newIncomingCallsList[0])\"> call </span>\n </button>\n <button class=\"call-btn mute-btn\" *ngIf=\"newIncomingCallsList[0]?.isCallConnected\" (click)=\"toggleMute(newIncomingCallsList[0])\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic</span>\n </button>\n <div class=\"record-btn-container \">\n <button class=\"record-btn start-stop\" *ngIf=\"newIncomingCallsList[0]?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"\">\n <button class=\"record-btn pause-resume\" *ngIf=\"newIncomingCallsList[0]?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"newIncomingCallsList[0]?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(newIncomingCallsList[0])\"> call_end </span>\n </button>\n </div>\n </div>\n\n <div class=\"wave-container\">\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\n <defs>\n <path id=\"gentle-wave\" d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\n </defs>\n <g class=\"parallax\">\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\n </g>\n </svg>\n </div>\n</div>\n\n<div class=\"call-container\" style=\"width: 100%; left: 116px;\" *ngIf=\"isConcurrentIncoming || newIncomingCallsList?.length > 1\">\n <div class=\"collops\">\n <div class=\"d-flex w-100\">\n <div class=\"d-flex flex-column container-fluid\" >\n <div class=\"callToNum\">Incoming call <br/><span>{{dedicatedNum}}</span></div>\n <ng-container *ngFor=\"let data of newIncomingCallsList\"> \n <div class=\"p-2 \">\n <div class=\"call-info-wrapper w-100 d-flex align-items-center\">\n <div class=\"img\">\n <img class=\"avatar-img-wrapper\" [src]=\"data?.img\" alt=\"\" width=\"45\" />\n </div>\n <div class=\"d-flex justify-content-between w-100 align-items-center mr-2\">\n <div class=\"callerDetails-wrapper\">\n <h5 class=\"break-word\">{{data?.userInfo?.c2cInformation?.name || '-'}}</h5>\n <p class=\"break-word\">{{data?.userInfo?.displayNum ? data?.userInfo?.c2cInformation?.number : data?.userInfo?.c2cInformation?.number }}</p>\n </div> \n <div class=\"d-flex align-items-center\">\n <button class=\"call-btn-wrapper receive-btn\" *ngIf=\"!data?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(data)\"> call </span>\n </button>\n <button class=\"call-btn-wrapper mute-btn\" *ngIf=\"data?.isCallConnected\" (click)=\"toggleMute(data)\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic</span>\n </button>\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"data?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"\">\n <button class=\"record-btn pause-resume\" *ngIf=\"data?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"data?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn-wrapper reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(data)\"> call_end </span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" \n (click)=\"hasDetailedInfo(data) ? onClickExpand(data) : null\" \n [ngClass]=\"{'disabled': !hasDetailedInfo(data)}\"\n [title]=\"hasDetailedInfo(data) ? 'View details' : 'No details available'\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"call-container p-3 text-white model-content\" *ngIf=\"isClickExpand \"> \n <div class=\"mb-2\" style=\"width: 100%; height: 100%;\">\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"incomingCallData.img\" alt=\"\" width=\"100\" />\n </div>\n <div class=\"text-center\">\n <h3 class=\"text-white\">{{selectedIncomingCall?.userInfo?.c2cInformation?.name || '-'}}</h3>\n </div>\n <div class=\"f-13\">\n <div class=\"row mb-3\">\n <div class=\"col-12 d-flex align-items-center mb-2\">\n <div class=\"me-2\">Subject:</div>\n <div class=\"ml-2\">{{selectedIncomingCall?.userInfo?.c2cInformation?.subject || '-'}}</div>\n </div> \n </div>\n\n <div class=\"row mb-2\">\n <div class=\"col-12 d-flex align-items-center mb-2\">\n <div class=\"me-2\">Email:</div>\n <div>{{selectedIncomingCall?.userInfo?.c2cInformation?.email || '-'}}</div>\n </div> \n </div>\n\n <div class=\"row mb-2\">\n <div class=\"col-6 mb-2\">\n <div class=\"\">Number:</div>\n <div class=\"\">{{selectedIncomingCall?.userInfo?.c2cInformation?.number}}</div>\n </div>\n <div class=\"col-6\">\n <div class=\"\">Language:</div>\n <div class=\"ml-2\">{{selectedIncomingCall?.userInfo?.c2cInformation?.language || '-'}}</div>\n </div>\n </div>\n <div class=\"row mb-2\">\n <div class=\"col-6 mb-2\">\n <div class=\"\">Extension:</div>\n <div class=\"ml-2\">{{selectedIncomingCall?.userInfo?.c2cInformation?.extension || '-'}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 d-flex align-items-center mb-2\">\n <div class=\"me-2\">Image:</div>\n <div class=\"text-ellipsis\">\n <ng-container *ngIf=\"selectedIncomingCall?.userInfo?.c2cInformation?.image && selectedIncomingCall?.userInfo?.c2cInformation?.image !== '-'; else noImage\">\n <img src=\"{{selectedIncomingCall?.userInfo?.c2cInformation?.image}}\" alt=\"\" width=\"42\" height=\"42\" class=\"ml-2\"/>\n </ng-container>\n <ng-template #noImage>\n <span class=\"ml-2\">No Image Available</span>\n </ng-template>\n </div>\n </div> \n </div>\n\n <div class=\" mb-4\">\n <div class=\"\">\n <div class=\"\">Message:</div>\n <div class=\"text-ellipsis\">{{selectedIncomingCall?.userInfo?.c2cInformation?.message || '-'}}</div>\n </div>\n </div>\n\n <div class=\"row mb-2\">\n <div class=\"col-6 mb-2\">\n <div class=\"\">Point Name:</div>\n <div class=\"\">{{selectedIncomingCall?.userInfo?.c2cInformation?.pointName || '-'}}</div>\n </div>\n <div class=\"col-6 mb-2\">\n <div class=\"\">Source Name:</div>\n <div class=\"\">{{selectedIncomingCall?.userInfo?.c2cInformation?.sourceName || '-'}}</div>\n </div>\n </div>\n </div>\n <div class=\"call-action-btns mt-0\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!selectedIncomingCall?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(selectedIncomingCall)\"> call </span>\n </button>\n <button class=\"call-btn mute-btn\" *ngIf=\"selectedIncomingCall?.isCallConnected\" (click)=\"toggleMute(selectedIncomingCall)\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n </button>\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"selectedIncomingCall?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(selectedIncomingCall)\"> call_end </span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"wave-container\">\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\" [ngStyle]=\"{'width': '756px'}\">\n <defs>\n <path id=\"gentle-wave\" d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\n </defs>\n <g class=\"parallax\">\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" /> \n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\n </g>\n </svg>\n </div>\n</div>", styles: [".call-container{width:752px!important;height:646px!important;margin:auto;border-radius:30px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.collops{display:flex;flex-direction:column;width:100%;height:100%}.container-fluid{width:400px;height:100%;margin-top:10px}.model-content{background-color:#0d6efd;border-radius:20px;width:395px!important}.calls-side-by-side{position:fixed;top:0;width:30%;height:498px;z-index:1050;pointer-events:auto;display:flex;align-items:flex-start;left:-10rem;transform:translate(.2rem);transition:left 1s ease-in-out}.move{left:41vw!important}.f-13{font-size:13px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto;border-radius:100%;border:solid 4px #fff}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.avatar-img-wrapper{border-radius:100%;margin:0 5px}.call-btn-wrapper{height:38px;background-color:#fff;border-radius:30px;margin:0 4px;opacity:.9;width:40px;span {color: white; line-height: unset !important;}}.hold-btn{background-color:#bebebe26;border:none}.hold-btn span,.mute-btn span{color:#fff!important}.active-hold{background-color:#fff!important}.active-hold span{color:#000!important}.active-mute{background-color:transparent}.call-info-wrapper{border:1px solid white;border-radius:7px;padding:8px 1px!important;word-break:break-all}.call-animation-play{animation:play 3s linear infinite}.avatar-img{width:94px;height:94px;border-radius:100%;position:absolute;left:0;top:0}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.callerDetails h1{margin:12px 0 0;color:#fff}.callerDetails-wrapper{margin:0 5px;color:#fff;display:flex;flex-direction:column}.callerDetails-wrapper h3,.callerDetails-wrapper h5{margin:0;color:#fff}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.callerDetails h4{margin:0;color:#fff}.callerDetails p,.callerDetails-wrapper p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn{position:relative;width:50px;height:50px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.call-sec-btn span{color:#cccbcb}.call-btn{width:48px;height:45px;background-color:#fff;border-radius:30px;box-sizing:border-box;margin:0 8px;opacity:.9}.call-btn:hover{opacity:1}.call-btn span{color:#fff;line-height:unset!important}.receive-btn{background-color:#28a745;border:2px solid #28a745}.mute-btn{position:relative;border:none;background-color:#bebebe26}.reject-btn{background-color:#e03131;border:2px solid #e03131}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.call-action-btns{text-align:center;display:flex;justify-content:center;align-items:center;margin-top:240px}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.wave-container{position:absolute;bottom:0}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.text-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;display:block}.record-action-btns{display:flex;flex-direction:column;align-items:center}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:48px;height:48px!important;display:flex;align-items:center;justify-content:center;cursor:pointer;position:relative;overflow:hidden}.record-btn-side{border:none;border-radius:50%;width:44px;height:44px;display:flex;align-items:center;justify-content:center;cursor:pointer;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;justify-content:center;width:48px;height:48px;background-color:#fff;border-radius:30px}.record-btn.pause-resume{border:none;border-radius:50%;width:48px;height:48px;background:white;display:flex;align-items:center;justify-content:center}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
300
+ IncomingCallComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: IncomingCallComponent, selector: "lib-incoming-call", inputs: { incomingCallData: "incomingCallData", newIncomingCallsList: "newIncomingCallsList", deviceId: "deviceId", isConcurrentIncoming: "isConcurrentIncoming" }, outputs: { closeIncomingCallDiv: "closeIncomingCallDiv", incomingCallsNewList: "incomingCallsNewList", selectedIncomingCallInfo: "selectedIncomingCallInfo" }, ngImport: i0, template: "<!-- Compact incoming banner for single incoming call -->\n<div class=\"incoming-banner-wrapper\" *ngIf=\"newIncomingCallsList?.length === 1 && !isConcurrentIncoming\">\n <div class=\"incoming-banner\">\n <div class=\"incoming-banner-content\">\n <div class=\"incoming-info\">\n <span class=\"incoming-label\">Incoming call</span>\n <div class=\"incoming-caller\">\n <span class=\"caller-name\">{{newIncomingCallsList[0]?.userInfo?.c2cInformation?.name || incomingCallData?.name || '-'}}</span>\n <span class=\"caller-number\">{{newIncomingCallsList[0]?.userInfo?.c2cInformation?.number || newIncomingCallsList[0]?.parameters?.From || incomingCallData?.displayNum || incomingCallData?.phone || ''}}</span>\n </div>\n </div>\n <div class=\"incoming-actions\">\n <button class=\"banner-btn accept-btn\" (click)=\"acceptCallFromList(newIncomingCallsList[0])\">\n <span class=\"material-symbols-outlined\">call</span>\n </button>\n <button class=\"banner-btn reject-btn\" (click)=\"rejectCallFromList(newIncomingCallsList[0])\">\n <span class=\"material-symbols-outlined\">call_end</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<!-- List view for multiple incoming calls -->\n<div class=\"call-container\" style=\"width: 100%; left: 116px;\" *ngIf=\"newIncomingCallsList?.length > 1\">\n <div class=\"collops\">\n <div class=\"d-flex w-100\">\n <div class=\"d-flex flex-column container-fluid\" >\n <div class=\"callToNum\">Incoming call <br/><span>{{dedicatedNum}}</span></div>\n <ng-container *ngFor=\"let data of newIncomingCallsList\"> \n <div class=\"p-2 \">\n <div class=\"call-info-wrapper w-100 d-flex align-items-center\">\n <div class=\"img\">\n <img class=\"avatar-img-wrapper\" [src]=\"data?.img\" alt=\"\" width=\"45\" />\n </div>\n <div class=\"d-flex justify-content-between w-100 align-items-center mr-2\">\n <div class=\"callerDetails-wrapper\">\n <h5 class=\"break-word\">{{data?.userInfo?.c2cInformation?.name || '-'}}</h5>\n <p class=\"break-word\">{{data?.userInfo?.displayNum ? data?.userInfo?.c2cInformation?.number : data?.userInfo?.c2cInformation?.number }}</p>\n </div> \n <div class=\"d-flex align-items-center\">\n <button class=\"call-btn-wrapper receive-btn\" *ngIf=\"!data?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(data)\"> call </span>\n </button>\n <button class=\"call-btn-wrapper mute-btn\" *ngIf=\"data?.isCallConnected\" (click)=\"toggleMute(data)\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic</span>\n </button>\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"data?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"\">\n <button class=\"record-btn pause-resume\" *ngIf=\"data?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"data?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn-wrapper reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(data)\"> call_end </span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" \n (click)=\"hasDetailedInfo(data) ? onClickExpand(data) : null\" \n [ngClass]=\"{'disabled': !hasDetailedInfo(data)}\"\n [title]=\"hasDetailedInfo(data) ? 'View details' : 'No details available'\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"call-container p-3 text-white model-content\" *ngIf=\"isClickExpand \"> \n <div class=\"mb-2\" style=\"width: 100%; height: 100%;\">\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"incomingCallData.img\" alt=\"\" width=\"100\" />\n </div>\n <div class=\"text-center\">\n <h3 class=\"text-white\">{{selectedIncomingCall?.userInfo?.c2cInformation?.name || '-'}}</h3>\n </div>\n <div class=\"f-13\">\n <div class=\"row mb-3\">\n <div class=\"col-12 d-flex align-items-center mb-2\">\n <div class=\"me-2\">Subject:</div>\n <div class=\"ml-2\">{{selectedIncomingCall?.userInfo?.c2cInformation?.subject || '-'}}</div>\n </div> \n </div>\n\n <div class=\"row mb-2\">\n <div class=\"col-12 d-flex align-items-center mb-2\">\n <div class=\"me-2\">Email:</div>\n <div>{{selectedIncomingCall?.userInfo?.c2cInformation?.email || '-'}}</div>\n </div> \n </div>\n\n <div class=\"row mb-2\">\n <div class=\"col-6 mb-2\">\n <div class=\"\">Number:</div>\n <div class=\"\">{{selectedIncomingCall?.userInfo?.c2cInformation?.number}}</div>\n </div>\n <div class=\"col-6\">\n <div class=\"\">Language:</div>\n <div class=\"ml-2\">{{selectedIncomingCall?.userInfo?.c2cInformation?.language || '-'}}</div>\n </div>\n </div>\n <div class=\"row mb-2\">\n <div class=\"col-6 mb-2\">\n <div class=\"\">Extension:</div>\n <div class=\"ml-2\">{{selectedIncomingCall?.userInfo?.c2cInformation?.extension || '-'}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 d-flex align-items-center mb-2\">\n <div class=\"me-2\">Image:</div>\n <div class=\"text-ellipsis\">\n <ng-container *ngIf=\"selectedIncomingCall?.userInfo?.c2cInformation?.image && selectedIncomingCall?.userInfo?.c2cInformation?.image !== '-'; else noImage\">\n <img src=\"{{selectedIncomingCall?.userInfo?.c2cInformation?.image}}\" alt=\"\" width=\"42\" height=\"42\" class=\"ml-2\"/>\n </ng-container>\n <ng-template #noImage>\n <span class=\"ml-2\">No Image Available</span>\n </ng-template>\n </div>\n </div> \n </div>\n\n <div class=\" mb-4\">\n <div class=\"\">\n <div class=\"\">Message:</div>\n <div class=\"text-ellipsis\">{{selectedIncomingCall?.userInfo?.c2cInformation?.message || '-'}}</div>\n </div>\n </div>\n\n <div class=\"row mb-2\">\n <div class=\"col-6 mb-2\">\n <div class=\"\">Point Name:</div>\n <div class=\"\">{{selectedIncomingCall?.userInfo?.c2cInformation?.pointName || '-'}}</div>\n </div>\n <div class=\"col-6 mb-2\">\n <div class=\"\">Source Name:</div>\n <div class=\"\">{{selectedIncomingCall?.userInfo?.c2cInformation?.sourceName || '-'}}</div>\n </div>\n </div>\n </div>\n <div class=\"call-action-btns mt-0\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!selectedIncomingCall?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(selectedIncomingCall)\"> call </span>\n </button>\n <button class=\"call-btn mute-btn\" *ngIf=\"selectedIncomingCall?.isCallConnected\" (click)=\"toggleMute(selectedIncomingCall)\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n </button>\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"selectedIncomingCall?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(selectedIncomingCall)\"> call_end </span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"wave-container\">\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\" [ngStyle]=\"{'width': '756px'}\">\n <defs>\n <path id=\"gentle-wave\" d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\n </defs>\n <g class=\"parallax\">\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" /> \n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\n </g>\n </svg>\n </div>\n</div>", styles: [".incoming-banner-wrapper{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;align-items:flex-start;justify-content:center;padding-top:20px;z-index:3000}.incoming-banner{background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:16px 20px;border-radius:16px;box-shadow:0 8px 24px #0000004d;min-width:360px;max-width:500px;animation:slideDown .3s ease-out}@keyframes slideDown{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:16px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:6px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px;font-weight:500}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:16px;font-weight:600;color:#fff}.caller-number{font-size:14px;color:#ffffffe6}.incoming-actions{display:flex;gap:10px;align-items:center}.banner-btn{width:48px;height:48px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s,box-shadow .2s}.banner-btn:hover{transform:scale(1.1);box-shadow:0 4px 12px #0003}.banner-btn .material-symbols-outlined{font-size:22px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.call-container{width:752px!important;height:646px!important;margin:auto;border-radius:30px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.collops{display:flex;flex-direction:column;width:100%;height:100%}.container-fluid{width:400px;height:100%;margin-top:10px}.model-content{background-color:#0d6efd;border-radius:20px;width:395px!important}.calls-side-by-side{position:fixed;top:0;width:30%;height:498px;z-index:1050;pointer-events:auto;display:flex;align-items:flex-start;left:-10rem;transform:translate(.2rem);transition:left 1s ease-in-out}.move{left:41vw!important}.f-13{font-size:13px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto;border-radius:100%;border:solid 4px #fff}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.avatar-img-wrapper{border-radius:100%;margin:0 5px}.call-btn-wrapper{height:38px;background-color:#fff;border-radius:30px;margin:0 4px;opacity:.9;width:40px;span {color: white; line-height: unset !important;}}.hold-btn{background-color:#bebebe26;border:none}.hold-btn span,.mute-btn span{color:#fff!important}.active-hold{background-color:#fff!important}.active-hold span{color:#000!important}.active-mute{background-color:transparent}.call-info-wrapper{border:1px solid white;border-radius:7px;padding:8px 1px!important;word-break:break-all}.call-animation-play{animation:play 3s linear infinite}.avatar-img{width:94px;height:94px;border-radius:100%;position:absolute;left:0;top:0}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.callerDetails h1{margin:12px 0 0;color:#fff}.callerDetails-wrapper{margin:0 5px;color:#fff;display:flex;flex-direction:column}.callerDetails-wrapper h3,.callerDetails-wrapper h5{margin:0;color:#fff}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.callerDetails h4{margin:0;color:#fff}.callerDetails p,.callerDetails-wrapper p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn{position:relative;width:50px;height:50px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.call-sec-btn span{color:#cccbcb}.call-btn{width:48px;height:45px;background-color:#fff;border-radius:30px;box-sizing:border-box;margin:0 8px;opacity:.9}.call-btn:hover{opacity:1}.call-btn span{color:#fff;line-height:unset!important}.receive-btn{background-color:#28a745;border:2px solid #28a745}.mute-btn{position:relative;border:none;background-color:#bebebe26}.reject-btn{background-color:#e03131;border:2px solid #e03131}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.call-action-btns{text-align:center;display:flex;justify-content:center;align-items:center;margin-top:240px}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.wave-container{position:absolute;bottom:0}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.text-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;display:block}.record-action-btns{display:flex;flex-direction:column;align-items:center}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:48px;height:48px!important;display:flex;align-items:center;justify-content:center;cursor:pointer;position:relative;overflow:hidden}.record-btn-side{border:none;border-radius:50%;width:44px;height:44px;display:flex;align-items:center;justify-content:center;cursor:pointer;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;justify-content:center;width:48px;height:48px;background-color:#fff;border-radius:30px}.record-btn.pause-resume{border:none;border-radius:50%;width:48px;height:48px;background:white;display:flex;align-items:center;justify-content:center}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
301
301
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: IncomingCallComponent, decorators: [{
302
302
  type: Component,
303
- args: [{ selector: 'lib-incoming-call', template: "<div class=\"call-container\" *ngIf=\"newIncomingCallsList?.length === 1\">\n <div style=\"display: flex; flex-direction: column; padding-left: 14rem;\">\n <div class=\"callToNum\">Incoming call on <br/><span>{{dedicatedNum}}</span></div>\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"newIncomingCallsList[0]?.img || incomingCallData?.img\" alt=\"\" width=\"120\" />\n </div>\n <div class=\"callerDetails\">\n <h1>{{newIncomingCallsList[0]?.userInfo?.c2cInformation?.name || incomingCallData?.name || '-'}}</h1>\n <p>{{newIncomingCallsList[0]?.userInfo?.displayNum ? newIncomingCallsList[0]?.userInfo?.c2cInformation?.number : newIncomingCallsList[0]?.userInfo?.c2cInformation?.number || incomingCallData?.displayNum || incomingCallData?.phone}}</p>\n </div>\n \n <!-- <div class=\"callerDetails\">\n <h1 [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{callData.name}}</h1>\n <p>{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\n <h4 style=\"margin-top: 4px\">{{timer}}</h4>\n </div> -->\n <div class=\"call-action-btns\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(newIncomingCallsList[0])\"> call </span>\n </button>\n <button class=\"call-btn mute-btn\" *ngIf=\"newIncomingCallsList[0]?.isCallConnected\" (click)=\"toggleMute(newIncomingCallsList[0])\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic</span>\n </button>\n <div class=\"record-btn-container \">\n <button class=\"record-btn start-stop\" *ngIf=\"newIncomingCallsList[0]?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"\">\n <button class=\"record-btn pause-resume\" *ngIf=\"newIncomingCallsList[0]?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"newIncomingCallsList[0]?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(newIncomingCallsList[0])\"> call_end </span>\n </button>\n </div>\n </div>\n\n <div class=\"wave-container\">\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\n <defs>\n <path id=\"gentle-wave\" d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\n </defs>\n <g class=\"parallax\">\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\n </g>\n </svg>\n </div>\n</div>\n\n<div class=\"call-container\" style=\"width: 100%; left: 116px;\" *ngIf=\"isConcurrentIncoming || newIncomingCallsList?.length > 1\">\n <div class=\"collops\">\n <div class=\"d-flex w-100\">\n <div class=\"d-flex flex-column container-fluid\" >\n <div class=\"callToNum\">Incoming call <br/><span>{{dedicatedNum}}</span></div>\n <ng-container *ngFor=\"let data of newIncomingCallsList\"> \n <div class=\"p-2 \">\n <div class=\"call-info-wrapper w-100 d-flex align-items-center\">\n <div class=\"img\">\n <img class=\"avatar-img-wrapper\" [src]=\"data?.img\" alt=\"\" width=\"45\" />\n </div>\n <div class=\"d-flex justify-content-between w-100 align-items-center mr-2\">\n <div class=\"callerDetails-wrapper\">\n <h5 class=\"break-word\">{{data?.userInfo?.c2cInformation?.name || '-'}}</h5>\n <p class=\"break-word\">{{data?.userInfo?.displayNum ? data?.userInfo?.c2cInformation?.number : data?.userInfo?.c2cInformation?.number }}</p>\n </div> \n <div class=\"d-flex align-items-center\">\n <button class=\"call-btn-wrapper receive-btn\" *ngIf=\"!data?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(data)\"> call </span>\n </button>\n <button class=\"call-btn-wrapper mute-btn\" *ngIf=\"data?.isCallConnected\" (click)=\"toggleMute(data)\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic</span>\n </button>\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"data?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"\">\n <button class=\"record-btn pause-resume\" *ngIf=\"data?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"data?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn-wrapper reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(data)\"> call_end </span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" \n (click)=\"hasDetailedInfo(data) ? onClickExpand(data) : null\" \n [ngClass]=\"{'disabled': !hasDetailedInfo(data)}\"\n [title]=\"hasDetailedInfo(data) ? 'View details' : 'No details available'\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"call-container p-3 text-white model-content\" *ngIf=\"isClickExpand \"> \n <div class=\"mb-2\" style=\"width: 100%; height: 100%;\">\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"incomingCallData.img\" alt=\"\" width=\"100\" />\n </div>\n <div class=\"text-center\">\n <h3 class=\"text-white\">{{selectedIncomingCall?.userInfo?.c2cInformation?.name || '-'}}</h3>\n </div>\n <div class=\"f-13\">\n <div class=\"row mb-3\">\n <div class=\"col-12 d-flex align-items-center mb-2\">\n <div class=\"me-2\">Subject:</div>\n <div class=\"ml-2\">{{selectedIncomingCall?.userInfo?.c2cInformation?.subject || '-'}}</div>\n </div> \n </div>\n\n <div class=\"row mb-2\">\n <div class=\"col-12 d-flex align-items-center mb-2\">\n <div class=\"me-2\">Email:</div>\n <div>{{selectedIncomingCall?.userInfo?.c2cInformation?.email || '-'}}</div>\n </div> \n </div>\n\n <div class=\"row mb-2\">\n <div class=\"col-6 mb-2\">\n <div class=\"\">Number:</div>\n <div class=\"\">{{selectedIncomingCall?.userInfo?.c2cInformation?.number}}</div>\n </div>\n <div class=\"col-6\">\n <div class=\"\">Language:</div>\n <div class=\"ml-2\">{{selectedIncomingCall?.userInfo?.c2cInformation?.language || '-'}}</div>\n </div>\n </div>\n <div class=\"row mb-2\">\n <div class=\"col-6 mb-2\">\n <div class=\"\">Extension:</div>\n <div class=\"ml-2\">{{selectedIncomingCall?.userInfo?.c2cInformation?.extension || '-'}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 d-flex align-items-center mb-2\">\n <div class=\"me-2\">Image:</div>\n <div class=\"text-ellipsis\">\n <ng-container *ngIf=\"selectedIncomingCall?.userInfo?.c2cInformation?.image && selectedIncomingCall?.userInfo?.c2cInformation?.image !== '-'; else noImage\">\n <img src=\"{{selectedIncomingCall?.userInfo?.c2cInformation?.image}}\" alt=\"\" width=\"42\" height=\"42\" class=\"ml-2\"/>\n </ng-container>\n <ng-template #noImage>\n <span class=\"ml-2\">No Image Available</span>\n </ng-template>\n </div>\n </div> \n </div>\n\n <div class=\" mb-4\">\n <div class=\"\">\n <div class=\"\">Message:</div>\n <div class=\"text-ellipsis\">{{selectedIncomingCall?.userInfo?.c2cInformation?.message || '-'}}</div>\n </div>\n </div>\n\n <div class=\"row mb-2\">\n <div class=\"col-6 mb-2\">\n <div class=\"\">Point Name:</div>\n <div class=\"\">{{selectedIncomingCall?.userInfo?.c2cInformation?.pointName || '-'}}</div>\n </div>\n <div class=\"col-6 mb-2\">\n <div class=\"\">Source Name:</div>\n <div class=\"\">{{selectedIncomingCall?.userInfo?.c2cInformation?.sourceName || '-'}}</div>\n </div>\n </div>\n </div>\n <div class=\"call-action-btns mt-0\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!selectedIncomingCall?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(selectedIncomingCall)\"> call </span>\n </button>\n <button class=\"call-btn mute-btn\" *ngIf=\"selectedIncomingCall?.isCallConnected\" (click)=\"toggleMute(selectedIncomingCall)\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n </button>\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"selectedIncomingCall?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(selectedIncomingCall)\"> call_end </span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"wave-container\">\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\" [ngStyle]=\"{'width': '756px'}\">\n <defs>\n <path id=\"gentle-wave\" d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\n </defs>\n <g class=\"parallax\">\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" /> \n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\n </g>\n </svg>\n </div>\n</div>", styles: [".call-container{width:752px!important;height:646px!important;margin:auto;border-radius:30px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.collops{display:flex;flex-direction:column;width:100%;height:100%}.container-fluid{width:400px;height:100%;margin-top:10px}.model-content{background-color:#0d6efd;border-radius:20px;width:395px!important}.calls-side-by-side{position:fixed;top:0;width:30%;height:498px;z-index:1050;pointer-events:auto;display:flex;align-items:flex-start;left:-10rem;transform:translate(.2rem);transition:left 1s ease-in-out}.move{left:41vw!important}.f-13{font-size:13px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto;border-radius:100%;border:solid 4px #fff}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.avatar-img-wrapper{border-radius:100%;margin:0 5px}.call-btn-wrapper{height:38px;background-color:#fff;border-radius:30px;margin:0 4px;opacity:.9;width:40px;span {color: white; line-height: unset !important;}}.hold-btn{background-color:#bebebe26;border:none}.hold-btn span,.mute-btn span{color:#fff!important}.active-hold{background-color:#fff!important}.active-hold span{color:#000!important}.active-mute{background-color:transparent}.call-info-wrapper{border:1px solid white;border-radius:7px;padding:8px 1px!important;word-break:break-all}.call-animation-play{animation:play 3s linear infinite}.avatar-img{width:94px;height:94px;border-radius:100%;position:absolute;left:0;top:0}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.callerDetails h1{margin:12px 0 0;color:#fff}.callerDetails-wrapper{margin:0 5px;color:#fff;display:flex;flex-direction:column}.callerDetails-wrapper h3,.callerDetails-wrapper h5{margin:0;color:#fff}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.callerDetails h4{margin:0;color:#fff}.callerDetails p,.callerDetails-wrapper p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn{position:relative;width:50px;height:50px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.call-sec-btn span{color:#cccbcb}.call-btn{width:48px;height:45px;background-color:#fff;border-radius:30px;box-sizing:border-box;margin:0 8px;opacity:.9}.call-btn:hover{opacity:1}.call-btn span{color:#fff;line-height:unset!important}.receive-btn{background-color:#28a745;border:2px solid #28a745}.mute-btn{position:relative;border:none;background-color:#bebebe26}.reject-btn{background-color:#e03131;border:2px solid #e03131}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.call-action-btns{text-align:center;display:flex;justify-content:center;align-items:center;margin-top:240px}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.wave-container{position:absolute;bottom:0}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.text-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;display:block}.record-action-btns{display:flex;flex-direction:column;align-items:center}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:48px;height:48px!important;display:flex;align-items:center;justify-content:center;cursor:pointer;position:relative;overflow:hidden}.record-btn-side{border:none;border-radius:50%;width:44px;height:44px;display:flex;align-items:center;justify-content:center;cursor:pointer;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;justify-content:center;width:48px;height:48px;background-color:#fff;border-radius:30px}.record-btn.pause-resume{border:none;border-radius:50%;width:48px;height:48px;background:white;display:flex;align-items:center;justify-content:center}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}\n"] }]
303
+ args: [{ selector: 'lib-incoming-call', template: "<!-- Compact incoming banner for single incoming call -->\n<div class=\"incoming-banner-wrapper\" *ngIf=\"newIncomingCallsList?.length === 1 && !isConcurrentIncoming\">\n <div class=\"incoming-banner\">\n <div class=\"incoming-banner-content\">\n <div class=\"incoming-info\">\n <span class=\"incoming-label\">Incoming call</span>\n <div class=\"incoming-caller\">\n <span class=\"caller-name\">{{newIncomingCallsList[0]?.userInfo?.c2cInformation?.name || incomingCallData?.name || '-'}}</span>\n <span class=\"caller-number\">{{newIncomingCallsList[0]?.userInfo?.c2cInformation?.number || newIncomingCallsList[0]?.parameters?.From || incomingCallData?.displayNum || incomingCallData?.phone || ''}}</span>\n </div>\n </div>\n <div class=\"incoming-actions\">\n <button class=\"banner-btn accept-btn\" (click)=\"acceptCallFromList(newIncomingCallsList[0])\">\n <span class=\"material-symbols-outlined\">call</span>\n </button>\n <button class=\"banner-btn reject-btn\" (click)=\"rejectCallFromList(newIncomingCallsList[0])\">\n <span class=\"material-symbols-outlined\">call_end</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<!-- List view for multiple incoming calls -->\n<div class=\"call-container\" style=\"width: 100%; left: 116px;\" *ngIf=\"newIncomingCallsList?.length > 1\">\n <div class=\"collops\">\n <div class=\"d-flex w-100\">\n <div class=\"d-flex flex-column container-fluid\" >\n <div class=\"callToNum\">Incoming call <br/><span>{{dedicatedNum}}</span></div>\n <ng-container *ngFor=\"let data of newIncomingCallsList\"> \n <div class=\"p-2 \">\n <div class=\"call-info-wrapper w-100 d-flex align-items-center\">\n <div class=\"img\">\n <img class=\"avatar-img-wrapper\" [src]=\"data?.img\" alt=\"\" width=\"45\" />\n </div>\n <div class=\"d-flex justify-content-between w-100 align-items-center mr-2\">\n <div class=\"callerDetails-wrapper\">\n <h5 class=\"break-word\">{{data?.userInfo?.c2cInformation?.name || '-'}}</h5>\n <p class=\"break-word\">{{data?.userInfo?.displayNum ? data?.userInfo?.c2cInformation?.number : data?.userInfo?.c2cInformation?.number }}</p>\n </div> \n <div class=\"d-flex align-items-center\">\n <button class=\"call-btn-wrapper receive-btn\" *ngIf=\"!data?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(data)\"> call </span>\n </button>\n <button class=\"call-btn-wrapper mute-btn\" *ngIf=\"data?.isCallConnected\" (click)=\"toggleMute(data)\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic</span>\n </button>\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"data?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"\">\n <button class=\"record-btn pause-resume\" *ngIf=\"data?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"data?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn-wrapper reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(data)\"> call_end </span>\n </button>\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" \n (click)=\"hasDetailedInfo(data) ? onClickExpand(data) : null\" \n [ngClass]=\"{'disabled': !hasDetailedInfo(data)}\"\n [title]=\"hasDetailedInfo(data) ? 'View details' : 'No details available'\">\n <i class=\"fa fa-angle-right\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"call-container p-3 text-white model-content\" *ngIf=\"isClickExpand \"> \n <div class=\"mb-2\" style=\"width: 100%; height: 100%;\">\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\n <img class=\"avatar-img\" [src]=\"incomingCallData.img\" alt=\"\" width=\"100\" />\n </div>\n <div class=\"text-center\">\n <h3 class=\"text-white\">{{selectedIncomingCall?.userInfo?.c2cInformation?.name || '-'}}</h3>\n </div>\n <div class=\"f-13\">\n <div class=\"row mb-3\">\n <div class=\"col-12 d-flex align-items-center mb-2\">\n <div class=\"me-2\">Subject:</div>\n <div class=\"ml-2\">{{selectedIncomingCall?.userInfo?.c2cInformation?.subject || '-'}}</div>\n </div> \n </div>\n\n <div class=\"row mb-2\">\n <div class=\"col-12 d-flex align-items-center mb-2\">\n <div class=\"me-2\">Email:</div>\n <div>{{selectedIncomingCall?.userInfo?.c2cInformation?.email || '-'}}</div>\n </div> \n </div>\n\n <div class=\"row mb-2\">\n <div class=\"col-6 mb-2\">\n <div class=\"\">Number:</div>\n <div class=\"\">{{selectedIncomingCall?.userInfo?.c2cInformation?.number}}</div>\n </div>\n <div class=\"col-6\">\n <div class=\"\">Language:</div>\n <div class=\"ml-2\">{{selectedIncomingCall?.userInfo?.c2cInformation?.language || '-'}}</div>\n </div>\n </div>\n <div class=\"row mb-2\">\n <div class=\"col-6 mb-2\">\n <div class=\"\">Extension:</div>\n <div class=\"ml-2\">{{selectedIncomingCall?.userInfo?.c2cInformation?.extension || '-'}}</div>\n </div>\n </div>\n\n <div class=\"row mb-3\">\n <div class=\"col-12 d-flex align-items-center mb-2\">\n <div class=\"me-2\">Image:</div>\n <div class=\"text-ellipsis\">\n <ng-container *ngIf=\"selectedIncomingCall?.userInfo?.c2cInformation?.image && selectedIncomingCall?.userInfo?.c2cInformation?.image !== '-'; else noImage\">\n <img src=\"{{selectedIncomingCall?.userInfo?.c2cInformation?.image}}\" alt=\"\" width=\"42\" height=\"42\" class=\"ml-2\"/>\n </ng-container>\n <ng-template #noImage>\n <span class=\"ml-2\">No Image Available</span>\n </ng-template>\n </div>\n </div> \n </div>\n\n <div class=\" mb-4\">\n <div class=\"\">\n <div class=\"\">Message:</div>\n <div class=\"text-ellipsis\">{{selectedIncomingCall?.userInfo?.c2cInformation?.message || '-'}}</div>\n </div>\n </div>\n\n <div class=\"row mb-2\">\n <div class=\"col-6 mb-2\">\n <div class=\"\">Point Name:</div>\n <div class=\"\">{{selectedIncomingCall?.userInfo?.c2cInformation?.pointName || '-'}}</div>\n </div>\n <div class=\"col-6 mb-2\">\n <div class=\"\">Source Name:</div>\n <div class=\"\">{{selectedIncomingCall?.userInfo?.c2cInformation?.sourceName || '-'}}</div>\n </div>\n </div>\n </div>\n <div class=\"call-action-btns mt-0\">\n <button class=\"call-btn receive-btn\" *ngIf=\"!selectedIncomingCall?.isCallConnected\">\n <span class=\"material-symbols-outlined\" (click)=\"acceptCallFromList(selectedIncomingCall)\"> call </span>\n </button>\n <button class=\"call-btn mute-btn\" *ngIf=\"selectedIncomingCall?.isCallConnected\" (click)=\"toggleMute(selectedIncomingCall)\" [ngClass]=\"{'active-mute': isMute}\">\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\n </button>\n <div class=\"record-btn-container\">\n <button class=\"record-btn start-stop\" *ngIf=\"selectedIncomingCall?.isCallConnected && !isRecording\" [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording('')\" [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"disbaleEndCallBtn\">\n <span class=\"recording-icon\"></span>\n </button> \n <div class=\"pause-resume-btns\">\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isRecording && !isPaused\" (click)=\"pauseRecording()\">\n <span class=\"material-symbols-outlined\"> pause </span>\n </button>\n <button class=\"record-btn pause-resume\" *ngIf=\"selectedIncomingCall?.isCallConnected && isPaused\" (click)=\"resumeRecording('')\">\n <span class=\"material-symbols-outlined\"> play_arrow </span>\n </button>\n </div>\n </div>\n <button class=\"call-btn reject-btn\">\n <span class=\"material-symbols-outlined\" (click)=\"rejectCallFromList(selectedIncomingCall)\"> call_end </span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"wave-container\">\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\" [ngStyle]=\"{'width': '756px'}\">\n <defs>\n <path id=\"gentle-wave\" d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\n </defs>\n <g class=\"parallax\">\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" /> \n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\n </g>\n </svg>\n </div>\n</div>", styles: [".incoming-banner-wrapper{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;align-items:flex-start;justify-content:center;padding-top:20px;z-index:3000}.incoming-banner{background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:16px 20px;border-radius:16px;box-shadow:0 8px 24px #0000004d;min-width:360px;max-width:500px;animation:slideDown .3s ease-out}@keyframes slideDown{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:16px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:6px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px;font-weight:500}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:16px;font-weight:600;color:#fff}.caller-number{font-size:14px;color:#ffffffe6}.incoming-actions{display:flex;gap:10px;align-items:center}.banner-btn{width:48px;height:48px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s,box-shadow .2s}.banner-btn:hover{transform:scale(1.1);box-shadow:0 4px 12px #0003}.banner-btn .material-symbols-outlined{font-size:22px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.call-container{width:752px!important;height:646px!important;margin:auto;border-radius:30px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.collops{display:flex;flex-direction:column;width:100%;height:100%}.container-fluid{width:400px;height:100%;margin-top:10px}.model-content{background-color:#0d6efd;border-radius:20px;width:395px!important}.calls-side-by-side{position:fixed;top:0;width:30%;height:498px;z-index:1050;pointer-events:auto;display:flex;align-items:flex-start;left:-10rem;transform:translate(.2rem);transition:left 1s ease-in-out}.move{left:41vw!important}.f-13{font-size:13px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto;border-radius:100%;border:solid 4px #fff}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.avatar-img-wrapper{border-radius:100%;margin:0 5px}.call-btn-wrapper{height:38px;background-color:#fff;border-radius:30px;margin:0 4px;opacity:.9;width:40px;span {color: white; line-height: unset !important;}}.hold-btn{background-color:#bebebe26;border:none}.hold-btn span,.mute-btn span{color:#fff!important}.active-hold{background-color:#fff!important}.active-hold span{color:#000!important}.active-mute{background-color:transparent}.call-info-wrapper{border:1px solid white;border-radius:7px;padding:8px 1px!important;word-break:break-all}.call-animation-play{animation:play 3s linear infinite}.avatar-img{width:94px;height:94px;border-radius:100%;position:absolute;left:0;top:0}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.callerDetails h1{margin:12px 0 0;color:#fff}.callerDetails-wrapper{margin:0 5px;color:#fff;display:flex;flex-direction:column}.callerDetails-wrapper h3,.callerDetails-wrapper h5{margin:0;color:#fff}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.callerDetails h4{margin:0;color:#fff}.callerDetails p,.callerDetails-wrapper p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn{position:relative;width:50px;height:50px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.call-sec-btn span{color:#cccbcb}.call-btn{width:48px;height:45px;background-color:#fff;border-radius:30px;box-sizing:border-box;margin:0 8px;opacity:.9}.call-btn:hover{opacity:1}.call-btn span{color:#fff;line-height:unset!important}.receive-btn{background-color:#28a745;border:2px solid #28a745}.mute-btn{position:relative;border:none;background-color:#bebebe26}.reject-btn{background-color:#e03131;border:2px solid #e03131}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.call-action-btns{text-align:center;display:flex;justify-content:center;align-items:center;margin-top:240px}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.wave-container{position:absolute;bottom:0}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.text-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;display:block}.record-action-btns{display:flex;flex-direction:column;align-items:center}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:48px;height:48px!important;display:flex;align-items:center;justify-content:center;cursor:pointer;position:relative;overflow:hidden}.record-btn-side{border:none;border-radius:50%;width:44px;height:44px;display:flex;align-items:center;justify-content:center;cursor:pointer;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;justify-content:center;width:48px;height:48px;background-color:#fff;border-radius:30px}.record-btn.pause-resume{border:none;border-radius:50%;width:48px;height:48px;background:white;display:flex;align-items:center;justify-content:center}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}\n"] }]
304
304
  }], ctorParameters: function () { return [{ type: i1.ExtensionService }, { type: i2.TwilioService }, { type: i3.NotificationService }]; }, propDecorators: { incomingCallData: [{
305
305
  type: Input
306
306
  }], newIncomingCallsList: [{
@@ -316,4 +316,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
316
316
  }], selectedIncomingCallInfo: [{
317
317
  type: Output
318
318
  }] } });
319
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jb21pbmctY2FsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2luY29taW5nLWNhbGwvaW5jb21pbmctY2FsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2luY29taW5nLWNhbGwvaW5jb21pbmctY2FsbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBSXhILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRSxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFFLFFBQVEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7Ozs7OztBQVE5QyxNQUFNLE9BQU8scUJBQXFCO0lBdUI5QixZQUNZLGdCQUFrQyxFQUNsQyxhQUE0QixFQUM1QixtQkFBd0M7UUFGeEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBdEIzQyx5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFDL0Msc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBQ2xDLHlCQUFvQixHQUFRLEVBQUUsQ0FBQztRQUcvQixpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUd6QixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0IsYUFBUSxHQUFZLEtBQUssQ0FB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QVEsQ0FBQyxFQUFFO1lBQy9FLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDckQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGtCQUFrQjtRQUNoQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7WUFDeEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFRLG9DQUFvQztTQUNoRjtJQUNILENBQUM7O21IQWpVSSxxQkFBcUI7dUdBQXJCLHFCQUFxQiw0WENmbEMsc3JlQWlPTTs0RkRsTk8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQjtxS0FLbEIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFjSSxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLHdCQUF3QjtzQkFBakMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FsbCwgRGV2aWNlIH0gZnJvbSAnQHR3aWxpby92b2ljZS1zZGsnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvZXh0ZW5zaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHdpbGlvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvdHdpbGlvLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2xvYmFsQ29uc3RhbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZ2xvYmFsLWNvbnN0YW50JztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL05vdGlmaWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCBzd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcbmltcG9ydCB7IGludGVydmFsLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItaW5jb21pbmctY2FsbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbmNvbWluZy1jYWxsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW5jb21pbmctY2FsbC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSW5jb21pbmdDYWxsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASW5wdXQoKSBpbmNvbWluZ0NhbGxEYXRhOiBhbnk7XG4gICAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsc0xpc3Q6IGFueTtcbiAgICBASW5wdXQoKSBkZXZpY2VJZDogYW55O1xuICAgIEBJbnB1dCgpIGlzQ29uY3VycmVudEluY29taW5nOiBib29sZWFuID0gZmFsc2U7XG4gICAgc2hvd1JpbmdBbmltYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICAgIHNlbGVjdGVkSW5jb21pbmdDYWxsOiBhbnkgPSB7fTtcbiAgICB0d2lsaW9DYWxsRGF0YT86IENhbGw7XG4gICAgdHdpbGlvQXV0aElkPzogc3RyaW5nO1xuICAgIGRlZGljYXRlZE51bTpzdHJpbmcgPSAnJztcbiAgICBDYWxsU2lkOiBhbnk7XG4gICAgcmVjb3JkQ2FsbD86IGJvb2xlYW47XG4gICAgc2hvdWxkUmVjb3JkQ2FsbDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGlzQ2xpY2tFeHBhbmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpc1JlY29yZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGlzUGF1c2VkOiBib29sZWFuID0gZmFsc2U7XG4gICAgaXNUd2lsaW9Db25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKSBjbG9zZUluY29taW5nQ2FsbERpdjogRXZlbnRFbWl0dGVyPHsgc2hvdzogbnVtYmVyLCBjYWxsOiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgc2hvdzogbnVtYmVyLCBjYWxsOiBhbnkgfT4oKTtcbiAgICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsc05ld0xpc3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIHNlbGVjdGVkSW5jb21pbmdDYWxsSW5mbzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBpc011dGU/OiBib29sZWFuO1xuICAgIFxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGV4dGVuc2lvblNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdHdpbGlvU2VydmljZTogVHdpbGlvU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJpdmNlOiBOb3RpZmljYXRpb25TZXJ2aWNlXG4gICAgKSB7IFxuICAgICAgICBjb25zb2xlLmxvZygnSW5jb21pbmdDYWxsQ29tcG9uZW50JylcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcblxuXG4gICAgICAvLyB0aGlzLnR3aWxpb1NlcnZpY2UuY3VycmVudENhbGwuc3Vic2NyaWJlKChjYWxsOiBhbnkpID0+IHtcbiAgICAgIC8vICAgaWYgKGNhbGwpIHtcbiAgICAgIC8vICAgICB0aGlzLnR3aWxpb0NhbGxEYXRhID0gY2FsbDtcbiAgICAgIC8vICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcml2Y2Uuc2hvd05vdGlmaWNhdGlvbihjYWxsKTtcbiAgICAgIC8vICAgICAvLyBIYW5kbGUgdGhlIGNhbGwgVUlcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdJbmNvbWluZ0NhbGxDb21wb25lbnQgbmdPbkluaXQnKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmN1cnJlbnRDYWxsLnN1YnNjcmliZShjYWxsID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnR3aWxpb0NhbGxEYXRhID0gY2FsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50d2lsaW9BdXRoSWQgPSBjYWxsLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCd0d2lsaW9BdXRoSWQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwucGFyYW1ldGVycyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kSVBmb3JJbmNvbWluZ0NhbGwodGhpcy50d2lsaW9BdXRoSWQsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbC5vbignY2FuY2VsJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5jb21pbmdDYWxsRGF0YSAmJiB0aGlzLmluY29taW5nQ2FsbERhdGEucGFyYW1ldGVycyAmJiB0aGlzLmluY29taW5nQ2FsbERhdGEucGFyYW1ldGVycy5DYWxsU2lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0ucGFyYW1ldGVycyAmJiBpdGVtLnBhcmFtZXRlcnMuQ2FsbFNpZCAhPT0gdGhpcy5pbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMuQ2FsbFNpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlamVjdENhbGxGcm9tTGlzdChjYWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FsbC5vbignZGlzY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluY29taW5nQ2FsbERhdGEgJiYgdGhpcy5pbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMgJiYgdGhpcy5pbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMuQ2FsbFNpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcmFtZXRlcnMgJiYgaXRlbS5wYXJhbWV0ZXJzLkNhbGxTaWQgIT09IHRoaXMuaW5jb21pbmdDYWxsRGF0YS5wYXJhbWV0ZXJzLkNhbGxTaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWplY3RDYWxsRnJvbUxpc3QoY2FsbCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFjY2VwdENhbGxGcm9tTGlzdChkYXRhPzogYW55KSB7XG4gICAgICAgIGlmICghZGF0YSkgeyByZXR1cm47IH1cbiAgICAgICAgLy8gRGlzY29ubmVjdCBhbnkgb3RoZXIgY29ubmVjdGVkIGNhbGwgYmVmb3JlIGFjY2VwdGluZyB0aGlzIG9uZVxuICAgICAgICBpZiAodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCAmJiB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJDb25uZWN0ZWQgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pc0NhbGxDb25uZWN0ZWQgJiYgaXRlbSAhPT0gZGF0YSk7XG4gICAgICAgICAgICBpZiAob3RoZXJDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkgeyBvdGhlckNvbm5lY3RlZC5kaXNjb25uZWN0KCk7IH0gY2F0Y2gge31cbiAgICAgICAgICAgICAgICBvdGhlckNvbm5lY3RlZC5pc0NhbGxDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBvdGhlckNvbm5lY3RlZC5pc0ZpcnN0Q2FsbCA9IGZhbHNlOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFjY2VwdCB0aGlzIGNhbGwgYW5kIG1hcmsgYXMgdGhlIGFjdGl2ZSBvbmVcbiAgICAgICAgZGF0YS5hY2NlcHQoKTtcbiAgICAgICAgZGF0YS5pc0NhbGxDb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICBkYXRhLmlzRmlyc3RDYWxsID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2Uuc2V0Q2FsbFNpZCh0aGlzLkNhbGxTaWQsIHRoaXMucmVjb3JkQ2FsbCk7XG4gICAgICAgIHRoaXMuc2VuZElQZm9ySW5jb21pbmdDYWxsKGRhdGEuY3VzdG9tUGFyYW1ldGVycy5nZXQoJ3R3aWxpb0F1dGhJZCcpLCAnYW5zd2VyZWQnKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VJbmNvbWluZ0NhbGxXcmFwcGVyKDEpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVqZWN0Q2FsbEZyb21MaXN0KGRhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBpZiAoZGF0YS5yZWplY3QpIGRhdGEucmVqZWN0KCk7XG4gICAgICAgIGlmIChkYXRhLmRpc2Nvbm5lY3QpIGRhdGEuZGlzY29ubmVjdCgpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGRhdGEucGFyYW1ldGVycykge1xuICAgICAgICAgICAgZGF0YS5wYXJhbWV0ZXJzWydpc0NhbGxDb25uZWN0ZWQnXSA9IGZhbHNlOyAvLyBTaG91bGQgYmUgZmFsc2Ugd2hlbiByZWplY3RpbmdcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLmN1c3RvbVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZElQZm9ySW5jb21pbmdDYWxsKGRhdGEuY3VzdG9tUGFyYW1ldGVycy5nZXQoJ3R3aWxpb0F1dGhJZCcpLCAnYW5zd2VyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgJiYgZGF0YSAmJiBkYXRhLnBhcmFtZXRlcnMgJiYgZGF0YS5wYXJhbWV0ZXJzLkNhbGxTaWQpIHtcbiAgICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcmFtZXRlcnMgJiYgaXRlbS5wYXJhbWV0ZXJzLkNhbGxTaWQgIT09IGRhdGEucGFyYW1ldGVycy5DYWxsU2lkKTtcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc05ld0xpc3QuZW1pdCh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0KTtcbiAgICAgICAgICAgIGlmKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VJbmNvbWluZ0NhbGxEaXYuZW1pdCh7IHNob3c6IDAsIGNhbGw6IGRhdGEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9zZUluY29taW5nQ2FsbFdyYXBwZXIodmFsOiBhbnkpIHtcbiAgICAgICAgdGhpcy5jbG9zZUluY29taW5nQ2FsbERpdi5lbWl0KHsgc2hvdzogdmFsLCBjYWxsOiB0aGlzLnR3aWxpb0NhbGxEYXRhIH0pO1xuICAgIH1cblxuICAgIHRvZ2dsZU11dGUoZGF0YT86IGFueSkge1xuICAgICAgICB0aGlzLmlzTXV0ZSA9ICF0aGlzLmlzTXV0ZTtcbiAgICAgICAgZGF0YS5tdXRlKHRoaXMuaXNNdXRlKTtcbiAgICB9XG5cbiAgICBzZW5kSVBmb3JJbmNvbWluZ0NhbGwocmVjb3JkSWQ6IGFueSwgY2FsbHN0YXR1czogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZW5kSVBmb3JJbmNvbWluZ0NhbGwnKVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldElQRGV0YWlsc0ZvckNhbGwocmVjb3JkSWQsIGNhbGxzdGF0dXMsIHRoaXMuZGV2aWNlSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwOiBhbnkgPSByZXM7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwLmNhbGxBdXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNhbGxTaWQgPSByZXNwLmNhbGxBdXRoLmNhbGxTaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZENhbGwgPSByZXNwLmNhbGxBdXRoLnJlY29yZENhbGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIHJlY29yZENhbGwgZmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3AuY2FsbEF1dGgucmVjb3JkQ2FsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3VsZFJlY29yZENhbGwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG91bGRSZWNvcmRDYWxsID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2FsKFwiRXJyb3JcIiwgXCJNaXNzaW5nIGNhbGwgYXV0aGVudGljYXRpb24gZGV0YWlscy5cIiwgXCJlcnJvclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3dhbChcIkVycm9yXCIsIHJlc3AubWVzc2FnZS5qb2luKFwiPGJyLz5cIiksIFwiZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBzd2FsKFwiRXJyb3JcIiwgR2xvYmFsQ29uc3RhbnQuRXJyb3JNc2c1MDAsIFwiZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvblVzZXJJbmZvQnlDYWxsU2lkKCl7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsICYmIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwudXNlckluZm8pIHtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCA/IE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwpLmxlbmd0aCA/IHRydWUgOiBmYWxzZSA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGNhbGwgaGFzIGRldGFpbGVkIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmb3IgZXhwYW5zaW9uXG4gICAgaGFzRGV0YWlsZWRJbmZvKGNhbGxEYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFjYWxsRGF0YSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgdXNlckluZm8gZXhpc3RzIGFuZCBoYXMgbWVhbmluZ2Z1bCBkYXRhXG4gICAgICAgIGlmIChjYWxsRGF0YS51c2VySW5mbyAmJiBjYWxsRGF0YS51c2VySW5mby5jMmNJbmZvcm1hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgaW5mbyA9IGNhbGxEYXRhLnVzZXJJbmZvLmMyY0luZm9ybWF0aW9uO1xuICAgICAgICAgICAgcmV0dXJuICEhKFxuICAgICAgICAgICAgICAgIGluZm8uc3ViamVjdCAmJiBpbmZvLnN1YmplY3QgIT09ICctJyB8fFxuICAgICAgICAgICAgICAgIGluZm8uZW1haWwgJiYgaW5mby5lbWFpbCAhPT0gJy0nIHx8XG4gICAgICAgICAgICAgICAgaW5mby5tZXNzYWdlICYmIGluZm8ubWVzc2FnZSAhPT0gJy0nIHx8XG4gICAgICAgICAgICAgICAgaW5mby5wb2ludE5hbWUgJiYgaW5mby5wb2ludE5hbWUgIT09ICctJyB8fFxuICAgICAgICAgICAgICAgIGluZm8uc291cmNlTmFtZSAmJiBpbmZvLnNvdXJjZU5hbWUgIT09ICctJyB8fFxuICAgICAgICAgICAgICAgIGluZm8uZXh0ZW5zaW9uICYmIGluZm8uZXh0ZW5zaW9uICE9PSAnLScgfHxcbiAgICAgICAgICAgICAgICBpbmZvLnVybCB8fFxuICAgICAgICAgICAgICAgIGluZm8ubGF0aXR1ZGUgfHxcbiAgICAgICAgICAgICAgICBpbmZvLmxvbmdpdHVkZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICBvbkNsaWNrRXhwYW5kKGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwgPT09IGRhdGEgJiYgdGhpcy5pc0NsaWNrRXhwYW5kKSB7XG4gICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbEluZm8uZW1pdCh7fSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCA9IGRhdGE7XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbFsnaXNDbGlja0V4cGFuZCddID0gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgJiYgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5mb3JFYWNoKChjYWxsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGwgIT09IHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxbJ2lzQ2xpY2tFeHBhbmQnXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGxJbmZvLmVtaXQodGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKCF0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsLnVzZXJJbmZvIHx8IHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwudXNlckluZm8uc3RhdHVzID09IDIwMSl7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24odGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRVc2VySW5mb3JtYXRpb24oaW5jb21pbmdDYWxsRGF0YTogYW55KSB7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5mcm9tRW50cmllcyhBcnJheS5mcm9tKGluY29taW5nQ2FsbERhdGEuY3VzdG9tUGFyYW1ldGVycy5lbnRyaWVzKCkpKTtcbiAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbihkYXRhWyd0d2lsaW9BdXRoSWQnXSkuc3Vic2NyaWJlKFxuICAgICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAgICAgaW5jb21pbmdDYWxsRGF0YVsndXNlckluZm8nXT1yZXNwb25zZVxuICAgICAgICAgIH0sIDUwMDApXG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBmcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgcmV0dXJuIGVudHJpZXMucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgYW55Pik7ICBcbiAgICAgIH1cblxuICAgICAgZGlzYmFsZUVuZENhbGxCdG4gPSBmYWxzZTtcbiAgICAgIGluY29taW5nQ2FsbFNpZCA9ICcnO1xuICAgICAgaW5jb21pbmdSZWNvcmRDYWxsID0gZmFsc2U7XG4gICAgICB0aW1lclN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICAgIHRpbWVFbGFwc2VkID0gMDtcbiAgICAgIHRvZ2dsZVJlY29yZGluZyhzaWQ6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5pc1JlY29yZGluZykge1xuICAgICAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgICBzdGFydFJlY29yZGluZygpIHtcbiAgICAgICAgICBsZXQgc2lkO1xuICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFNpZCgpO1xuICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsU2lkID0gZGV0YWlscy5jYWxsU2lkO1xuICAgICAgICAgIHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsID0gZGV0YWlscy5yZWNvcmRDYWxsO1xuICAgICAgICAgIHNpZCA9IHRoaXMuaW5jb21pbmdDYWxsU2lkID8gdGhpcy5pbmNvbWluZ0NhbGxTaWQgOiB0aGlzLkNhbGxTaWQ7XG4gICAgICBcbiAgICAgICAgICAvLyBpZiAoIXRoaXMuaW5jb21pbmdSZWNvcmRDYWxsICYmICF0aGlzLnJlY29yZENhbGwpIHtcbiAgICAgICAgICAvLyAgIHJldHVybjtcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxSZWNvcmRpbmcoc2lkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1JlY29yZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7ICBcbiAgICAgICAgICAgIC8vIHRoaXMudGltZUVsYXBzZWQgPSAwO1xuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyMSgpO1xuICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN0YXJ0aW5nIHJlY29yZGluZycsIGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzdG9wUmVjb3JkaW5nKCkge1xuICAgICAgICAgIC8vIGlmICghdGhpcy5pbmNvbWluZ1JlY29yZENhbGwgJiYgIXRoaXMucmVjb3JkQ2FsbCkge1xuICAgICAgICAgIC8vICAgcmV0dXJuO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgICB0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhdXNlUmVjb3JkaW5nKCkge1xuICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFNpZCgpO1xuICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsU2lkID0gZGV0YWlscy5jYWxsU2lkO1xuICAgICAgICAgIHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsID0gZGV0YWlscy5yZWNvcmRDYWxsO1xuICAgICAgICAgIGNvbnN0IHNpZCA9IHRoaXMuaW5jb21pbmdDYWxsU2lkID8gdGhpcy5pbmNvbWluZ0NhbGxTaWQgOiB0aGlzLkNhbGxTaWQ7XG4gICAgICBcbiAgICAgICAgICAvLyBpZiAoIXRoaXMuaW5jb21pbmdSZWNvcmRDYWxsICYmICF0aGlzLnJlY29yZENhbGwpIHtcbiAgICAgICAgICAvLyAgIHJldHVybjtcbiAgICAgICAgICAvLyB9XG4gICAgICBcbiAgICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UucGF1c2VPclJlc3VtZVJlY29yZGluZyhzaWQsICdwYXVzZScpLnN1YnNjcmliZShcbiAgICAgICAgICAgIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIC8vICAgdGhpcy5zdG9wUmVjb3JkaW5nVGltZXIoKTtcbiAgICAgICAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXVzaW5nIHJlY29yZGluZzonLCBlcnJvcik7XG4gICAgICAgICAgICAgIC8vIENvbnNpZGVyIHVwZGF0aW5nIHRoZSBVSSB0byBzaG93IHRoZSBlcnJvciBzdGF0ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdW1lUmVjb3JkaW5nKHNpZDogYW55KSB7XG4gICAgICAgIC8vICAgbGV0IHNpZDtcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxTaWQoKTtcbiAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbFNpZCA9IGRldGFpbHMuY2FsbFNpZDtcbiAgICAgICAgICB0aGlzLmluY29taW5nUmVjb3JkQ2FsbCA9IGRldGFpbHMucmVjb3JkQ2FsbDtcbiAgICAgICAgICBzaWQgPSB0aGlzLmluY29taW5nQ2FsbFNpZCA/IHRoaXMuaW5jb21pbmdDYWxsU2lkIDogdGhpcy5DYWxsU2lkO1xuICAgICAgXG4gICAgICAgICAgLy8gaWYgKCF0aGlzLmluY29taW5nUmVjb3JkQ2FsbCAmJiAhdGhpcy5yZWNvcmRDYWxsKSB7XG4gICAgICAgICAgLy8gICByZXR1cm47IC8vIFNraXAgaWYgcmVjb3JkaW5nIGlzIG5vdCBlbmFibGVkXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5wYXVzZU9yUmVzdW1lUmVjb3JkaW5nKHNpZCwgJ3Jlc3VtZScpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VGltZXIxKCk7XG4gICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVzdW1pbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0VGltZXIxKCkge1xuICAgICAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSBpbnRlcnZhbCgxMDAwKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50aW1lRWxhcHNlZCsrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0b3BSZWNvcmRpbmdUaW1lcigpIHtcbiAgICAgICAgICBpZiAodGhpcy50aW1lclN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOyAvLyBQYXVzZSB0aGUgdGltZXJcbiAgICAgICAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7ICAgICAgICAvLyBPcHRpb25hbGx5IHJlc2V0IHRoZSBzdWJzY3JpcHRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH1cbn0iLCI8ZGl2IGNsYXNzPVwiY2FsbC1jb250YWluZXJcIiAqbmdJZj1cIm5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGggPT09IDFcIj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgcGFkZGluZy1sZWZ0OiAxNHJlbTtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxUb051bVwiPkluY29taW5nIGNhbGwgb24gPGJyLz48c3Bhbj57e2RlZGljYXRlZE51bX19PC9zcGFuPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hbmltYXRpb25cIiBbbmdDbGFzc109XCJ7J2NhbGwtYW5pbWF0aW9uLXBsYXknOiBzaG93UmluZ0FuaW1hdGlvbn1cIj5cbiAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nXCIgW3NyY109XCJuZXdJbmNvbWluZ0NhbGxzTGlzdFswXT8uaW1nIHx8IGluY29taW5nQ2FsbERhdGE/LmltZ1wiIGFsdD1cIlwiIHdpZHRoPVwiMTIwXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsZXJEZXRhaWxzXCI+XG4gICAgICAgICAgICA8aDE+e3tuZXdJbmNvbWluZ0NhbGxzTGlzdFswXT8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5uYW1lIHx8IGluY29taW5nQ2FsbERhdGE/Lm5hbWUgfHwgJy0nfX08L2gxPlxuICAgICAgICAgICAgPHA+e3tuZXdJbmNvbWluZ0NhbGxzTGlzdFswXT8udXNlckluZm8/LmRpc3BsYXlOdW0gPyBuZXdJbmNvbWluZ0NhbGxzTGlzdFswXT8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5udW1iZXIgOiBuZXdJbmNvbWluZ0NhbGxzTGlzdFswXT8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5udW1iZXIgfHwgaW5jb21pbmdDYWxsRGF0YT8uZGlzcGxheU51bSB8fCBpbmNvbWluZ0NhbGxEYXRhPy5waG9uZX19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjYWxsZXJEZXRhaWxzXCI+XG4gICAgICAgICAgICA8aDEgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzhweCd9XCI+e3tjYWxsRGF0YS5uYW1lfX08L2gxPlxuICAgICAgICAgICAgPHA+e3tjYWxsRGF0YS5kaXNwbGF5TnVtID8gY2FsbERhdGEuZGlzcGxheU51bSA6IGNhbGxEYXRhLnBob25lIH19PC9wPlxuICAgICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luLXRvcDogNHB4XCI+e3t0aW1lcn19PC9oND5cbiAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hY3Rpb24tYnRuc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlY2VpdmUtYnRuXCIgKm5nSWY9XCIhbmV3SW5jb21pbmdDYWxsc0xpc3RbMF0/LmlzQ2FsbENvbm5lY3RlZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIChjbGljayk9XCJhY2NlcHRDYWxsRnJvbUxpc3QobmV3SW5jb21pbmdDYWxsc0xpc3RbMF0pXCI+IGNhbGwgPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gbXV0ZS1idG5cIiAqbmdJZj1cIm5ld0luY29taW5nQ2FsbHNMaXN0WzBdPy5pc0NhbGxDb25uZWN0ZWRcIiAoY2xpY2spPVwidG9nZ2xlTXV0ZShuZXdJbmNvbWluZ0NhbGxzTGlzdFswXSlcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZS1tdXRlJzogaXNNdXRlfVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiIWlzTXV0ZVwiPiBtaWM8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYnRuLWNvbnRhaW5lciBcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBzdGFydC1zdG9wXCIgKm5nSWY9XCJuZXdJbmNvbWluZ0NhbGxzTGlzdFswXT8uaXNDYWxsQ29ubmVjdGVkICYmICFpc1JlY29yZGluZ1wiIFtuZ0NsYXNzXT1cInsncmVjb3JkaW5nJzogaXNSZWNvcmRpbmcsICdzdG9wcGVkJzogIWlzUmVjb3JkaW5nfVwiIChjbGljayk9XCJ0b2dnbGVSZWNvcmRpbmcoJycpXCIgW3RpdGxlXT1cImlzUmVjb3JkaW5nID8gJ1N0b3AgUmVjb3JkaW5nJyA6ICdTdGFydCBSZWNvcmRpbmcnXCIgW2Rpc2FibGVkXT1cImRpc2JhbGVFbmRDYWxsQnRuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVjb3JkaW5nLWljb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+ICAgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cIm5ld0luY29taW5nQ2FsbHNMaXN0WzBdPy5pc0NhbGxDb25uZWN0ZWQgJiYgaXNSZWNvcmRpbmcgJiYgIWlzUGF1c2VkXCIgKGNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwYXVzZSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cIm5ld0luY29taW5nQ2FsbHNMaXN0WzBdPy5pc0NhbGxDb25uZWN0ZWQgJiYgaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKCcnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBsYXlfYXJyb3cgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlamVjdC1idG5cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwicmVqZWN0Q2FsbEZyb21MaXN0KG5ld0luY29taW5nQ2FsbHNMaXN0WzBdKVwiPiBjYWxsX2VuZCA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwid2F2ZS1jb250YWluZXJcIj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cIndhdmVzXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAyNCAxNTAgMjhcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHNoYXBlLXJlbmRlcmluZz1cImF1dG9cIj5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgIDxwYXRoIGlkPVwiZ2VudGxlLXdhdmVcIiBkPVwiTS0xNjAgNDRjMzAgMCA1OC0xOCA4OC0xOHMgNTggMTggODggMTggNTgtMTggODgtMTggNTggMTggODggMTggdjQ0aC0zNTJ6XCIgLz5cbiAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgIDxnIGNsYXNzPVwicGFyYWxsYXhcIj5cbiAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiMFwiIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNylcIiAvPlxuICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCIzXCIgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC41KVwiIC8+XG4gICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjdcIiBmaWxsPVwiI2ZmZlwiIC8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJjYWxsLWNvbnRhaW5lclwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IGxlZnQ6IDExNnB4O1wiICpuZ0lmPVwiaXNDb25jdXJyZW50SW5jb21pbmcgfHwgbmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCA+IDFcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sbG9wc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGNvbnRhaW5lci1mbHVpZFwiID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbFRvTnVtXCI+SW5jb21pbmcgY2FsbCA8YnIvPjxzcGFuPnt7ZGVkaWNhdGVkTnVtfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBuZXdJbmNvbWluZ0NhbGxzTGlzdFwiPiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0yIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtaW5mby13cmFwcGVyIHctMTAwIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nLXdyYXBwZXJcIiBbc3JjXT1cImRhdGE/LmltZ1wiIGFsdD1cIlwiIHdpZHRoPVwiNDVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gdy0xMDAgYWxpZ24taXRlbXMtY2VudGVyIG1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHMtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiYnJlYWstd29yZFwiPnt7ZGF0YT8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5uYW1lIHx8ICctJ319PC9oNT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYnJlYWstd29yZFwiPnt7ZGF0YT8udXNlckluZm8/LmRpc3BsYXlOdW0gPyBkYXRhPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/Lm51bWJlciA6IGRhdGE/LnVzZXJJbmZvPy5jMmNJbmZvcm1hdGlvbj8ubnVtYmVyIH19PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuLXdyYXBwZXIgcmVjZWl2ZS1idG5cIiAqbmdJZj1cIiFkYXRhPy5pc0NhbGxDb25uZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwiYWNjZXB0Q2FsbEZyb21MaXN0KGRhdGEpXCI+IGNhbGwgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4td3JhcHBlciBtdXRlLWJ0blwiICpuZ0lmPVwiZGF0YT8uaXNDYWxsQ29ubmVjdGVkXCIgIChjbGljayk9XCJ0b2dnbGVNdXRlKGRhdGEpXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtbXV0ZSc6IGlzTXV0ZX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cImlzTXV0ZVwiPiBtaWNfb2ZmIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFpc011dGVcIj4gbWljPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWJ0bi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBzdGFydC1zdG9wXCIgKm5nSWY9XCJkYXRhPy5pc0NhbGxDb25uZWN0ZWQgJiYgIWlzUmVjb3JkaW5nXCIgW25nQ2xhc3NdPVwieydyZWNvcmRpbmcnOiBpc1JlY29yZGluZywgJ3N0b3BwZWQnOiAhaXNSZWNvcmRpbmd9XCIgKGNsaWNrKT1cInRvZ2dsZVJlY29yZGluZygnJylcIiBbdGl0bGVdPVwiaXNSZWNvcmRpbmcgPyAnU3RvcCBSZWNvcmRpbmcnIDogJ1N0YXJ0IFJlY29yZGluZydcIiBbZGlzYWJsZWRdPVwiZGlzYmFsZUVuZENhbGxCdG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWNvcmRpbmctaWNvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiZGF0YT8uaXNDYWxsQ29ubmVjdGVkICYmIGlzUmVjb3JkaW5nICYmICFpc1BhdXNlZFwiIChjbGljayk9XCJwYXVzZVJlY29yZGluZygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGF1c2UgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJkYXRhPy5pc0NhbGxDb25uZWN0ZWQgJiYgaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKCcnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBsYXlfYXJyb3cgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuLXdyYXBwZXIgcmVqZWN0LWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIChjbGljayk9XCJyZWplY3RDYWxsRnJvbUxpc3QoZGF0YSlcIj4gY2FsbF9lbmQgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlYXJyb3ctYXJyb3cgbWUtMlwiIGlkPVwidG9nZ2xlYXJyb3dcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhc0RldGFpbGVkSW5mbyhkYXRhKSA/IG9uQ2xpY2tFeHBhbmQoZGF0YSkgOiBudWxsXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnOiAhaGFzRGV0YWlsZWRJbmZvKGRhdGEpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJoYXNEZXRhaWxlZEluZm8oZGF0YSkgPyAnVmlldyBkZXRhaWxzJyA6ICdObyBkZXRhaWxzIGF2YWlsYWJsZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFuZ2xlLXJpZ2h0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1jb250YWluZXIgcC0zIHRleHQtd2hpdGUgbW9kZWwtY29udGVudFwiICpuZ0lmPVwiaXNDbGlja0V4cGFuZCBcIj4gICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlO1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hbmltYXRpb25cIiBbbmdDbGFzc109XCJ7J2NhbGwtYW5pbWF0aW9uLXBsYXknOiBzaG93UmluZ0FuaW1hdGlvbn1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nXCIgW3NyY109XCJpbmNvbWluZ0NhbGxEYXRhLmltZ1wiIGFsdD1cIlwiIHdpZHRoPVwiMTAwXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwidGV4dC13aGl0ZVwiPnt7c2VsZWN0ZWRJbmNvbWluZ0NhbGw/LnVzZXJJbmZvPy5jMmNJbmZvcm1hdGlvbj8ubmFtZSB8fCAnLSd9fTwvaDM+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZi0xM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTJcIj5TdWJqZWN0OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTJcIj57e3NlbGVjdGVkSW5jb21pbmdDYWxsPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/LnN1YmplY3QgfHwgJy0nfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICBcbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiPkVtYWlsOjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e3NlbGVjdGVkSW5jb21pbmdDYWxsPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/LmVtYWlsIHx8ICctJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPk51bWJlcjo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPnt7c2VsZWN0ZWRJbmNvbWluZ0NhbGw/LnVzZXJJbmZvPy5jMmNJbmZvcm1hdGlvbj8ubnVtYmVyfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPkxhbmd1YWdlOjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMlwiPnt7c2VsZWN0ZWRJbmNvbWluZ0NhbGw/LnVzZXJJbmZvPy5jMmNJbmZvcm1hdGlvbj8ubGFuZ3VhZ2UgfHwgJy0nfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPkV4dGVuc2lvbjo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTJcIj57e3NlbGVjdGVkSW5jb21pbmdDYWxsPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/LmV4dGVuc2lvbiB8fCAnLSd9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTJcIj5JbWFnZTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVsbGlwc2lzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkSW5jb21pbmdDYWxsPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/LmltYWdlICYmIHNlbGVjdGVkSW5jb21pbmdDYWxsPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/LmltYWdlICE9PSAnLSc7IGVsc2Ugbm9JbWFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cInt7c2VsZWN0ZWRJbmNvbWluZ0NhbGw/LnVzZXJJbmZvPy5jMmNJbmZvcm1hdGlvbj8uaW1hZ2V9fVwiIGFsdD1cIlwiIHdpZHRoPVwiNDJcIiBoZWlnaHQ9XCI0MlwiIGNsYXNzPVwibWwtMlwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSW1hZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMlwiPk5vIEltYWdlIEF2YWlsYWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgXG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgbWItNFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPk1lc3NhZ2U6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVsbGlwc2lzXCI+e3tzZWxlY3RlZEluY29taW5nQ2FsbD8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5tZXNzYWdlIHx8ICctJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+UG9pbnQgTmFtZTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj57e3NlbGVjdGVkSW5jb21pbmdDYWxsPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/LnBvaW50TmFtZSB8fCAnLSd9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5Tb3VyY2UgTmFtZTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj57e3NlbGVjdGVkSW5jb21pbmdDYWxsPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/LnNvdXJjZU5hbWUgfHwgJy0nfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hY3Rpb24tYnRucyBtdC0wXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlY2VpdmUtYnRuXCIgKm5nSWY9XCIhc2VsZWN0ZWRJbmNvbWluZ0NhbGw/LmlzQ2FsbENvbm5lY3RlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwiYWNjZXB0Q2FsbEZyb21MaXN0KHNlbGVjdGVkSW5jb21pbmdDYWxsKVwiPiBjYWxsIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gbXV0ZS1idG5cIiAqbmdJZj1cInNlbGVjdGVkSW5jb21pbmdDYWxsPy5pc0NhbGxDb25uZWN0ZWRcIiAgKGNsaWNrKT1cInRvZ2dsZU11dGUoc2VsZWN0ZWRJbmNvbWluZ0NhbGwpXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtbXV0ZSc6IGlzTXV0ZX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJpc011dGVcIj4gbWljX29mZiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiIWlzTXV0ZVwiPiBtaWMgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYnRuLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBzdGFydC1zdG9wXCIgKm5nSWY9XCJzZWxlY3RlZEluY29taW5nQ2FsbD8uaXNDYWxsQ29ubmVjdGVkICYmICFpc1JlY29yZGluZ1wiIFtuZ0NsYXNzXT1cInsncmVjb3JkaW5nJzogaXNSZWNvcmRpbmcsICdzdG9wcGVkJzogIWlzUmVjb3JkaW5nfVwiIChjbGljayk9XCJ0b2dnbGVSZWNvcmRpbmcoJycpXCIgW3RpdGxlXT1cImlzUmVjb3JkaW5nID8gJ1N0b3AgUmVjb3JkaW5nJyA6ICdTdGFydCBSZWNvcmRpbmcnXCIgW2Rpc2FibGVkXT1cImRpc2JhbGVFbmRDYWxsQnRuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlY29yZGluZy1pY29uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gICBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhdXNlLXJlc3VtZS1idG5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cInNlbGVjdGVkSW5jb21pbmdDYWxsPy5pc0NhbGxDb25uZWN0ZWQgJiYgaXNSZWNvcmRpbmcgJiYgIWlzUGF1c2VkXCIgKGNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGF1c2UgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cInNlbGVjdGVkSW5jb21pbmdDYWxsPy5pc0NhbGxDb25uZWN0ZWQgJiYgaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKCcnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwbGF5X2Fycm93IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gcmVqZWN0LWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwicmVqZWN0Q2FsbEZyb21MaXN0KHNlbGVjdGVkSW5jb21pbmdDYWxsKVwiPiBjYWxsX2VuZCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJ3YXZlLWNvbnRhaW5lclwiPlxuICAgICAgICA8c3ZnIGNsYXNzPVwid2F2ZXNcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDI0IDE1MCAyOFwiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJub25lXCIgc2hhcGUtcmVuZGVyaW5nPVwiYXV0b1wiIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiAnNzU2cHgnfVwiPlxuICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgPHBhdGggaWQ9XCJnZW50bGUtd2F2ZVwiIGQ9XCJNLTE2MCA0NGMzMCAwIDU4LTE4IDg4LTE4cyA1OCAxOCA4OCAxOCA1OC0xOCA4OC0xOCA1OCAxOCA4OCAxOCB2NDRoLTM1MnpcIiAvPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgPGcgY2xhc3M9XCJwYXJhbGxheFwiPlxuICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCIwXCIgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC43KVwiIC8+XG4gICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjNcIiBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjUpXCIgLz4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiN1wiIGZpbGw9XCIjZmZmXCIgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
319
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jb21pbmctY2FsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2luY29taW5nLWNhbGwvaW5jb21pbmctY2FsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2luY29taW5nLWNhbGwvaW5jb21pbmctY2FsbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBSXhILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRSxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFFLFFBQVEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7Ozs7OztBQVE5QyxNQUFNLE9BQU8scUJBQXFCO0lBdUI5QixZQUNZLGdCQUFrQyxFQUNsQyxhQUE0QixFQUM1QixtQkFBd0M7UUFGeEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBdEIzQyx5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFDL0Msc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBQ2xDLHlCQUFvQixHQUFRLEVBQUUsQ0FBQztRQUcvQixpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUd6QixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0IsYUFBUSxHQUFZLEtBQUssQ0FB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QVEsQ0FBQyxFQUFFO1lBQy9FLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDckQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGtCQUFrQjtRQUNoQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7WUFDeEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFRLG9DQUFvQztTQUNoRjtJQUNILENBQUM7O21IQWpVSSxxQkFBcUI7dUdBQXJCLHFCQUFxQiw0WENmbEMsbW5aQStMTTs0RkRoTE8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQjtxS0FLbEIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFjSSxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLHdCQUF3QjtzQkFBakMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FsbCwgRGV2aWNlIH0gZnJvbSAnQHR3aWxpby92b2ljZS1zZGsnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvZXh0ZW5zaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHdpbGlvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvdHdpbGlvLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2xvYmFsQ29uc3RhbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZ2xvYmFsLWNvbnN0YW50JztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL05vdGlmaWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCBzd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcbmltcG9ydCB7IGludGVydmFsLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItaW5jb21pbmctY2FsbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbmNvbWluZy1jYWxsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW5jb21pbmctY2FsbC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSW5jb21pbmdDYWxsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASW5wdXQoKSBpbmNvbWluZ0NhbGxEYXRhOiBhbnk7XG4gICAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsc0xpc3Q6IGFueTtcbiAgICBASW5wdXQoKSBkZXZpY2VJZDogYW55O1xuICAgIEBJbnB1dCgpIGlzQ29uY3VycmVudEluY29taW5nOiBib29sZWFuID0gZmFsc2U7XG4gICAgc2hvd1JpbmdBbmltYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICAgIHNlbGVjdGVkSW5jb21pbmdDYWxsOiBhbnkgPSB7fTtcbiAgICB0d2lsaW9DYWxsRGF0YT86IENhbGw7XG4gICAgdHdpbGlvQXV0aElkPzogc3RyaW5nO1xuICAgIGRlZGljYXRlZE51bTpzdHJpbmcgPSAnJztcbiAgICBDYWxsU2lkOiBhbnk7XG4gICAgcmVjb3JkQ2FsbD86IGJvb2xlYW47XG4gICAgc2hvdWxkUmVjb3JkQ2FsbDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGlzQ2xpY2tFeHBhbmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpc1JlY29yZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGlzUGF1c2VkOiBib29sZWFuID0gZmFsc2U7XG4gICAgaXNUd2lsaW9Db25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKSBjbG9zZUluY29taW5nQ2FsbERpdjogRXZlbnRFbWl0dGVyPHsgc2hvdzogbnVtYmVyLCBjYWxsOiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgc2hvdzogbnVtYmVyLCBjYWxsOiBhbnkgfT4oKTtcbiAgICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsc05ld0xpc3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIHNlbGVjdGVkSW5jb21pbmdDYWxsSW5mbzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBpc011dGU/OiBib29sZWFuO1xuICAgIFxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGV4dGVuc2lvblNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdHdpbGlvU2VydmljZTogVHdpbGlvU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJpdmNlOiBOb3RpZmljYXRpb25TZXJ2aWNlXG4gICAgKSB7IFxuICAgICAgICBjb25zb2xlLmxvZygnSW5jb21pbmdDYWxsQ29tcG9uZW50JylcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcblxuXG4gICAgICAvLyB0aGlzLnR3aWxpb1NlcnZpY2UuY3VycmVudENhbGwuc3Vic2NyaWJlKChjYWxsOiBhbnkpID0+IHtcbiAgICAgIC8vICAgaWYgKGNhbGwpIHtcbiAgICAgIC8vICAgICB0aGlzLnR3aWxpb0NhbGxEYXRhID0gY2FsbDtcbiAgICAgIC8vICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcml2Y2Uuc2hvd05vdGlmaWNhdGlvbihjYWxsKTtcbiAgICAgIC8vICAgICAvLyBIYW5kbGUgdGhlIGNhbGwgVUlcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdJbmNvbWluZ0NhbGxDb21wb25lbnQgbmdPbkluaXQnKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmN1cnJlbnRDYWxsLnN1YnNjcmliZShjYWxsID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnR3aWxpb0NhbGxEYXRhID0gY2FsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50d2lsaW9BdXRoSWQgPSBjYWxsLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCd0d2lsaW9BdXRoSWQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwucGFyYW1ldGVycyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kSVBmb3JJbmNvbWluZ0NhbGwodGhpcy50d2lsaW9BdXRoSWQsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbC5vbignY2FuY2VsJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5jb21pbmdDYWxsRGF0YSAmJiB0aGlzLmluY29taW5nQ2FsbERhdGEucGFyYW1ldGVycyAmJiB0aGlzLmluY29taW5nQ2FsbERhdGEucGFyYW1ldGVycy5DYWxsU2lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0ucGFyYW1ldGVycyAmJiBpdGVtLnBhcmFtZXRlcnMuQ2FsbFNpZCAhPT0gdGhpcy5pbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMuQ2FsbFNpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlamVjdENhbGxGcm9tTGlzdChjYWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FsbC5vbignZGlzY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluY29taW5nQ2FsbERhdGEgJiYgdGhpcy5pbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMgJiYgdGhpcy5pbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMuQ2FsbFNpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcmFtZXRlcnMgJiYgaXRlbS5wYXJhbWV0ZXJzLkNhbGxTaWQgIT09IHRoaXMuaW5jb21pbmdDYWxsRGF0YS5wYXJhbWV0ZXJzLkNhbGxTaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWplY3RDYWxsRnJvbUxpc3QoY2FsbCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFjY2VwdENhbGxGcm9tTGlzdChkYXRhPzogYW55KSB7XG4gICAgICAgIGlmICghZGF0YSkgeyByZXR1cm47IH1cbiAgICAgICAgLy8gRGlzY29ubmVjdCBhbnkgb3RoZXIgY29ubmVjdGVkIGNhbGwgYmVmb3JlIGFjY2VwdGluZyB0aGlzIG9uZVxuICAgICAgICBpZiAodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCAmJiB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJDb25uZWN0ZWQgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pc0NhbGxDb25uZWN0ZWQgJiYgaXRlbSAhPT0gZGF0YSk7XG4gICAgICAgICAgICBpZiAob3RoZXJDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkgeyBvdGhlckNvbm5lY3RlZC5kaXNjb25uZWN0KCk7IH0gY2F0Y2gge31cbiAgICAgICAgICAgICAgICBvdGhlckNvbm5lY3RlZC5pc0NhbGxDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBvdGhlckNvbm5lY3RlZC5pc0ZpcnN0Q2FsbCA9IGZhbHNlOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFjY2VwdCB0aGlzIGNhbGwgYW5kIG1hcmsgYXMgdGhlIGFjdGl2ZSBvbmVcbiAgICAgICAgZGF0YS5hY2NlcHQoKTtcbiAgICAgICAgZGF0YS5pc0NhbGxDb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICBkYXRhLmlzRmlyc3RDYWxsID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2Uuc2V0Q2FsbFNpZCh0aGlzLkNhbGxTaWQsIHRoaXMucmVjb3JkQ2FsbCk7XG4gICAgICAgIHRoaXMuc2VuZElQZm9ySW5jb21pbmdDYWxsKGRhdGEuY3VzdG9tUGFyYW1ldGVycy5nZXQoJ3R3aWxpb0F1dGhJZCcpLCAnYW5zd2VyZWQnKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VJbmNvbWluZ0NhbGxXcmFwcGVyKDEpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVqZWN0Q2FsbEZyb21MaXN0KGRhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBpZiAoZGF0YS5yZWplY3QpIGRhdGEucmVqZWN0KCk7XG4gICAgICAgIGlmIChkYXRhLmRpc2Nvbm5lY3QpIGRhdGEuZGlzY29ubmVjdCgpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGRhdGEucGFyYW1ldGVycykge1xuICAgICAgICAgICAgZGF0YS5wYXJhbWV0ZXJzWydpc0NhbGxDb25uZWN0ZWQnXSA9IGZhbHNlOyAvLyBTaG91bGQgYmUgZmFsc2Ugd2hlbiByZWplY3RpbmdcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLmN1c3RvbVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZElQZm9ySW5jb21pbmdDYWxsKGRhdGEuY3VzdG9tUGFyYW1ldGVycy5nZXQoJ3R3aWxpb0F1dGhJZCcpLCAnYW5zd2VyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgJiYgZGF0YSAmJiBkYXRhLnBhcmFtZXRlcnMgJiYgZGF0YS5wYXJhbWV0ZXJzLkNhbGxTaWQpIHtcbiAgICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcmFtZXRlcnMgJiYgaXRlbS5wYXJhbWV0ZXJzLkNhbGxTaWQgIT09IGRhdGEucGFyYW1ldGVycy5DYWxsU2lkKTtcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc05ld0xpc3QuZW1pdCh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0KTtcbiAgICAgICAgICAgIGlmKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VJbmNvbWluZ0NhbGxEaXYuZW1pdCh7IHNob3c6IDAsIGNhbGw6IGRhdGEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9zZUluY29taW5nQ2FsbFdyYXBwZXIodmFsOiBhbnkpIHtcbiAgICAgICAgdGhpcy5jbG9zZUluY29taW5nQ2FsbERpdi5lbWl0KHsgc2hvdzogdmFsLCBjYWxsOiB0aGlzLnR3aWxpb0NhbGxEYXRhIH0pO1xuICAgIH1cblxuICAgIHRvZ2dsZU11dGUoZGF0YT86IGFueSkge1xuICAgICAgICB0aGlzLmlzTXV0ZSA9ICF0aGlzLmlzTXV0ZTtcbiAgICAgICAgZGF0YS5tdXRlKHRoaXMuaXNNdXRlKTtcbiAgICB9XG5cbiAgICBzZW5kSVBmb3JJbmNvbWluZ0NhbGwocmVjb3JkSWQ6IGFueSwgY2FsbHN0YXR1czogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZW5kSVBmb3JJbmNvbWluZ0NhbGwnKVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldElQRGV0YWlsc0ZvckNhbGwocmVjb3JkSWQsIGNhbGxzdGF0dXMsIHRoaXMuZGV2aWNlSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwOiBhbnkgPSByZXM7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwLmNhbGxBdXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNhbGxTaWQgPSByZXNwLmNhbGxBdXRoLmNhbGxTaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZENhbGwgPSByZXNwLmNhbGxBdXRoLnJlY29yZENhbGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIHJlY29yZENhbGwgZmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3AuY2FsbEF1dGgucmVjb3JkQ2FsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3VsZFJlY29yZENhbGwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG91bGRSZWNvcmRDYWxsID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2FsKFwiRXJyb3JcIiwgXCJNaXNzaW5nIGNhbGwgYXV0aGVudGljYXRpb24gZGV0YWlscy5cIiwgXCJlcnJvclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3dhbChcIkVycm9yXCIsIHJlc3AubWVzc2FnZS5qb2luKFwiPGJyLz5cIiksIFwiZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBzd2FsKFwiRXJyb3JcIiwgR2xvYmFsQ29uc3RhbnQuRXJyb3JNc2c1MDAsIFwiZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvblVzZXJJbmZvQnlDYWxsU2lkKCl7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsICYmIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwudXNlckluZm8pIHtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCA/IE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwpLmxlbmd0aCA/IHRydWUgOiBmYWxzZSA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGNhbGwgaGFzIGRldGFpbGVkIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmb3IgZXhwYW5zaW9uXG4gICAgaGFzRGV0YWlsZWRJbmZvKGNhbGxEYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFjYWxsRGF0YSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgdXNlckluZm8gZXhpc3RzIGFuZCBoYXMgbWVhbmluZ2Z1bCBkYXRhXG4gICAgICAgIGlmIChjYWxsRGF0YS51c2VySW5mbyAmJiBjYWxsRGF0YS51c2VySW5mby5jMmNJbmZvcm1hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgaW5mbyA9IGNhbGxEYXRhLnVzZXJJbmZvLmMyY0luZm9ybWF0aW9uO1xuICAgICAgICAgICAgcmV0dXJuICEhKFxuICAgICAgICAgICAgICAgIGluZm8uc3ViamVjdCAmJiBpbmZvLnN1YmplY3QgIT09ICctJyB8fFxuICAgICAgICAgICAgICAgIGluZm8uZW1haWwgJiYgaW5mby5lbWFpbCAhPT0gJy0nIHx8XG4gICAgICAgICAgICAgICAgaW5mby5tZXNzYWdlICYmIGluZm8ubWVzc2FnZSAhPT0gJy0nIHx8XG4gICAgICAgICAgICAgICAgaW5mby5wb2ludE5hbWUgJiYgaW5mby5wb2ludE5hbWUgIT09ICctJyB8fFxuICAgICAgICAgICAgICAgIGluZm8uc291cmNlTmFtZSAmJiBpbmZvLnNvdXJjZU5hbWUgIT09ICctJyB8fFxuICAgICAgICAgICAgICAgIGluZm8uZXh0ZW5zaW9uICYmIGluZm8uZXh0ZW5zaW9uICE9PSAnLScgfHxcbiAgICAgICAgICAgICAgICBpbmZvLnVybCB8fFxuICAgICAgICAgICAgICAgIGluZm8ubGF0aXR1ZGUgfHxcbiAgICAgICAgICAgICAgICBpbmZvLmxvbmdpdHVkZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICBvbkNsaWNrRXhwYW5kKGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwgPT09IGRhdGEgJiYgdGhpcy5pc0NsaWNrRXhwYW5kKSB7XG4gICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbEluZm8uZW1pdCh7fSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCA9IGRhdGE7XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbFsnaXNDbGlja0V4cGFuZCddID0gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgJiYgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5mb3JFYWNoKChjYWxsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGwgIT09IHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxbJ2lzQ2xpY2tFeHBhbmQnXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGxJbmZvLmVtaXQodGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKCF0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsLnVzZXJJbmZvIHx8IHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwudXNlckluZm8uc3RhdHVzID09IDIwMSl7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24odGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRVc2VySW5mb3JtYXRpb24oaW5jb21pbmdDYWxsRGF0YTogYW55KSB7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5mcm9tRW50cmllcyhBcnJheS5mcm9tKGluY29taW5nQ2FsbERhdGEuY3VzdG9tUGFyYW1ldGVycy5lbnRyaWVzKCkpKTtcbiAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbihkYXRhWyd0d2lsaW9BdXRoSWQnXSkuc3Vic2NyaWJlKFxuICAgICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAgICAgaW5jb21pbmdDYWxsRGF0YVsndXNlckluZm8nXT1yZXNwb25zZVxuICAgICAgICAgIH0sIDUwMDApXG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBmcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgcmV0dXJuIGVudHJpZXMucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgYW55Pik7ICBcbiAgICAgIH1cblxuICAgICAgZGlzYmFsZUVuZENhbGxCdG4gPSBmYWxzZTtcbiAgICAgIGluY29taW5nQ2FsbFNpZCA9ICcnO1xuICAgICAgaW5jb21pbmdSZWNvcmRDYWxsID0gZmFsc2U7XG4gICAgICB0aW1lclN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICAgIHRpbWVFbGFwc2VkID0gMDtcbiAgICAgIHRvZ2dsZVJlY29yZGluZyhzaWQ6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5pc1JlY29yZGluZykge1xuICAgICAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgICBzdGFydFJlY29yZGluZygpIHtcbiAgICAgICAgICBsZXQgc2lkO1xuICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFNpZCgpO1xuICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsU2lkID0gZGV0YWlscy5jYWxsU2lkO1xuICAgICAgICAgIHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsID0gZGV0YWlscy5yZWNvcmRDYWxsO1xuICAgICAgICAgIHNpZCA9IHRoaXMuaW5jb21pbmdDYWxsU2lkID8gdGhpcy5pbmNvbWluZ0NhbGxTaWQgOiB0aGlzLkNhbGxTaWQ7XG4gICAgICBcbiAgICAgICAgICAvLyBpZiAoIXRoaXMuaW5jb21pbmdSZWNvcmRDYWxsICYmICF0aGlzLnJlY29yZENhbGwpIHtcbiAgICAgICAgICAvLyAgIHJldHVybjtcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxSZWNvcmRpbmcoc2lkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1JlY29yZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7ICBcbiAgICAgICAgICAgIC8vIHRoaXMudGltZUVsYXBzZWQgPSAwO1xuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyMSgpO1xuICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN0YXJ0aW5nIHJlY29yZGluZycsIGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzdG9wUmVjb3JkaW5nKCkge1xuICAgICAgICAgIC8vIGlmICghdGhpcy5pbmNvbWluZ1JlY29yZENhbGwgJiYgIXRoaXMucmVjb3JkQ2FsbCkge1xuICAgICAgICAgIC8vICAgcmV0dXJuO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgICB0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhdXNlUmVjb3JkaW5nKCkge1xuICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFNpZCgpO1xuICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsU2lkID0gZGV0YWlscy5jYWxsU2lkO1xuICAgICAgICAgIHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsID0gZGV0YWlscy5yZWNvcmRDYWxsO1xuICAgICAgICAgIGNvbnN0IHNpZCA9IHRoaXMuaW5jb21pbmdDYWxsU2lkID8gdGhpcy5pbmNvbWluZ0NhbGxTaWQgOiB0aGlzLkNhbGxTaWQ7XG4gICAgICBcbiAgICAgICAgICAvLyBpZiAoIXRoaXMuaW5jb21pbmdSZWNvcmRDYWxsICYmICF0aGlzLnJlY29yZENhbGwpIHtcbiAgICAgICAgICAvLyAgIHJldHVybjtcbiAgICAgICAgICAvLyB9XG4gICAgICBcbiAgICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UucGF1c2VPclJlc3VtZVJlY29yZGluZyhzaWQsICdwYXVzZScpLnN1YnNjcmliZShcbiAgICAgICAgICAgIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIC8vICAgdGhpcy5zdG9wUmVjb3JkaW5nVGltZXIoKTtcbiAgICAgICAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXVzaW5nIHJlY29yZGluZzonLCBlcnJvcik7XG4gICAgICAgICAgICAgIC8vIENvbnNpZGVyIHVwZGF0aW5nIHRoZSBVSSB0byBzaG93IHRoZSBlcnJvciBzdGF0ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdW1lUmVjb3JkaW5nKHNpZDogYW55KSB7XG4gICAgICAgIC8vICAgbGV0IHNpZDtcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxTaWQoKTtcbiAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbFNpZCA9IGRldGFpbHMuY2FsbFNpZDtcbiAgICAgICAgICB0aGlzLmluY29taW5nUmVjb3JkQ2FsbCA9IGRldGFpbHMucmVjb3JkQ2FsbDtcbiAgICAgICAgICBzaWQgPSB0aGlzLmluY29taW5nQ2FsbFNpZCA/IHRoaXMuaW5jb21pbmdDYWxsU2lkIDogdGhpcy5DYWxsU2lkO1xuICAgICAgXG4gICAgICAgICAgLy8gaWYgKCF0aGlzLmluY29taW5nUmVjb3JkQ2FsbCAmJiAhdGhpcy5yZWNvcmRDYWxsKSB7XG4gICAgICAgICAgLy8gICByZXR1cm47IC8vIFNraXAgaWYgcmVjb3JkaW5nIGlzIG5vdCBlbmFibGVkXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5wYXVzZU9yUmVzdW1lUmVjb3JkaW5nKHNpZCwgJ3Jlc3VtZScpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VGltZXIxKCk7XG4gICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVzdW1pbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0VGltZXIxKCkge1xuICAgICAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSBpbnRlcnZhbCgxMDAwKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50aW1lRWxhcHNlZCsrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0b3BSZWNvcmRpbmdUaW1lcigpIHtcbiAgICAgICAgICBpZiAodGhpcy50aW1lclN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOyAvLyBQYXVzZSB0aGUgdGltZXJcbiAgICAgICAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7ICAgICAgICAvLyBPcHRpb25hbGx5IHJlc2V0IHRoZSBzdWJzY3JpcHRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH1cbn0iLCI8IS0tIENvbXBhY3QgaW5jb21pbmcgYmFubmVyIGZvciBzaW5nbGUgaW5jb21pbmcgY2FsbCAtLT5cbjxkaXYgY2xhc3M9XCJpbmNvbWluZy1iYW5uZXItd3JhcHBlclwiICpuZ0lmPVwibmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCA9PT0gMSAmJiAhaXNDb25jdXJyZW50SW5jb21pbmdcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5jb21pbmctYmFubmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1iYW5uZXItY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluY29taW5nLWluZm9cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluY29taW5nLWxhYmVsXCI+SW5jb21pbmcgY2FsbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5jb21pbmctY2FsbGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FsbGVyLW5hbWVcIj57e25ld0luY29taW5nQ2FsbHNMaXN0WzBdPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/Lm5hbWUgfHwgaW5jb21pbmdDYWxsRGF0YT8ubmFtZSB8fCAnLSd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYWxsZXItbnVtYmVyXCI+e3tuZXdJbmNvbWluZ0NhbGxzTGlzdFswXT8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5udW1iZXIgfHwgbmV3SW5jb21pbmdDYWxsc0xpc3RbMF0/LnBhcmFtZXRlcnM/LkZyb20gfHwgaW5jb21pbmdDYWxsRGF0YT8uZGlzcGxheU51bSB8fCBpbmNvbWluZ0NhbGxEYXRhPy5waG9uZSB8fCAnJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5jb21pbmctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJiYW5uZXItYnRuIGFjY2VwdC1idG5cIiAoY2xpY2spPVwiYWNjZXB0Q2FsbEZyb21MaXN0KG5ld0luY29taW5nQ2FsbHNMaXN0WzBdKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5jYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJiYW5uZXItYnRuIHJlamVjdC1idG5cIiAoY2xpY2spPVwicmVqZWN0Q2FsbEZyb21MaXN0KG5ld0luY29taW5nQ2FsbHNMaXN0WzBdKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5jYWxsX2VuZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIExpc3QgdmlldyBmb3IgbXVsdGlwbGUgaW5jb21pbmcgY2FsbHMgLS0+XG48ZGl2IGNsYXNzPVwiY2FsbC1jb250YWluZXJcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBsZWZ0OiAxMTZweDtcIiAqbmdJZj1cIm5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGggPiAxXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbGxvcHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBjb250YWluZXItZmx1aWRcIiA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxUb051bVwiPkluY29taW5nIGNhbGwgPGJyLz48c3Bhbj57e2RlZGljYXRlZE51bX19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRhdGEgb2YgbmV3SW5jb21pbmdDYWxsc0xpc3RcIj4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtMiBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWluZm8td3JhcHBlciB3LTEwMCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZy13cmFwcGVyXCIgW3NyY109XCJkYXRhPy5pbWdcIiBhbHQ9XCJcIiB3aWR0aD1cIjQ1XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHctMTAwIGFsaWduLWl0ZW1zLWNlbnRlciBtci0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsZXJEZXRhaWxzLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImJyZWFrLXdvcmRcIj57e2RhdGE/LnVzZXJJbmZvPy5jMmNJbmZvcm1hdGlvbj8ubmFtZSB8fCAnLSd9fTwvaDU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImJyZWFrLXdvcmRcIj57e2RhdGE/LnVzZXJJbmZvPy5kaXNwbGF5TnVtID8gZGF0YT8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5udW1iZXIgOiBkYXRhPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/Lm51bWJlciB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0bi13cmFwcGVyIHJlY2VpdmUtYnRuXCIgKm5nSWY9XCIhZGF0YT8uaXNDYWxsQ29ubmVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cImFjY2VwdENhbGxGcm9tTGlzdChkYXRhKVwiPiBjYWxsIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuLXdyYXBwZXIgbXV0ZS1idG5cIiAqbmdJZj1cImRhdGE/LmlzQ2FsbENvbm5lY3RlZFwiICAoY2xpY2spPVwidG9nZ2xlTXV0ZShkYXRhKVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlLW11dGUnOiBpc011dGV9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJpc011dGVcIj4gbWljX29mZiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhaXNNdXRlXCI+IG1pYzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1idG4tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gc3RhcnQtc3RvcFwiICpuZ0lmPVwiZGF0YT8uaXNDYWxsQ29ubmVjdGVkICYmICFpc1JlY29yZGluZ1wiIFtuZ0NsYXNzXT1cInsncmVjb3JkaW5nJzogaXNSZWNvcmRpbmcsICdzdG9wcGVkJzogIWlzUmVjb3JkaW5nfVwiIChjbGljayk9XCJ0b2dnbGVSZWNvcmRpbmcoJycpXCIgW3RpdGxlXT1cImlzUmVjb3JkaW5nID8gJ1N0b3AgUmVjb3JkaW5nJyA6ICdTdGFydCBSZWNvcmRpbmcnXCIgW2Rpc2FibGVkXT1cImRpc2JhbGVFbmRDYWxsQnRuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVjb3JkaW5nLWljb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+ICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImRhdGE/LmlzQ2FsbENvbm5lY3RlZCAmJiBpc1JlY29yZGluZyAmJiAhaXNQYXVzZWRcIiAoY2xpY2spPVwicGF1c2VSZWNvcmRpbmcoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBhdXNlIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiZGF0YT8uaXNDYWxsQ29ubmVjdGVkICYmIGlzUGF1c2VkXCIgKGNsaWNrKT1cInJlc3VtZVJlY29yZGluZygnJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwbGF5X2Fycm93IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0bi13cmFwcGVyIHJlamVjdC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwicmVqZWN0Q2FsbEZyb21MaXN0KGRhdGEpXCI+IGNhbGxfZW5kIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZWFycm93LWFycm93IG1lLTJcIiBpZD1cInRvZ2dsZWFycm93XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYXNEZXRhaWxlZEluZm8oZGF0YSkgPyBvbkNsaWNrRXhwYW5kKGRhdGEpIDogbnVsbFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJzogIWhhc0RldGFpbGVkSW5mbyhkYXRhKX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaGFzRGV0YWlsZWRJbmZvKGRhdGEpID8gJ1ZpZXcgZGV0YWlscycgOiAnTm8gZGV0YWlscyBhdmFpbGFibGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtY29udGFpbmVyIHAtMyB0ZXh0LXdoaXRlIG1vZGVsLWNvbnRlbnRcIiAqbmdJZj1cImlzQ2xpY2tFeHBhbmQgXCI+ICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYW5pbWF0aW9uXCIgW25nQ2xhc3NdPVwieydjYWxsLWFuaW1hdGlvbi1wbGF5Jzogc2hvd1JpbmdBbmltYXRpb259XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiIFtzcmNdPVwiaW5jb21pbmdDYWxsRGF0YS5pbWdcIiBhbHQ9XCJcIiB3aWR0aD1cIjEwMFwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtd2hpdGVcIj57e3NlbGVjdGVkSW5jb21pbmdDYWxsPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/Lm5hbWUgfHwgJy0nfX08L2gzPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImYtMTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+U3ViamVjdDo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+e3tzZWxlY3RlZEluY29taW5nQ2FsbD8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5zdWJqZWN0IHx8ICctJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgXG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTJcIj5FbWFpbDo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tzZWxlY3RlZEluY29taW5nQ2FsbD8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5lbWFpbCB8fCAnLSd9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5OdW1iZXI6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj57e3NlbGVjdGVkSW5jb21pbmdDYWxsPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/Lm51bWJlcn19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5MYW5ndWFnZTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTJcIj57e3NlbGVjdGVkSW5jb21pbmdDYWxsPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/Lmxhbmd1YWdlIHx8ICctJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5FeHRlbnNpb246PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+e3tzZWxlY3RlZEluY29taW5nQ2FsbD8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5leHRlbnNpb24gfHwgJy0nfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+SW1hZ2U6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbGxpcHNpc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEluY29taW5nQ2FsbD8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5pbWFnZSAmJiBzZWxlY3RlZEluY29taW5nQ2FsbD8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5pbWFnZSAhPT0gJy0nOyBlbHNlIG5vSW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJ7e3NlbGVjdGVkSW5jb21pbmdDYWxsPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/LmltYWdlfX1cIiBhbHQ9XCJcIiB3aWR0aD1cIjQyXCIgaGVpZ2h0PVwiNDJcIiBjbGFzcz1cIm1sLTJcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ltYWdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTJcIj5ObyBJbWFnZSBBdmFpbGFibGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gIFxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIG1iLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5NZXNzYWdlOjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbGxpcHNpc1wiPnt7c2VsZWN0ZWRJbmNvbWluZ0NhbGw/LnVzZXJJbmZvPy5jMmNJbmZvcm1hdGlvbj8ubWVzc2FnZSB8fCAnLSd9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlBvaW50IE5hbWU6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tzZWxlY3RlZEluY29taW5nQ2FsbD8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5wb2ludE5hbWUgfHwgJy0nfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+U291cmNlIE5hbWU6PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tzZWxlY3RlZEluY29taW5nQ2FsbD8udXNlckluZm8/LmMyY0luZm9ybWF0aW9uPy5zb3VyY2VOYW1lIHx8ICctJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYWN0aW9uLWJ0bnMgbXQtMFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0biByZWNlaXZlLWJ0blwiICpuZ0lmPVwiIXNlbGVjdGVkSW5jb21pbmdDYWxsPy5pc0NhbGxDb25uZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cImFjY2VwdENhbGxGcm9tTGlzdChzZWxlY3RlZEluY29taW5nQ2FsbClcIj4gY2FsbCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIG11dGUtYnRuXCIgKm5nSWY9XCJzZWxlY3RlZEluY29taW5nQ2FsbD8uaXNDYWxsQ29ubmVjdGVkXCIgIChjbGljayk9XCJ0b2dnbGVNdXRlKHNlbGVjdGVkSW5jb21pbmdDYWxsKVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlLW11dGUnOiBpc011dGV9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFpc011dGVcIj4gbWljIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWJ0bi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gc3RhcnQtc3RvcFwiICpuZ0lmPVwic2VsZWN0ZWRJbmNvbWluZ0NhbGw/LmlzQ2FsbENvbm5lY3RlZCAmJiAhaXNSZWNvcmRpbmdcIiBbbmdDbGFzc109XCJ7J3JlY29yZGluZyc6IGlzUmVjb3JkaW5nLCAnc3RvcHBlZCc6ICFpc1JlY29yZGluZ31cIiAoY2xpY2spPVwidG9nZ2xlUmVjb3JkaW5nKCcnKVwiIFt0aXRsZV09XCJpc1JlY29yZGluZyA/ICdTdG9wIFJlY29yZGluZycgOiAnU3RhcnQgUmVjb3JkaW5nJ1wiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWNvcmRpbmctaWNvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+ICAgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXVzZS1yZXN1bWUtYnRuc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJzZWxlY3RlZEluY29taW5nQ2FsbD8uaXNDYWxsQ29ubmVjdGVkICYmIGlzUmVjb3JkaW5nICYmICFpc1BhdXNlZFwiIChjbGljayk9XCJwYXVzZVJlY29yZGluZygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBhdXNlIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJzZWxlY3RlZEluY29taW5nQ2FsbD8uaXNDYWxsQ29ubmVjdGVkICYmIGlzUGF1c2VkXCIgKGNsaWNrKT1cInJlc3VtZVJlY29yZGluZygnJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGxheV9hcnJvdyA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlamVjdC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cInJlamVjdENhbGxGcm9tTGlzdChzZWxlY3RlZEluY29taW5nQ2FsbClcIj4gY2FsbF9lbmQgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwid2F2ZS1jb250YWluZXJcIj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cIndhdmVzXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAyNCAxNTAgMjhcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHNoYXBlLXJlbmRlcmluZz1cImF1dG9cIiBbbmdTdHlsZV09XCJ7J3dpZHRoJzogJzc1NnB4J31cIj5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgIDxwYXRoIGlkPVwiZ2VudGxlLXdhdmVcIiBkPVwiTS0xNjAgNDRjMzAgMCA1OC0xOCA4OC0xOHMgNTggMTggODggMTggNTgtMTggODgtMTggNTggMTggODggMTggdjQ0aC0zNTJ6XCIgLz5cbiAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgIDxnIGNsYXNzPVwicGFyYWxsYXhcIj5cbiAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiMFwiIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNylcIiAvPlxuICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCIzXCIgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC41KVwiIC8+ICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjdcIiBmaWxsPVwiI2ZmZlwiIC8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19