UNPKG

vega-footer-logo

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.1.5.

284 lines (276 loc) 35.9 kB
import { Injectable, Component, Input, NgModule } from '@angular/core'; import { Http, Headers, RequestOptions, HttpModule } from '@angular/http'; import { map } from 'rxjs/operators'; import { AES, enc } from 'crypto-js'; import { Router, ActivatedRoute, RouterModule } from '@angular/router'; import { BrowserModule } from '@angular/platform-browser'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class ResultMessage { } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** @type {?} */ const gnPostAlertAcknowledgement = "Notify/PostAlertAcknowledgement"; /** @type {?} */ const gnPostResetAllAlerts = "Notify/PostResetAllAlerts"; class NotificationServices { /** * @param {?} http */ constructor(http) { this.http = http; this.userTO = {}; this.resultMessage = new ResultMessage; } /** * @return {?} */ getUserTOFromLocalStorage() { /** @type {?} */ let userTo = {}; userTo = JSON.parse(this.decryption(localStorage.getItem("currentUser"))); return userTo; } /** * @param {?} Url * @return {?} */ getAlertForNotify(Url) { debugger; if (this.userTO == null && this.userTO == undefined) { return; } this.getAllActiveNotification(this.userTO, Url).subscribe(res => { /** @type {?} */ var v = res.filter(p => p.IsAcknowledged == 0).length; if (document.getElementById("bgNotification") != null) { document.getElementById("bgNotification").innerText = v == 0 ? '' : v.toString(); } }, err => { }); } /** * @param {?} UserTo * @param {?} masterBaseUrl * @return {?} */ getAllActiveNotification(UserTo, masterBaseUrl) { /** @type {?} */ let keys = masterBaseUrl + "Notify/GetAllActiveAlertList?userId=1&roleId=1"; return this.http .get(keys).pipe(map((response) => response.json())); } /** * @param {?} notificationTo * @param {?} loginId * @param {?} URL * @return {?} */ postAlertAcknowledgement(notificationTo, loginId, URL) { /** @type {?} */ var params = { alertUsersTO: notificationTo, loginUserId: loginId }; /** @type {?} */ let bodyString = JSON.stringify(params); /** @type {?} */ let headers = new Headers({ 'Content-Type': 'application/json' }); /** @type {?} */ let options = new RequestOptions({ headers: headers }); return this.http.post(URL + gnPostAlertAcknowledgement, bodyString, options); } /** * @param {?} userTo * @param {?} URL * @return {?} */ postAllAlertAcknowledgement(userTo, URL) { /** @type {?} */ var params = { loginUserId: userTo.IdUser, roleId: userTo.UserRoleList[0].RoleId }; /** @type {?} */ let bodyString = JSON.stringify(params); /** @type {?} */ let headers = new Headers({ 'Content-Type': 'application/json' }); /** @type {?} */ let options = new RequestOptions({ headers: headers }); return this.http.post(URL + gnPostResetAllAlerts, bodyString, options); } /** * @param {?} data * @return {?} */ encryption(data) { data = JSON.stringify(data); /** @type {?} */ var ciphertext = AES.encrypt(data.toString(), "secret key 123"); return ciphertext.toString(); } /** * @param {?} data * @return {?} */ decryption(data) { // Decrypt if (data) { /** @type {?} */ var bytes = AES.decrypt(data, "secret key 123"); /** @type {?} */ var plaintext = bytes.toString(enc.Utf8); return plaintext; } return null; } } NotificationServices.decorators = [ { type: Injectable } ]; /** @nocollapse */ NotificationServices.ctorParameters = () => [ { type: Http } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class NotificationComponent { /** * @param {?} comman * @param {?} router * @param {?} route */ constructor(comman, router, route) { this.comman = comman; this.router = router; this.userTO = {}; this.resultMessage = new ResultMessage; this.notificationList = []; this.userTO = this.comman.getUserTOFromLocalStorage(); } /** * @return {?} */ ngOnInit() { this.comman.getAlertForNotify(this.URL); this.getNotificationListByUser(); } /** * @return {?} */ getNotificationListByUser() { this.notificationList = []; this.comman.getAllActiveNotification(this.userTO, this.URL).subscribe(notificationRes => { this.notificationList = notificationRes; }, err => { console.log('Err : ' + err); }); } /** * @param {?} alertMessageTo * @param {?=} isReset * @return {?} */ markAsReadToNotification(alertMessageTo, isReset = false) { debugger; if (alertMessageTo.IsAcknowledged != 0 && !isReset) { return; } if (isReset) { alertMessageTo.IsReseted = 1; } this.comman.postAlertAcknowledgement(alertMessageTo, this.userTO.IdUser, this.URL).subscribe(vRes => { debugger; // if (this.resultMessage.MessageType == 1 && this.resultMessage.Result == 1) { this.comman.getAlertForNotify(this.URL); this.getNotificationListByUser(); //} }, err => { console.log("Error Msg : " + err); }); } /** * @param {?} isAcknowelded * @return {?} */ getValidationColor(isAcknowelded) { return isAcknowelded == 0 ? 'bold' : 'normal'; } /** * @return {?} */ resetAllNotification() { //this.ss.showLoader(); this.comman.postAllAlertAcknowledgement(this.userTO, this.URL).subscribe(vRes => { //this.resultMessage = vRes; if (this.resultMessage.MessageType == 1 && this.resultMessage.Result == 1) { this.comman.getAlertForNotify(this.URL); this.notificationList = []; } }, err => { console.log("Error Msg : " + err); }); } /** * @param {?} alertMessageTo * @return {?} */ redirectFun(alertMessageTo) { if (alertMessageTo.NavigationUrl != null || alertMessageTo.NavigationUrl != "") { this.router.navigate(['/' + alertMessageTo.NavigationUrl]); } } } NotificationComponent.decorators = [ { type: Component, args: [{ selector: 'notification', template: "\r\n<div class=\"col-lg-12\" style=\"margin-top: 20px\">\r\n<div class=\"panel panel-default top10 \">\r\n <div class=\"panel-heading\" style=\"color: red\">\r\n All Notification\r\n </div>\r\n <div class=\"panel-body\">\r\n <div class=\"row col-lg-12 top10\" *ngIf=\" notificationList?.length == 0 || notificationList == null\">\r\n <div class=\" alert-success\">\r\n <strong class=\"col-sm-2\">Information: </strong>\r\n <label class=\"control-label-left col-sm-10 fontweight\">All Message caught up !</label>\r\n </div>\r\n </div>\r\n <div class=\"row\" *ngIf=\"notificationList?.length > 0\">\r\n <div class=\"col-lg-12 \">\r\n <div class=\"table-responsive \">\r\n <table class=\"table table-bordered table-hover\">\r\n <thead>\r\n <tr class=\"bg-info\">\r\n <th>Raised By</th>\r\n <th>Alert Message</th>\r\n <th>Raised On</th>\r\n <!--<th>Action</th>-->\r\n <th>\r\n <i class=\"fa fa-trash btn-custom-icon\" style=\"width:25px; height:20px;margin-right: 3px;\" aria-hidden=\"true\" (click)=\"resetAllNotification()\"> \r\n </i> Delete All\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <!-- redirectFun(notificationTo)\" -->\r\n <tr style=\"cursor: pointer\" *ngFor=\" let notificationTo of notificationList \" [style.font-weight]=\"getValidationColor(notificationTo.IsAcknowledged)\">\r\n <td (click)=\"markAsReadToNotification(notificationTo)\">{{notificationTo.RaisedByUserName}}</td>\r\n <td (click)=\"markAsReadToNotification(notificationTo)\">{{notificationTo.AlertComment}}</td>\r\n <td (click)=\"markAsReadToNotification(notificationTo)\">{{notificationTo.RaisedOnStr}}</td>\r\n <td>\r\n <p style=\"width: 50px;margin: 0px\">\r\n <i class=\"fa fa-trash btn-custom-icon\" style=\"width:20px; height:20px;margin-right: 3px;\" aria-hidden=\"true\" (click)=\"markAsReadToNotification(notificationTo, true)\"></i>\r\n </p>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n</div>" }] } ]; /** @nocollapse */ NotificationComponent.ctorParameters = () => [ { type: NotificationServices }, { type: Router }, { type: ActivatedRoute } ]; NotificationComponent.propDecorators = { URL: [{ type: Input }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** @type {?} */ const appRoutes = [ { path: '', component: NotificationComponent } ]; class NotifyModule { } NotifyModule.decorators = [ { type: NgModule, args: [{ declarations: [ NotificationComponent ], imports: [ BrowserModule, HttpModule, RouterModule.forRoot(appRoutes) ], providers: [NotificationServices], exports: [NotificationComponent] },] } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ export { NotifyModule, NotificationComponent as ɵa, NotificationServices as ɵb }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVnYS1mb290ZXItbG9nby5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vdmVnYS1mb290ZXItbG9nby9hcHAvbm90aWZpY2F0aW9uL21vZGVsL25vdGlmaWNhdGlvblRPLnRzIiwibmc6Ly92ZWdhLWZvb3Rlci1sb2dvL2FwcC9ub3RpZmljYXRpb24vc2VydmljZXMvbm90aWZpY2F0aW9uX3NlcnZpY2VzLnRzIiwibmc6Ly92ZWdhLWZvb3Rlci1sb2dvL2FwcC9ub3RpZmljYXRpb24vY29tcG9uZW50L25vdGlmaWNhdGlvbl9jb21wb25lbnRzLnRzIiwibmc6Ly92ZWdhLWZvb3Rlci1sb2dvL2FwcC9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uX21vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJcclxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblRPIHtcclxuICAgIHB1YmxpYyBJZEFsZXJ0VXNlcj86IG51bWJlclxyXG4gICAgcHVibGljIEFsZXJ0SW5zdGFuY2VJZD86IG51bWJlclxyXG4gICAgcHVibGljIFVzZXJJZD86IG51bWJlclxyXG4gICAgcHVibGljIFJvbGVJZD86IG51bWJlclxyXG4gICAgcHVibGljIFJhaXNlZEJ5VXNlck5hbWU/OiBzdHJpbmdcclxuICAgIHB1YmxpYyBBbGVydENvbW1lbnQ/OiBzdHJpbmdcclxuICAgIHB1YmxpYyBSYWlzZWRPblN0cj86IHN0cmluZ1xyXG4gICAgcHVibGljIFJhaXNlZE9uPzogRGF0ZVxyXG4gICAgcHVibGljIElzQWNrbm93bGVkZ2VkPzogbnVtYmVyXHJcbiAgICBwdWJsaWMgSXNSZXNldGVkPzogbnVtYmVyXHJcbiAgICBwdWJsaWMgTmF2aWdhdGlvblVybD86IHN0cmluZ1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJUTyB7XHJcbiAgICBwdWJsaWMgVXNlckxvZ2luPzogc3RyaW5nXHJcbiAgICBwdWJsaWMgSWRVc2VyPzogbnVtYmVyXHJcbiAgICBwdWJsaWMgVXNlclBhc3N3ZD86IHN0cmluZ1xyXG4gICAgcHVibGljIFVzZXJEaXNwbGF5TmFtZT86IHN0cmluZ1xyXG4gICAgcHVibGljIFJlZ2lzdGVyZWREZXZpY2VJZD86IG51bWJlclxyXG4gICAgcHVibGljIERlYWN0aXZhdGVkT24/OiBudW1iZXJcclxuICAgIHB1YmxpYyBEZWFjdGl2YXRlZEJ5PzogbnVtYmVyXHJcbiAgICBwdWJsaWMgSW1laU51bWJlcj86IG51bWJlclxyXG4gICAgLy8gcHVibGljIFRva2VuPyA6IHN0cmluZ1xyXG4gICAgcHVibGljIElzQWN0aXZlPzogbnVtYmVyXHJcbiAgICBwdWJsaWMgQ3JlYXRlZEJ5Pzogc3RyaW5nXHJcbiAgICBwdWJsaWMgQ3JlYXRlZE9uPzogc3RyaW5nXHJcbiAgICBwdWJsaWMgVXBkYXRlZEJ5Pzogc3RyaW5nXHJcbiAgICBwdWJsaWMgVXBkYXRlZE9uPzogc3RyaW5nXHJcbiAgICBwdWJsaWMgdXNlcm5hbWU/OiBzdHJpbmdcclxuICAgIHB1YmxpYyBwYXNzd29yZD86IHN0cmluZ1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFJlc3VsdE1lc3NhZ2Uge1xyXG4gICAgcHVibGljIEV4Y2VwdGlvbj86IEVycm9yXHJcbiAgICBwdWJsaWMgVGFnPzogT2JqZWN0XHJcbiAgICBwdWJsaWMgTWVzc2FnZVR5cGU/OiBhbnlcclxuICAgIHB1YmxpYyBUZXh0Pzogc3RyaW5nXHJcbiAgICBwdWJsaWMgUmVzdWx0PzogbnVtYmVyXHJcbiAgICBwdWJsaWMgRGlzcGxheU1lc3NhZ2U/OiBzdHJpbmdcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgQ29tbWFvblVzZXJUT3tcclxuICAgIHB1YmxpYyBVc2VyTG9naW4/IDogc3RyaW5nXHJcbiAgICBwdWJsaWMgSWRVc2VyPyA6IG51bWJlclxyXG4gICAgcHVibGljIElzQWN0aXZlPyA6IG51bWJlclxyXG4gICAgcHVibGljIFVzZXJQYXNzd2Q/IDogc3RyaW5nXHJcbiAgICBwdWJsaWMgVXNlclJvbGVMaXN0PyA6IFVzZXJSb2xlVE9bXVxyXG4gICAgcHVibGljIExvZ2luVE8/IDogTG9naW5UT1xyXG4gICAgcHVibGljIFBlcnNvbklkPyA6IG51bWJlclxyXG4gICAgcHVibGljIEFkZHJlc3NJZD8gOiBudW1iZXJcclxuICAgIHB1YmxpYyBPcmdhbml6YXRpb25JZD8gOiBudW1iZXJcclxuICAgIHB1YmxpYyBPcmdhbml6YXRpb25OYW1lPyA6IHN0cmluZ1xyXG4gICAgcHVibGljIFVzZXJEaXNwbGF5TmFtZT8gOiBzdHJpbmdcclxuICAgIHB1YmxpYyBNZW51U3RydWN0dXJlVE9MaXN0PyA6IE1lbnVJbmZvcm1hdGlvbltdXHJcbiAgICBwdWJsaWMgU3lzRWxlQWNjZXNzRENUPyA6IHt9XHJcbiAgICBwdWJsaWMgUmVnaXN0ZXJlZERldmljZUlkPyA6IG51bWJlclxyXG4gICAgcHVibGljIElzU3BlY2lhbENuZj8gOiBudW1iZXJcclxuICAgIHB1YmxpYyBVc2VyUGVyc29uVE8/IDogUGVyc29uSW5mbyA9IG5ldyBQZXJzb25JbmZvKCk7XHJcbiAgICBwdWJsaWMgVXNlckV4dFRPPyA6IFVzZXJFeHRUTyBcclxuICAgIHB1YmxpYyBJbWVpTnVtYmVyPyA6IHN0cmluZ1xyXG4gICAgcHVibGljIFJlc3VsdD8gOiBudW1iZXJcclxuICAgIHB1YmxpYyBUYWc/IDogb2JqZWN0XHJcbiAgICBwdWJsaWMgTW9kdWxlVE9MaXN0PzpNb2R1bGVUT1tdO1xyXG5cclxuICAgIFxyXG59XHJcbmV4cG9ydCBjbGFzcyBQZXJzb25JbmZvXHJcbntcclxuICAgICAgIFxyXG4gICAgcHVibGljIElkUGVyc29uPzpudW1iZXI7XHJcbiAgICBwdWJsaWMgU2FsdXRhdGlvbklkPzpudW1iZXI7XHJcbiAgICBwdWJsaWMgU2FsdXRhdGlvbk5hbWU/OnN0cmluZztcclxuICAgIHB1YmxpYyBNb2JpbGVObz86c3RyaW5nOyAgICAgXHJcbiAgICBwdWJsaWMgQWx0ZXJuYXRlTW9iTm8/OnN0cmluZzsgICBcclxuICAgIHB1YmxpYyBQaG9uZU5vPzpzdHJpbmc7ICAgXHJcbiAgICBwdWJsaWMgRGF0ZU9mQmlydGg/OkRhdGU7ICAgXHJcbiAgICBwdWJsaWMgRmlyc3ROYW1lPzpzdHJpbmc7ICAgXHJcbiAgICBwdWJsaWMgTWlkTmFtZT86c3RyaW5nOyAgIFxyXG4gICAgcHVibGljIExhc3ROYW1lPzpzdHJpbmc7ICAgXHJcbiAgICBwdWJsaWMgUHJpbWFyeUVtYWlsPzpzdHJpbmc7ICAgXHJcbiAgICBwdWJsaWMgQWx0ZXJuYXRlRW1haWw/OnN0cmluZzsgICBcclxuICAgIHB1YmxpYyBDb21tZW50cz86c3RyaW5nOyAgIFxyXG4gICAgcHVibGljIFNlcU5vPzpudW1iZXI7ICAgXHJcbiAgICBwdWJsaWMgUGhvdG9CYXNlNjQ/OnN0cmluZztcclxuICAgIHB1YmxpYyBEYXRlT2ZCaXJ0aFN0cj86c3RyaW5nO1xyXG4gICAgcHVibGljIERvYkRheT86bnVtYmVyO1xyXG4gICAgcHVibGljIERvYk1vbnRoPzpudW1iZXI7XHJcbiAgICBwdWJsaWMgRG9iWWVhcj86bnVtYmVyO1xyXG4gICAgcHVibGljIERpc3BsYXlOYW1lPzpzdHJpbmdcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJSb2xlVE97XHJcbiAgICBwdWJsaWMgSWRVc2VyUm9sZT8gOiBzdHJpbmdcclxuICAgIHB1YmxpYyBVc2VySWQ/IDogbnVtYmVyXHJcbiAgICBwdWJsaWMgUm9sZUlkPyA6IG51bWJlclxyXG4gICAgcHVibGljIElzQWN0aXZlPyA6IG51bWJlclxyXG4gICAgcHVibGljIENyZWF0ZWRCeT8gOiBudW1iZXJcclxuICAgIHB1YmxpYyBDcmVhdGVkT24/IDogRGF0ZVxyXG4gICAgcHVibGljIFJvbGVEZXNjPyA6IHN0cmluZ1xyXG4gICAgcHVibGljIEVuYWJsZUFyZWFBbGxvYz86bnVtYmVyXHJcbn1cclxuZXhwb3J0IGNsYXNzIExvZ2luVE97XHJcbiAgICBwdWJsaWMgSWRMb2dpbj8gOiBzdHJpbmdcclxuICAgIHB1YmxpYyBVc2VySWQ/IDogbnVtYmVyXHJcbiAgICBwdWJsaWMgTG9naW5EYXRlPyA6IG51bWJlclxyXG4gICAgcHVibGljIExvZ291dERhdGU/IDogc3RyaW5nXHJcbiAgICBwdWJsaWMgTG9naW5JUD8gOiBzdHJpbmdcclxuICAgIHB1YmxpYyBMb25naXR1ZGU/IDogc3RyaW5nXHJcbiAgICBwdWJsaWMgTGF0aXR1ZGU/IDogc3RyaW5nXHJcbiAgICBcclxufVxyXG5cclxuLy9TYW5qYXkgWzIwMTctMDYtMDZdIEZvciBSZWdpb25hbCBNYW5hZ2VyIGFuZCBGaWVsZCBPZmZpY2VyIERpZmZlcmVudCBDJkZzIGFyZWEgaXMgYWxsb2NhdGVkXHJcbmV4cG9ydCBjbGFzcyBVc2VyQXJlYUFsbG9jYXRpb25UT3tcclxuICAgIHB1YmxpYyBJZEFyZWFBbGxvY0R0bD8gOiBOdW1iZXJcclxuICAgIHB1YmxpYyBVc2VySWQ/IDogbnVtYmVyXHJcbiAgICBwdWJsaWMgQ25mT3JnSWQ/IDogbnVtYmVyXHJcbiAgICBwdWJsaWMgRGlzdHJpY3RJZD8gOiBOdW1iZXJcclxuICAgIHB1YmxpYyBDcmVhdGVkQnk/IDogTnVtYmVyXHJcbiAgICBwdWJsaWMgSXNBY3RpdmU/IDogTnVtYmVyXHJcbiAgICBwdWJsaWMgQ3JlYXRlZE9uPyA6IERhdGVcclxuICAgIHB1YmxpYyBDcmVhdGVkT25TdHI/IDogU3RyaW5nXHJcbiAgICBwdWJsaWMgUmVtYXJrPyA6IFN0cmluZ1xyXG4gICAgcHVibGljIFVzZXJOYW1lPyA6IFN0cmluZ1xyXG4gICAgcHVibGljIERpc3RyaWN0TmFtZT8gOiBTdHJpbmdcclxuICAgIHB1YmxpYyBDbmZPcmdOYW1lPyA6IFN0cmluZyAgICBcclxuICAgIFxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVXNlckV4dFRPe1xyXG4gICAgcHVibGljIFVzZXJJZD8gOiBudW1iZXJcclxuICAgIHB1YmxpYyBQZXJzb25JZD8gOiBudW1iZXJcclxuICAgIHB1YmxpYyBPcmdhbml6YXRpb25JZD8gOiBudW1iZXJcclxuICAgIHB1YmxpYyBBZGRyZXNzSWQ/IDogTnVtYmVyXHJcbiAgICBwdWJsaWMgQ3JlYXRlZEJ5PyA6IE51bWJlclxyXG4gICAgcHVibGljIENvbW1lbnRzPyA6IHN0cmluZ1xyXG4gICAgcHVibGljIENyZWF0ZWRPbj8gOiBEYXRlXHJcblxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgIE1lbnVJbmZvcm1hdGlvblxyXG57XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgIHB1YmxpYyBJZE1lbnU6bnVtYmVyLFxyXG4gICAgICAgcHVibGljIFN5c0VsZW1lbnRJZDpudW1iZXIsXHJcbiAgICAgICBwdWJsaWMgTWVudU5hbWU6c3RyaW5nLFxyXG4gICAgICAgcHVibGljIE1lbnVEZXNjOnN0cmluZyxcclxuICAgICAgIHB1YmxpYyBQYXJlbnRNZW51SWQ6bnVtYmVyLFxyXG4gICAgICAgcHVibGljIE1vZHVsZUlkOm51bWJlcixcclxuICAgICAgIHB1YmxpYyBTZXJObzpudW1iZXIsXHJcbiAgICAgICBwdWJsaWMgQ3JlYXRlZE9uOkRhdGUsXHJcbiAgICAgICBwdWJsaWMgU3ViTWVudUxpc3QgOiBNZW51SW5mb3JtYXRpb25bXSAsXHJcbiAgICAgICBwdWJsaWMgTWVudUFjdGlvbjpzdHJpbmcsXHJcbiAgICAgICBwdWJsaWMgTWVudUl0ZW1JY29uOnN0cmluZywgXHJcbiAgICAgICBwdWJsaWMgTWVudVNob3J0Q3V0OnN0cmluZywgXHJcbiAgICAgIC8vIHB1YmxpYyBJbWdQYXRoOnN0cmluZ1xyXG4gICAgICAgXHJcbiAgICAgICAgKXt9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE1vZHVsZVRPXHJcbntcclxuICAgIElkTW9kdWxlPzpudW1iZXJcclxubW9kdWxlTmFtZT86c3RyaW5nXHJcbm1vZHVsZURlc2M/OnN0cmluZ1xyXG5jcmVhdGVkT24/OnN0cmluZ1xyXG5OYXZpZ2F0ZVVybD86c3RyaW5nXHJcbklzQWN0aXZlPzpudW1iZXJcclxuTG9nb1VybD86c3RyaW5nXHJcbkFuZHJvaWRVcmw/OnN0cmluZ1xyXG5Jc1N1YnNjcmliZT86bnVtYmVyO1xyXG59XHJcblxyXG5cclxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwLCBIZWFkZXJzLCBSZXNwb25zZSwgUmVxdWVzdE9wdGlvbnMsIEJhc2VSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xyXG5pbXBvcnQgeyBVc2VyVE8sIE5vdGlmaWNhdGlvblRPLCBSZXN1bHRNZXNzYWdlLCBDb21tYW9uVXNlclRPIH0gZnJvbSAnLi4vbW9kZWwvbm90aWZpY2F0aW9uVE8nXHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHJldHJ5LG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEh0dHBIZWFkZXJzIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCAqIGFzIENyeXB0b0pTIGZyb20gXCJjcnlwdG8tanNcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSxFcnJvck9ic2VydmVyfSBmcm9tICdyeGpzJztcclxuZXhwb3J0IGNvbnN0IGduR2V0QWxsQWN0aXZlQWxlcnRMaXN0ID0gXCJOb3RpZnkvR2V0QWxsQWN0aXZlQWxlcnRMaXN0P3VzZXJJZD1cIjtcclxuZXhwb3J0IGNvbnN0IGduUG9zdEFsZXJ0QWNrbm93bGVkZ2VtZW50ID0gXCJOb3RpZnkvUG9zdEFsZXJ0QWNrbm93bGVkZ2VtZW50XCI7XHJcbmV4cG9ydCBjb25zdCBnblBvc3RSZXNldEFsbEFsZXJ0cyA9IFwiTm90aWZ5L1Bvc3RSZXNldEFsbEFsZXJ0c1wiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uU2VydmljZXMge1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwKSB7IH1cclxuICAgIHVzZXJUTzogQ29tbWFvblVzZXJUTyA9IHt9XHJcbiAgICByZXN1bHRNZXNzYWdlOiBSZXN1bHRNZXNzYWdlID0gbmV3IFJlc3VsdE1lc3NhZ2U7XHJcbiAgICBnZXRVc2VyVE9Gcm9tTG9jYWxTdG9yYWdlKCk6IENvbW1hb25Vc2VyVE8ge1xyXG4gICAgICAgIGxldCB1c2VyVG86IENvbW1hb25Vc2VyVE8gPSB7fTtcclxuICAgICAgICB1c2VyVG8gPSBKU09OLnBhcnNlKHRoaXMuZGVjcnlwdGlvbihsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImN1cnJlbnRVc2VyXCIpKSk7XHJcbiAgICAgICAgaWYgKHVzZXJUbyA9PSB1bmRlZmluZWQgfHwgdXNlclRvID09IG51bGwpIHtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVzZXJUbztcclxuICAgIH1cclxuICAgIGdldEFsZXJ0Rm9yTm90aWZ5KFVybCkge1xyXG4gICAgICAgIGRlYnVnZ2VyXHJcbiAgICAgICAgaWYgKHRoaXMudXNlclRPID09IG51bGwgJiYgdGhpcy51c2VyVE8gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXRBbGxBY3RpdmVOb3RpZmljYXRpb24odGhpcy51c2VyVE8sVXJsKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHJlcy5maWx0ZXIocCA9PiBwLklzQWNrbm93bGVkZ2VkID09IDApLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJnTm90aWZpY2F0aW9uXCIpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJnTm90aWZpY2F0aW9uXCIpLmlubmVyVGV4dCA9IHYgPT0gMCA/ICcnIDogdi50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4geyB9XHJcbiAgICAgICAgKVxyXG5cclxuICAgIH1cclxuICAgIGdldEFsbEFjdGl2ZU5vdGlmaWNhdGlvbihVc2VyVG86IENvbW1hb25Vc2VyVE8sbWFzdGVyQmFzZVVybDpzdHJpbmcpOiBPYnNlcnZhYmxlPE5vdGlmaWNhdGlvblRPW10+IHtcclxuICAgICAgICAvL2xldCBrZXlzID0gXCJodHRwczovL3NpbXBseWRlbGl2ZXJkZW1vLnZlZ2Fpbm5vdmF0aW9ucy5jby5pbi9tYWRoYXZzaW1wbGlkZWxpdmVyYXBpL2FwaS9Ob3RpZnkvR2V0QWxsQWN0aXZlQWxlcnRMaXN0P3VzZXJJZD0xJnJvbGVJZD0xXCJcclxuICAgICAgICAvL2xldCBrZXlzID0gbWFzdGVyQmFzZVVybCArIGduR2V0QWxsQWN0aXZlQWxlcnRMaXN0ICsgVXNlclRvLklkVXNlciArIFwiJnJvbGVJZD1cIiArIFVzZXJUby5Vc2VyUm9sZUxpc3RbMF0uUm9sZUlkXHJcbiAgICAgICAgbGV0IGtleXMgPSBtYXN0ZXJCYXNlVXJsICsgXCJOb3RpZnkvR2V0QWxsQWN0aXZlQWxlcnRMaXN0P3VzZXJJZD0xJnJvbGVJZD0xXCI7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAgICAgICAuZ2V0KGtleXMpLnBpcGUobWFwKChyZXNwb25zZTogYW55KSA9PiByZXNwb25zZS5qc29uKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0QWxlcnRBY2tub3dsZWRnZW1lbnQobm90aWZpY2F0aW9uVG86IE5vdGlmaWNhdGlvblRPXHJcbiAgICAgICAgLCBsb2dpbklkOiBudW1iZXIsVVJMOnN0cmluZykge1xyXG4gICAgICAgIHZhciBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIGFsZXJ0VXNlcnNUTzogbm90aWZpY2F0aW9uVG8sXHJcbiAgICAgICAgICAgIGxvZ2luVXNlcklkOiBsb2dpbklkXHJcbiAgICAgICAgfTtcclxuICAgICAgICBsZXQgYm9keVN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcyk7XHJcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSk7XHJcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChVUkwgKyBnblBvc3RBbGVydEFja25vd2xlZGdlbWVudCwgYm9keVN0cmluZywgb3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdEFsbEFsZXJ0QWNrbm93bGVkZ2VtZW50KHVzZXJUbzogQ29tbWFvblVzZXJUTyxVUkw6c3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgbG9naW5Vc2VySWQ6IHVzZXJUby5JZFVzZXIsXHJcbiAgICAgICAgICAgIHJvbGVJZDogdXNlclRvLlVzZXJSb2xlTGlzdFswXS5Sb2xlSWRcclxuICAgICAgICB9O1xyXG4gICAgICAgIGxldCBib2R5U3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcclxuICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KFVSTCArIGduUG9zdFJlc2V0QWxsQWxlcnRzLCBib2R5U3RyaW5nLCBvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICBlbmNyeXB0aW9uKGRhdGEpIHtcclxuICAgICAgICBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XHJcbiAgICAgICAgLy8gRW5jcnlwdFxyXG4gICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gQ3J5cHRvSlMuQUVTLmVuY3J5cHQoZGF0YS50b1N0cmluZygpLCBcInNlY3JldCBrZXkgMTIzXCIpO1xyXG4gICAgICAgIHJldHVybiBjaXBoZXJ0ZXh0LnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICBkZWNyeXB0aW9uKGRhdGEpIHtcclxuICAgICAgICAvLyBEZWNyeXB0XHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgdmFyIGJ5dGVzID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoZGF0YSwgXCJzZWNyZXQga2V5IDEyM1wiKTtcclxuICAgICAgICAgICAgdmFyIHBsYWludGV4dCA9IGJ5dGVzLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcclxuICAgICAgICAgICAgcmV0dXJuIHBsYWludGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBJbnB1dCwgUGlwZSwgSW5qZWN0YWJsZSwgUGlwZVRyYW5zZm9ybSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgfSBmcm9tICdyeGpzL1J4JztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9ub3RpZmljYXRpb25fc2VydmljZXMnO1xyXG5pbXBvcnQgeyBVc2VyVE8sIE5vdGlmaWNhdGlvblRPLCBSZXN1bHRNZXNzYWdlLCBDb21tYW9uVXNlclRPIH0gZnJvbSAnLi4vbW9kZWwvbm90aWZpY2F0aW9uVE8nXHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG4vL2ltcG9ydCB7IExpc3RTZXJ2aWNlLCBJTG9hZGVyIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9zZXJ2aWNlL2dldERyb3Bkb3duTGlzdC5zZXJ2aWNlXCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ25vdGlmaWNhdGlvbicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4uL25vdGlmaWNhdGlvbi5odG1sJyxcclxuXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgIHVzZXJUTzogQ29tbWFvblVzZXJUTyA9IHt9O1xyXG4gICAgQElucHV0KCkgVVJMOiBzdHJpbmc7XHJcbiAgICByZXN1bHRNZXNzYWdlOiBSZXN1bHRNZXNzYWdlID0gbmV3IFJlc3VsdE1lc3NhZ2U7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGNvbW1hbjogTm90aWZpY2F0aW9uU2VydmljZXNcclxuICAgICAgICAsIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcclxuICAgICAgICAsIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy51c2VyVE8gPSB0aGlzLmNvbW1hbi5nZXRVc2VyVE9Gcm9tTG9jYWxTdG9yYWdlKCk7XHJcbiAgICB9XHJcbiAgICBub3RpZmljYXRpb25MaXN0OiBOb3RpZmljYXRpb25UT1tdID0gW107XHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmNvbW1hbi5nZXRBbGVydEZvck5vdGlmeSh0aGlzLlVSTCk7XHJcbiAgICAgICAgdGhpcy5nZXROb3RpZmljYXRpb25MaXN0QnlVc2VyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Tm90aWZpY2F0aW9uTGlzdEJ5VXNlcigpIHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkxpc3QgPSBbXVxyXG4gICAgICAgIHRoaXMuY29tbWFuLmdldEFsbEFjdGl2ZU5vdGlmaWNhdGlvbih0aGlzLnVzZXJUTywgdGhpcy5VUkwpLnN1YnNjcmliZShcclxuICAgICAgICAgICAgbm90aWZpY2F0aW9uUmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uTGlzdCA9IG5vdGlmaWNhdGlvblJlcztcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnIgOiAnICsgZXJyKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgbWFya0FzUmVhZFRvTm90aWZpY2F0aW9uKGFsZXJ0TWVzc2FnZVRvOiBOb3RpZmljYXRpb25UTywgaXNSZXNldDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgZGVidWdnZXJcclxuICAgICAgICBpZiAoYWxlcnRNZXNzYWdlVG8uSXNBY2tub3dsZWRnZWQgIT0gMCAmJiAhaXNSZXNldCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc1Jlc2V0KSB7XHJcbiAgICAgICAgICAgIGFsZXJ0TWVzc2FnZVRvLklzUmVzZXRlZCA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29tbWFuLnBvc3RBbGVydEFja25vd2xlZGdlbWVudChhbGVydE1lc3NhZ2VUbywgdGhpcy51c2VyVE8uSWRVc2VyLCB0aGlzLlVSTCkuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICB2UmVzID0+IHtcclxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyXHJcbiAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy5yZXN1bHRNZXNzYWdlLk1lc3NhZ2VUeXBlID09IDEgJiYgdGhpcy5yZXN1bHRNZXNzYWdlLlJlc3VsdCA9PSAxKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21tYW4uZ2V0QWxlcnRGb3JOb3RpZnkodGhpcy5VUkwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXROb3RpZmljYXRpb25MaXN0QnlVc2VyKCk7XHJcbiAgICAgICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgTXNnIDogXCIgKyBlcnIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRWYWxpZGF0aW9uQ29sb3IoaXNBY2tub3dlbGRlZDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGlzQWNrbm93ZWxkZWQgPT0gMCA/ICdib2xkJyA6ICdub3JtYWwnXHJcblxyXG4gICAgfVxyXG4gICAgcmVzZXRBbGxOb3RpZmljYXRpb24oKSB7XHJcbiAgICAgICAgLy90aGlzLnNzLnNob3dMb2FkZXIoKTtcclxuICAgICAgICB0aGlzLmNvbW1hbi5wb3N0QWxsQWxlcnRBY2tub3dsZWRnZW1lbnQodGhpcy51c2VyVE8sIHRoaXMuVVJMKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgIHZSZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLnJlc3VsdE1lc3NhZ2UgPSB2UmVzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzdWx0TWVzc2FnZS5NZXNzYWdlVHlwZSA9PSAxICYmIHRoaXMucmVzdWx0TWVzc2FnZS5SZXN1bHQgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuLmdldEFsZXJ0Rm9yTm90aWZ5KHRoaXMuVVJMKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkxpc3QgPSBbXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgTXNnIDogXCIgKyBlcnIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICByZWRpcmVjdEZ1bihhbGVydE1lc3NhZ2VUbzogTm90aWZpY2F0aW9uVE8pIHtcclxuICAgICAgICBpZiAoYWxlcnRNZXNzYWdlVG8uTmF2aWdhdGlvblVybCAhPSBudWxsIHx8IGFsZXJ0TWVzc2FnZVRvLk5hdmlnYXRpb25VcmwgIT0gXCJcIikge1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nICsgYWxlcnRNZXNzYWdlVG8uTmF2aWdhdGlvblVybF0pO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG59IiwiXHJcbmltcG9ydCB7IEJyb3dzZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtOb3RpZmljYXRpb25Db21wb25lbnR9IGZyb20gJy4vY29tcG9uZW50L25vdGlmaWNhdGlvbl9jb21wb25lbnRzJ1xyXG5pbXBvcnQge05vdGlmaWNhdGlvblNlcnZpY2VzfSBmcm9tICcuL3NlcnZpY2VzL25vdGlmaWNhdGlvbl9zZXJ2aWNlcydcclxuaW1wb3J0IHsgSHR0cE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xyXG5pbXBvcnQge1JvdXRlck1vZHVsZSwgUm91dGVzfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5jb25zdCBhcHBSb3V0ZXM6IFJvdXRlcyA9IFtcclxuICAgIHtwYXRoOiAnJywgY29tcG9uZW50OiBOb3RpZmljYXRpb25Db21wb25lbnR9XHJcbiAgXTtcclxuQE5nTW9kdWxlKHtcclxuICBkZWNsYXJhdGlvbnM6IFtcclxuICAgIE5vdGlmaWNhdGlvbkNvbXBvbmVudFxyXG4gIF0sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQnJvd3Nlck1vZHVsZSxIdHRwTW9kdWxlLFJvdXRlck1vZHVsZS5mb3JSb290KGFwcFJvdXRlcylcclxuICBdLFxyXG4gIHByb3ZpZGVyczpbTm90aWZpY2F0aW9uU2VydmljZXNdLFxyXG4gIGV4cG9ydHM6IFtOb3RpZmljYXRpb25Db21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOb3RpZnlNb2R1bGUgeyB9XHJcbiJdLCJuYW1lcyI6WyJDcnlwdG9KUy5BRVMiLCJDcnlwdG9KUy5lbmMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0E7Q0EyQ0M7Ozs7OztBQzVDRDtBQVNBLE1BQWEsMEJBQTBCLEdBQUcsaUNBQWlDLENBQUM7O0FBQzVFLE1BQWEsb0JBQW9CLEdBQUcsMkJBQTJCLENBQUM7QUFHaEU7Ozs7SUFDSSxZQUFvQixJQUFVO1FBQVYsU0FBSSxHQUFKLElBQUksQ0FBTTtzQkFDTixFQUFFOzZCQUNLLElBQUksYUFBYTtLQUZiOzs7O0lBR25DLHlCQUF5Qjs7UUFDckIsSUFBSSxNQUFNLEdBQWtCLEVBQUUsQ0FBQztRQUMvQixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBSzFFLE9BQU8sTUFBTSxDQUFDO0tBQ2pCOzs7OztJQUNELGlCQUFpQixDQUFDLEdBQUc7UUFDakIsU0FBUTtRQUNSLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUU7WUFDakQsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUNwRCxHQUFHOztZQUNDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3RELElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUks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