angular-magic-breadcrumb
Version:
AngularMagicBreadcrumb is a library for self-generated breadcrumb in angular 7
251 lines • 23 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/custom-breadcrumb.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input } from '@angular/core';
import { NavigationEnd, Router } from "@angular/router";
import { AngularMagicBreadcrumbService } from "./angular-magic-breadcrumb.service";
import { filter } from "rxjs/operators";
import { Location } from '@angular/common';
var CustomBreadcrumbComponent = /** @class */ (function () {
function CustomBreadcrumbComponent(router, breadcrumbService, location) {
this.router = router;
this.breadcrumbService = breadcrumbService;
this.location = location;
// this variable will handle the current url split into a list structure
this.currentsplitUrl = [];
// this variable will handle the full breadcrumb itself, this variable will be used in the HTML template
this.breadcumValue = [];
// this variable is a flag that indicates if the Breadcrumb must be shown in a specific view
this.showBreadcrum = true;
}
/**
* @return {?}
*/
CustomBreadcrumbComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.setUrls();
this.getBreadcrum();
};
/**
* Checks if the part of the breadcrumb is active or not, and make the redirection to the specific url of the part
* @param breadcrum -> part of the full breadcrumb
*/
/**
* Checks if the part of the breadcrumb is active or not, and make the redirection to the specific url of the part
* @param {?} breadcrum -> part of the full breadcrumb
* @return {?}
*/
CustomBreadcrumbComponent.prototype.redirectToView = /**
* Checks if the part of the breadcrumb is active or not, and make the redirection to the specific url of the part
* @param {?} breadcrum -> part of the full breadcrumb
* @return {?}
*/
function (breadcrum) {
if (breadcrum.active) {
return;
}
this.router.navigate([breadcrum.url]);
};
/**
* Make the subscriptions to the two observables, and saves the value of them into a specific variable
* saves the breadcrumb and if should be shown or not
*/
/**
* Make the subscriptions to the two observables, and saves the value of them into a specific variable
* saves the breadcrumb and if should be shown or not
* @return {?}
*/
CustomBreadcrumbComponent.prototype.getBreadcrum = /**
* Make the subscriptions to the two observables, and saves the value of them into a specific variable
* saves the breadcrumb and if should be shown or not
* @return {?}
*/
function () {
var _this = this;
this.breadcrumbService.breadcrumbStructure_.subscribe((/**
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var newBreadcrum = [];
value.forEach((/**
* @param {?} item
* @return {?}
*/
function (item) {
if (item.show == true) {
newBreadcrum.push(item);
}
}));
_this.breadcumValue = newBreadcrum;
}));
this.breadcrumbService.showBreadcrumbStructure_.subscribe((/**
* @param {?} value
* @return {?}
*/
function (value) {
_this.showBreadcrum = value;
}));
};
/**
* @return {?}
*/
CustomBreadcrumbComponent.prototype.setUrls = /**
* @return {?}
*/
function () {
var _this = this;
this._mainRoot = this.mainRoot;
this.router.events.pipe(
// Just executed when an navigation event ends
filter((/**
* @param {?} event
* @return {?}
*/
function (event) { return event instanceof NavigationEnd; }))).subscribe((/**
* @return {?}
*/
function () {
// returns and save the breadcrumb into a new temporal variable
/** @type {?} */
var currentBreadCrumStructure = _this.getBreadcrumbStructure();
// resets the structure of the breadcrumb
_this.breadcrumbService.resetBreadcrumbStructure();
// this variable will hold the url to add to the breadcrumb structure
/** @type {?} */
var setsUrl = '';
/** @type {?} */
var pathnameUrl = _this.location.path().split('#')[0].split('?')[0];
// this condition is when the breadcrumb is in a platform that has got a route that we don't want to show in the breadcrumb
if (pathnameUrl.includes('/' + _this._mainRoot + '/')) {
setsUrl = '/' + _this._mainRoot;
}
if (pathnameUrl != _this.lastPathname) {
// the breadcrumb must be shown if the first item change
_this.showBreadcrum = true;
}
// splits the url by the route on the condition above and splits it by the '/' separator
// Removes the /plataforma/ and params if the url have one of them
/** @type {?} */
var splitUrl = pathnameUrl.split('/' + _this._mainRoot + '/').join('').split('/');
// this line assure us that the url split has no blanks or null or empty elements
splitUrl = splitUrl.filter(Boolean);
splitUrl.forEach((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
function (item, index) {
setsUrl = setsUrl + '/' + item;
// a variable that holds the new part that will be added to the breadcrumb
/** @type {?} */
var newBreadcrum = {};
// if one part of the breadcrumb did'nt change, the last known value will be added (remains the same)
if (_this.currentsplitUrl[index] === item) {
newBreadcrum = currentBreadCrumStructure[index];
}
else {
// else... a new structure is created
newBreadcrum = {
value: item,
url: setsUrl,
active: splitUrl.length - 1 === index,
show: true
};
}
// the new part of the breadcrumb is added to the structure that will be shown
_this.setItemBreadcrumbStructure(newBreadcrum, index);
if (splitUrl.length - 1 === index) {
// in the last item of the route, the current route split is setted into the variable, to use it later when another navigation
// event happens
_this.currentsplitUrl = splitUrl;
}
}));
_this.lastPathname = pathnameUrl;
}));
};
/**
* @param {?} newBreadcrum
* @param {?} index
* @return {?}
*/
CustomBreadcrumbComponent.prototype.setItemBreadcrumbStructure = /**
* @param {?} newBreadcrum
* @param {?} index
* @return {?}
*/
function (newBreadcrum, index) {
this.breadcrumbService.setItemBreadcrumbStructure(newBreadcrum, index);
};
/**
* @return {?}
*/
CustomBreadcrumbComponent.prototype.getBreadcrumbStructure = /**
* @return {?}
*/
function () {
return this.breadcrumbService.getBreadcrumbStructure();
};
/**
* @param {?} value
* @return {?}
*/
CustomBreadcrumbComponent.prototype.changeVisibilityBreadcrumb = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.breadcrumbService.changeVisibilityBreadcrumb(value);
};
CustomBreadcrumbComponent.decorators = [
{ type: Component, args: [{
selector: 'lng-self-generated-breadcrumb',
template: "<div class=\"dynamic-breadcrumb\">\r\n <nav aria-label=\"breadcrumb\" class=\"navigation\" *ngIf=\"showBreadcrum\">\r\n <ol class=\"breadcrumb\">\r\n <li class=\"breadcrumb-item\" [class.active]=\"breadcrum.active\"\r\n (click)=\"redirectToView(breadcrum)\"\r\n style=\"text-transform: capitalize\"\r\n *ngFor=\"let breadcrum of breadcumValue\">{{breadcrum.value}}</li>\r\n </ol>\r\n </nav>\r\n</div>\r\n",
providers: [AngularMagicBreadcrumbService],
styles: [".dynamic-breadcrumb{background-color:#fff}.navigation{display:block}.breadcrumb{display:flex;flex-wrap:wrap;list-style:none;border-radius:.25rem;background-color:#fff;font-size:15px;padding:31px 30px 10px;color:#898989;font-weight:300;max-width:1216px;margin:0 auto}.breadcrumb .breadcrumb-item+.breadcrumb-item::before{display:inline-block;color:#6c757d;content:\"/\";padding-right:5px}.breadcrumb .breadcrumb-item{padding-left:5px}.breadcrumb .breadcrumb-item:not(.active){cursor:pointer}.breadcrumb .breadcrumb-item.active{color:#707070;font-weight:400}@media (min-width:768px){.breadcrumb{padding-left:30px;padding-bottom:22px}}@media (min-width:992px){.breadcrumb{padding-left:45px}}@media (min-width:1200px){.breadcrumb{font-size:17px;padding:40px 50px 10px}}"]
}] }
];
/** @nocollapse */
CustomBreadcrumbComponent.ctorParameters = function () { return [
{ type: Router },
{ type: AngularMagicBreadcrumbService },
{ type: Location }
]; };
CustomBreadcrumbComponent.propDecorators = {
mainRoot: [{ type: Input }]
};
return CustomBreadcrumbComponent;
}());
export { CustomBreadcrumbComponent };
if (false) {
/** @type {?} */
CustomBreadcrumbComponent.prototype.mainRoot;
/** @type {?} */
CustomBreadcrumbComponent.prototype._mainRoot;
/** @type {?} */
CustomBreadcrumbComponent.prototype.lastPathname;
/** @type {?} */
CustomBreadcrumbComponent.prototype.currentsplitUrl;
/** @type {?} */
CustomBreadcrumbComponent.prototype.breadcumValue;
/** @type {?} */
CustomBreadcrumbComponent.prototype.showBreadcrum;
/**
* @type {?}
* @private
*/
CustomBreadcrumbComponent.prototype.router;
/** @type {?} */
CustomBreadcrumbComponent.prototype.breadcrumbService;
/**
* @type {?}
* @private
*/
CustomBreadcrumbComponent.prototype.location;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWJyZWFkY3J1bWIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1tYWdpYy1icmVhZGNydW1iLyIsInNvdXJjZXMiOlsibGliL2N1c3RvbS1icmVhZGNydW1iLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxhQUFhLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDakYsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QztJQXFCRSxtQ0FDVSxNQUFjLEVBQ2YsaUJBQWdELEVBQy9DLFFBQWtCO1FBRmxCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZixzQkFBaUIsR0FBakIsaUJBQWlCLENBQStCO1FBQy9DLGFBQVEsR0FBUixRQUFRLENBQVU7O1FBYjVCLG9CQUFlLEdBQUcsRUFBRSxDQUFDOztRQUVyQixrQkFBYSxHQUlQLEVBQUUsQ0FBQzs7UUFFVCxrQkFBYSxHQUFHLElBQUksQ0FBQztJQU1qQixDQUFDOzs7O0lBRUwsNENBQVE7OztJQUFSO1FBQ0UsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7Ozs7OztJQUNILGtEQUFjOzs7OztJQUFkLFVBQWUsU0FBUztRQUN0QixJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDcEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFD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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge05hdmlnYXRpb25FbmQsIFJvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0FuZ3VsYXJNYWdpY0JyZWFkY3J1bWJTZXJ2aWNlfSBmcm9tIFwiLi9hbmd1bGFyLW1hZ2ljLWJyZWFkY3J1bWIuc2VydmljZVwiO1xyXG5pbXBvcnQge2ZpbHRlcn0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7TG9jYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xuZy1zZWxmLWdlbmVyYXRlZC1icmVhZGNydW1iJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY3VzdG9tLWJyZWFkY3J1bWIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2N1c3RvbS1icmVhZGNydW1iLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbQW5ndWxhck1hZ2ljQnJlYWRjcnVtYlNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21CcmVhZGNydW1iQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBtYWluUm9vdDogU3RyaW5nO1xyXG4gIF9tYWluUm9vdDogU3RyaW5nO1xyXG4gIGxhc3RQYXRobmFtZTogc3RyaW5nO1xyXG4gIC8vIHRoaXMgdmFyaWFibGUgd2lsbCBoYW5kbGUgdGhlIGN1cnJlbnQgdXJsIHNwbGl0IGludG8gYSBsaXN0IHN0cnVjdHVyZVxyXG4gIGN1cnJlbnRzcGxpdFVybCA9IFtdO1xyXG4gIC8vIHRoaXMgdmFyaWFibGUgd2lsbCBoYW5kbGUgdGhlIGZ1bGwgYnJlYWRjcnVtYiBpdHNlbGYsIHRoaXMgdmFyaWFibGUgd2lsbCBiZSB1c2VkIGluIHRoZSBIVE1MIHRlbXBsYXRlXHJcbiAgYnJlYWRjdW1WYWx1ZToge1xyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICBhY3RpdmU6IGJvb2xlYW4sXHJcbiAgICB2YWx1ZTogc3RyaW5nXHJcbiAgfVtdID0gW107XHJcbiAgLy8gdGhpcyB2YXJpYWJsZSBpcyBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIEJyZWFkY3J1bWIgbXVzdCBiZSBzaG93biBpbiBhIHNwZWNpZmljIHZpZXdcclxuICBzaG93QnJlYWRjcnVtID0gdHJ1ZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHVibGljIGJyZWFkY3J1bWJTZXJ2aWNlOiBBbmd1bGFyTWFnaWNCcmVhZGNydW1iU2VydmljZSxcclxuICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldFVybHMoKTtcclxuICAgIHRoaXMuZ2V0QnJlYWRjcnVtKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgdGhlIHBhcnQgb2YgdGhlIGJyZWFkY3J1bWIgaXMgYWN0aXZlIG9yIG5vdCwgYW5kIG1ha2UgdGhlIHJlZGlyZWN0aW9uIHRvIHRoZSBzcGVjaWZpYyB1cmwgb2YgdGhlIHBhcnRcclxuICAgKiBAcGFyYW0gYnJlYWRjcnVtIC0+IHBhcnQgb2YgdGhlIGZ1bGwgYnJlYWRjcnVtYlxyXG4gICAqL1xyXG4gIHJlZGlyZWN0VG9WaWV3KGJyZWFkY3J1bSkge1xyXG4gICAgaWYgKGJyZWFkY3J1bS5hY3RpdmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2JyZWFkY3J1bS51cmxdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2UgdGhlIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHR3byBvYnNlcnZhYmxlcywgYW5kIHNhdmVzIHRoZSB2YWx1ZSBvZiB0aGVtIGludG8gYSBzcGVjaWZpYyB2YXJpYWJsZVxyXG4gICAqIHNhdmVzIHRoZSBicmVhZGNydW1iIGFuZCBpZiBzaG91bGQgYmUgc2hvd24gb3Igbm90XHJcbiAgICovXHJcbiAgZ2V0QnJlYWRjcnVtKCkge1xyXG4gICAgdGhpcy5icmVhZGNydW1iU2VydmljZS5icmVhZGNydW1iU3RydWN0dXJlXy5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICBsZXQgbmV3QnJlYWRjcnVtID0gW107XHJcbiAgICAgIHZhbHVlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uc2hvdyA9PSB0cnVlKSB7XHJcbiAgICAgICAgICBuZXdCcmVhZGNydW0ucHVzaChpdGVtKVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuYnJlYWRjdW1WYWx1ZSA9IG5ld0JyZWFkY3J1bTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYnJlYWRjcnVtYlNlcnZpY2Uuc2hvd0JyZWFkY3J1bWJTdHJ1Y3R1cmVfLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0JyZWFkY3J1bSA9IHZhbHVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRVcmxzKCkge1xyXG4gICAgdGhpcy5fbWFpblJvb3QgPSB0aGlzLm1haW5Sb290O1xyXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoXHJcbiAgICAgIC8vIEp1c3QgZXhlY3V0ZWQgd2hlbiBhbiBuYXZpZ2F0aW9uIGV2ZW50IGVuZHNcclxuICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZClcclxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgLy8gcmV0dXJucyBhbmQgc2F2ZSB0aGUgYnJlYWRjcnVtYiBpbnRvIGEgbmV3IHRlbXBvcmFsIHZhcmlhYmxlXHJcbiAgICAgIGNvbnN0IGN1cnJlbnRCcmVhZENydW1TdHJ1Y3R1cmUgPSB0aGlzLmdldEJyZWFkY3J1bWJTdHJ1Y3R1cmUoKTtcclxuICAgICAgLy8gcmVzZXRzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGJyZWFkY3J1bWJcclxuICAgICAgdGhpcy5icmVhZGNydW1iU2VydmljZS5yZXNldEJyZWFkY3J1bWJTdHJ1Y3R1cmUoKTtcclxuICAgICAgLy8gdGhpcyB2YXJpYWJsZSB3aWxsIGhvbGQgdGhlIHVybCB0byBhZGQgdG8gdGhlIGJyZWFkY3J1bWIgc3RydWN0dXJlXHJcbiAgICAgIGxldCBzZXRzVXJsID0gJyc7XHJcbiAgICAgIGNvbnN0IHBhdGhuYW1lVXJsID0gdGhpcy5sb2NhdGlvbi5wYXRoKCkuc3BsaXQoJyMnKVswXS5zcGxpdCgnPycpWzBdO1xyXG4gICAgICAvLyB0aGlzIGNvbmRpdGlvbiBpcyB3aGVuIHRoZSBicmVhZGNydW1iIGlzIGluIGEgcGxhdGZvcm0gdGhhdCBoYXMgZ290IGEgcm91dGUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHNob3cgaW4gdGhlIGJyZWFkY3J1bWJcclxuICAgICAgaWYgKHBhdGhuYW1lVXJsLmluY2x1ZGVzKCcvJysgdGhpcy5fbWFpblJvb3QgKycvJykpIHtcclxuICAgICAgICBzZXRzVXJsID0gJy8nKyB0aGlzLl9tYWluUm9vdDtcclxuICAgICAgfVxyXG4gICAgICBpZiAocGF0aG5hbWVVcmwgIT0gdGhpcy5sYXN0UGF0aG5hbWUpIHtcclxuICAgICAgICAvLyB0aGUgYnJlYWRjcnVtYiBtdXN0IGJlIHNob3duIGlmIHRoZSBmaXJzdCBpdGVtIGNoYW5nZVxyXG4gICAgICAgIHRoaXMuc2hvd0JyZWFkY3J1bSA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNwbGl0cyB0aGUgdXJsIGJ5IHRoZSByb3V0ZSBvbiB0aGUgY29uZGl0aW9uIGFib3ZlIGFuZCBzcGxpdHMgaXQgYnkgdGhlICcvJyBzZXBhcmF0b3JcclxuICAgICAgLy8gUmVtb3ZlcyB0aGUgL3BsYXRhZm9ybWEvIGFuZCBwYXJhbXMgaWYgdGhlIHVybCBoYXZlIG9uZSBvZiB0aGVtXHJcbiAgICAgIGxldCBzcGxpdFVybCA9IHBhdGhuYW1lVXJsLnNwbGl0KCcvJysgdGhpcy5fbWFpblJvb3QgKycvJykuam9pbignJykuc3BsaXQoJy8nKTtcclxuICAgICAgLy8gdGhpcyBsaW5lIGFzc3VyZSB1cyB0aGF0IHRoZSB1cmwgc3BsaXQgaGFzIG5vIGJsYW5rcyBvciBudWxsIG9yIGVtcHR5IGVsZW1lbnRzXHJcbiAgICAgIHNwbGl0VXJsID0gc3BsaXRVcmwuZmlsdGVyKEJvb2xlYW4pO1xyXG4gICAgICBzcGxpdFVybC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHNldHNVcmwgPSBzZXRzVXJsICsgJy8nICsgaXRlbTtcclxuICAgICAgICAvLyBhIHZhcmlhYmxlIHRoYXQgaG9sZHMgdGhlIG5ldyBwYXJ0IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYnJlYWRjcnVtYlxyXG4gICAgICAgIGxldCBuZXdCcmVhZGNydW0gPSB7fTtcclxuICAgICAgICAvLyBpZiBvbmUgcGFydCBvZiB0aGUgYnJlYWRjcnVtYiBkaWQnbnQgY2hhbmdlLCB0aGUgbGFzdCBrbm93biB2YWx1ZSB3aWxsIGJlIGFkZGVkIChyZW1haW5zIHRoZSBzYW1lKVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRzcGxpdFVybFtpbmRleF0gPT09IGl0ZW0pIHtcclxuICAgICAgICAgIG5ld0JyZWFkY3J1bSA9IGN1cnJlbnRCcmVhZENydW1TdHJ1Y3R1cmVbaW5kZXhdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBlbHNlLi4uIGEgbmV3IHN0cnVjdHVyZSBpcyBjcmVhdGVkXHJcbiAgICAgICAgICBuZXdCcmVhZGNydW0gPSB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxyXG4gICAgICAgICAgICB1cmw6IHNldHNVcmwsXHJcbiAgICAgICAgICAgIGFjdGl2ZTogc3BsaXRVcmwubGVuZ3RoIC0gMSA9PT0gaW5kZXgsXHJcbiAgICAgICAgICAgIHNob3c6IHRydWVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoZSBuZXcgcGFydCBvZiB0aGUgYnJlYWRjcnVtYiBpcyBhZGRlZCB0byB0aGUgc3RydWN0dXJlIHRoYXQgd2lsbCBiZSBzaG93blxyXG4gICAgICAgIHRoaXMuc2V0SXRlbUJyZWFkY3J1bWJTdHJ1Y3R1cmUobmV3QnJlYWRjcnVtLCBpbmRleCk7XHJcblxyXG4gICAgICAgIGlmIChzcGxpdFVybC5sZW5ndGggLSAxID09PSBpbmRleCkge1xyXG4gICAgICAgICAgLy8gaW4gdGhlIGxhc3QgaXRlbSBvZiB0aGUgcm91dGUsIHRoZSBjdXJyZW50IHJvdXRlIHNwbGl0IGlzIHNldHRlZCBpbnRvIHRoZSB2YXJpYWJsZSwgdG8gdXNlIGl0IGxhdGVyIHdoZW4gYW5vdGhlciBuYXZpZ2F0aW9uXHJcbiAgICAgICAgICAvLyBldmVudCBoYXBwZW5zXHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRzcGxpdFVybCA9IHNwbGl0VXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmxhc3RQYXRobmFtZSA9IHBhdGhuYW1lVXJsO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRJdGVtQnJlYWRjcnVtYlN0cnVjdHVyZShuZXdCcmVhZGNydW0sIGluZGV4KSB7XHJcbiAgICB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLnNldEl0ZW1CcmVhZGNydW1iU3RydWN0dXJlKG5ld0JyZWFkY3J1bSwgaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QnJlYWRjcnVtYlN0cnVjdHVyZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLmdldEJyZWFkY3J1bWJTdHJ1Y3R1cmUoKVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVmlzaWJpbGl0eUJyZWFkY3J1bWIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuYnJlYWRjcnVtYlNlcnZpY2UuY2hhbmdlVmlzaWJpbGl0eUJyZWFkY3J1bWIodmFsdWUpXHJcbiAgfVxyXG5cclxufVxyXG4iXX0=