ngx-mat-lib
Version:
A bunch of utilities and components to use in your Angular 7+ apps!
299 lines (298 loc) • 23.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { AriaDescriber } from "@angular/cdk/a11y";
import { coerceBooleanProperty } from "@angular/cdk/coercion";
import { Directive, ElementRef, Input, NgZone, Renderer2 } from "@angular/core";
/** @typedef {?} */
var XmatBadgePosition;
export { XmatBadgePosition };
/** @typedef {?} */
var XmatBadgeSize;
export { XmatBadgeSize };
/**
* Directive to display a text badge.
*/
export class XmatBadgeDirective {
/**
* @param {?} _ngZone
* @param {?} _ariaDescriber
* @param {?} _renderer
* @param {?} elementRef
*/
constructor(_ngZone, _ariaDescriber, _renderer, elementRef) {
this._ngZone = _ngZone;
this._ariaDescriber = _ariaDescriber;
this._renderer = _renderer;
/*
* Size of the badge. Can be "small", "medium", or "large".
*/
// tslint:disable-next-line:no-input-rename
this.size = "medium";
/*
* Position the badge should reside.
* Accepts any combination of "above"|"below" and "before"|"after"
*/
// tslint:disable-next-line:no-input-rename
this.position = "below after";
/**
* Whether the badge has any content.
*/
this.hasContent = false;
/**
* Unique id for the badge
*/
this.id = XmatBadgeDirective.nextId++;
this._color = "primary";
this._overlap = true;
// Bridge to the new Angular6 typed ElementRef
this._elementRef = new ElementRef(elementRef.nativeElement);
}
/**
* The color of the badge. Can be `primary`, `accent`, or `warn`.
* @param {?} value
* @return {?}
*/
set color(value) {
this._setColor(value);
this._color = value;
}
/**
* @return {?}
*/
get color() {
return this._color;
}
/**
* Whether the badge should overlap its contents or not
* @return {?}
*/
get overlap() {
return this._overlap;
}
/**
* @param {?} val
* @return {?}
*/
set overlap(val) {
this._overlap = coerceBooleanProperty(val);
}
/**
* The content for the badge
* @param {?} value
* @return {?}
*/
set content(value) {
this._content = value;
this.hasContent = value != null && `${value}`.trim().length > 0;
this._updateTextContent();
}
/**
* @return {?}
*/
get content() {
return this._content;
}
/**
* Message used to describe the decorated element via aria-describedby
* @param {?} newDescription
* @return {?}
*/
set description(newDescription) {
if (newDescription !== this._description) {
this._updateHostAriaDescription(newDescription, this._description);
this._description = newDescription;
}
}
/**
* @return {?}
*/
get description() {
return this._description;
}
/**
* Whether the badge is hidden.
* @return {?}
*/
get hidden() {
return this._hidden;
}
/**
* @param {?} val
* @return {?}
*/
set hidden(val) {
this._hidden = coerceBooleanProperty(val);
}
/**
* Whether the badge is above the host or not
* @return {?}
*/
isAbove() {
return this.position.indexOf("below") === -1;
}
/**
* Whether the badge is after the host or not
* @return {?}
*/
isAfter() {
return this.position.indexOf("before") === -1;
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.description && this._badgeElement) {
this._ariaDescriber.removeDescription(this._badgeElement, this.description);
}
}
/**
* Injects a span element into the DOM with the content.
* @return {?}
*/
_updateTextContent() {
if (!this._badgeElement) {
this._badgeElement = this._createBadgeElement();
}
else {
this._badgeElement.textContent = this.content;
}
return this._badgeElement;
}
/**
* Creates the badge element
* @return {?}
*/
_createBadgeElement() {
/** @type {?} */
const rootNode = this._renderer;
/** @type {?} */
const badgeElement = document.createElement("span");
/** @type {?} */
const activeClass = "xmat-badge-active";
badgeElement.setAttribute("id", `xmat-badge-content-${this.id}`);
badgeElement.classList.add("xmat-badge-content");
badgeElement.textContent = this.content;
if (this.description) {
badgeElement.setAttribute("aria-label", this.description);
}
this._elementRef.nativeElement.appendChild(badgeElement);
// animate in after insertion
if (typeof requestAnimationFrame === "function") {
this._ngZone.runOutsideAngular(() => {
requestAnimationFrame(() => {
badgeElement.classList.add(activeClass);
});
});
}
else {
badgeElement.classList.add(activeClass);
}
return badgeElement;
}
/**
* Adds css theme class given the color to the component host
* @param {?} colorPalette
* @return {?}
*/
_setColor(colorPalette) {
if (colorPalette !== this._color) {
if (this._color) {
this._elementRef.nativeElement.classList.remove(`xmat-badge-${this._color}`);
}
if (colorPalette) {
this._elementRef.nativeElement.classList.add(`xmat-badge-${colorPalette}`);
}
}
}
/**
* Sets the aria-label property on the element
* @param {?} newDescription
* @param {?} oldDescription
* @return {?}
*/
_updateHostAriaDescription(newDescription, oldDescription) {
/** @type {?} */
const content = this._updateTextContent();
if (oldDescription) {
this._ariaDescriber.removeDescription(content, oldDescription);
}
if (newDescription) {
this._ariaDescriber.describe(content, newDescription);
}
}
}
XmatBadgeDirective.nextId = 0;
XmatBadgeDirective.decorators = [
{ type: Directive, args: [{
selector: "[xmatBadge]",
host: {
"class": "xmat-badge",
"[class.xmat-badge-overlap]": "overlap",
"[class.xmat-badge-above]": "isAbove()",
"[class.xmat-badge-below]": "!isAbove()",
"[class.xmat-badge-before]": "!isAfter()",
"[class.xmat-badge-after]": "isAfter()",
"[class.xmat-badge-small]": "size === 'small'",
"[class.xmat-badge-medium]": "size === 'medium'",
"[class.xmat-badge-large]": "size === 'large'",
"[class.xmat-badge-hidden]": "hidden || !hasContent",
},
},] }
];
/** @nocollapse */
XmatBadgeDirective.ctorParameters = () => [
{ type: NgZone },
{ type: AriaDescriber },
{ type: Renderer2 },
{ type: ElementRef }
];
XmatBadgeDirective.propDecorators = {
size: [{ type: Input, args: ["xmatBadgeSize",] }],
position: [{ type: Input, args: ["xmatBadgePosition",] }],
color: [{ type: Input, args: ["xmatBadgeColor",] }],
overlap: [{ type: Input, args: ["xmatBadgeOverlap",] }],
content: [{ type: Input, args: ["xmatBadge",] }],
description: [{ type: Input, args: ["xmatBadgeDescription",] }],
hidden: [{ type: Input, args: ["xmatBadgeHidden",] }]
};
if (false) {
/** @type {?} */
XmatBadgeDirective.nextId;
/** @type {?} */
XmatBadgeDirective.prototype.size;
/** @type {?} */
XmatBadgeDirective.prototype.position;
/**
* Whether the badge has any content.
* @type {?}
*/
XmatBadgeDirective.prototype.hasContent;
/**
* Unique id for the badge
* @type {?}
*/
XmatBadgeDirective.prototype.id;
/** @type {?} */
XmatBadgeDirective.prototype._badgeElement;
/** @type {?} */
XmatBadgeDirective.prototype._color;
/** @type {?} */
XmatBadgeDirective.prototype._content;
/** @type {?} */
XmatBadgeDirective.prototype._description;
/** @type {?} */
XmatBadgeDirective.prototype._elementRef;
/** @type {?} */
XmatBadgeDirective.prototype._hidden;
/** @type {?} */
XmatBadgeDirective.prototype._overlap;
/** @type {?} */
XmatBadgeDirective.prototype._ngZone;
/** @type {?} */
XmatBadgeDirective.prototype._ariaDescriber;
/** @type {?} */
XmatBadgeDirective.prototype._renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1hdC1iYWRnZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbWF0LWxpYi8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL3htYXQtYmFkZ2UveG1hdC1iYWRnZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0gsU0FBUyxFQUFFLFVBQVUsRUFDckIsS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7QUFzQnZCLE1BQU0sT0FBTyxrQkFBa0I7Ozs7Ozs7SUF1RjNCLFlBQW9CLE9BQWUsRUFDZixnQkFDQSxXQUNSLFVBQXNCO1FBSGQsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLG1CQUFjLEdBQWQsY0FBYztRQUNkLGNBQVMsR0FBVCxTQUFTOzs7OztRQWpGN0IsWUFBOEMsUUFBUSxDQUFDOzs7Ozs7UUFPdkQsZ0JBQTBELGFBQWEsQ0FBQzs7OztRQTJEeEUsa0JBQWEsS0FBSyxDQUFDOzs7O1FBRW5CLFVBQWEsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7c0JBR1YsU0FBUzt3QkFLWixJQUFJOztRQVM1QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksVUFBVSxDQUFjLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztLQUM1RTs7Ozs7O0lBNUVELElBQ0ksS0FBSyxDQUFDLEtBQW1CO1FBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7S0FDdkI7Ozs7SUFFRCxJQUFJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDdEI7Ozs7O0lBR0QsSUFDSSxPQUFPO1FBQ1AsT0FBTyxJ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QUFhO2dCQUN2QixJQUFJLEVBQUU7b0JBQ0YsT0FBTyxFQUFFLFlBQVk7b0JBQ3JCLDRCQUE0QixFQUFFLFNBQVM7b0JBQ3ZDLDBCQUEwQixFQUFFLFdBQVc7b0JBQ3ZDLDBCQUEwQixFQUFFLFlBQVk7b0JBQ3hDLDJCQUEyQixFQUFFLFlBQVk7b0JBQ3pDLDBCQUEwQixFQUFFLFdBQVc7b0JBQ3ZDLDBCQUEwQixFQUFFLGtCQUFrQjtvQkFDOUMsMkJBQTJCLEVBQUUsbUJBQW1CO29CQUNoRCwwQkFBMEIsRUFBRSxrQkFBa0I7b0JBQzlDLDJCQUEyQixFQUFFLHVCQUF1QjtpQkFDdkQ7YUFDSjs7OztZQXhCRyxNQUFNO1lBTEYsYUFBYTtZQU9qQixTQUFTO1lBSkUsVUFBVTs7O21CQW1DcEIsS0FBSyxTQUFDLGVBQWU7dUJBT3JCLEtBQUssU0FBQyxtQkFBbUI7b0JBR3pCLEtBQUssU0FBQyxnQkFBZ0I7c0JBV3RCLEtBQUssU0FBQyxrQkFBa0I7c0JBVXhCLEtBQUssU0FBQyxXQUFXOzBCQVlqQixLQUFLLFNBQUMsc0JBQXNCO3FCQWE1QixLQUFLLFNBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcmlhRGVzY3JpYmVyfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2ExMXlcIjtcbmltcG9ydCB7Y29lcmNlQm9vbGVhblByb3BlcnR5fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2NvZXJjaW9uXCI7XG5pbXBvcnQge1xuICAgIERpcmVjdGl2ZSwgRWxlbWVudFJlZixcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIFJlbmRlcmVyMlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtUaGVtZVBhbGV0dGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlXCI7XG5cbmV4cG9ydCB0eXBlIFhtYXRCYWRnZVBvc2l0aW9uID0gXCJhYm92ZSBhZnRlclwiIHwgXCJhYm92ZSBiZWZvcmVcIiB8IFwiYmVsb3cgYmVmb3JlXCIgfCBcImJlbG93IGFmdGVyXCI7XG5leHBvcnQgdHlwZSBYbWF0QmFkZ2VTaXplID0gXCJzbWFsbFwiIHwgXCJtZWRpdW1cIiB8IFwibGFyZ2VcIjtcblxuLyoqIERpcmVjdGl2ZSB0byBkaXNwbGF5IGEgdGV4dCBiYWRnZS4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiBcIlt4bWF0QmFkZ2VdXCIsXG4gICAgaG9zdDoge1xuICAgICAgICBcImNsYXNzXCI6IFwieG1hdC1iYWRnZVwiLFxuICAgICAgICBcIltjbGFzcy54bWF0LWJhZGdlLW92ZXJsYXBdXCI6IFwib3ZlcmxhcFwiLFxuICAgICAgICBcIltjbGFzcy54bWF0LWJhZGdlLWFib3ZlXVwiOiBcImlzQWJvdmUoKVwiLFxuICAgICAgICBcIltjbGFzcy54bWF0LWJhZGdlLWJlbG93XVwiOiBcIiFpc0Fib3ZlKClcIixcbiAgICAgICAgXCJbY2xhc3MueG1hdC1iYWRnZS1iZWZvcmVdXCI6IFwiIWlzQWZ0ZXIoKVwiLFxuICAgICAgICBcIltjbGFzcy54bWF0LWJhZGdlLWFmdGVyXVwiOiBcImlzQWZ0ZXIoKVwiLFxuICAgICAgICBcIltjbGFzcy54bWF0LWJhZGdlLXNtYWxsXVwiOiBcInNpemUgPT09ICdzbWFsbCdcIixcbiAgICAgICAgXCJbY2xhc3MueG1hdC1iYWRnZS1tZWRpdW1dXCI6IFwic2l6ZSA9PT0gJ21lZGl1bSdcIixcbiAgICAgICAgXCJbY2xhc3MueG1hdC1iYWRnZS1sYXJnZV1cIjogXCJzaXplID09PSAnbGFyZ2UnXCIsXG4gICAgICAgIFwiW2NsYXNzLnhtYXQtYmFkZ2UtaGlkZGVuXVwiOiBcImhpZGRlbiB8fCAhaGFzQ29udGVudFwiLFxuICAgIH0sXG59KVxuZXhwb3J0IGNsYXNzIFhtYXRCYWRnZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBzdGF0aWMgbmV4dElkOiBudW1iZXIgPSAwO1xuXG4gICAgLypcbiAgICAgKiBTaXplIG9mIHRoZSBiYWRnZS4gQ2FuIGJlIFwic21hbGxcIiwgXCJtZWRpdW1cIiwgb3IgXCJsYXJnZVwiLlxuICAgICAqL1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcbiAgICBASW5wdXQoXCJ4bWF0QmFkZ2VTaXplXCIpIHNpemU6IFhtYXRCYWRnZVNpemUgPSBcIm1lZGl1bVwiO1xuXG4gICAgLypcbiAgICAgKiBQb3NpdGlvbiB0aGUgYmFkZ2Ugc2hvdWxkIHJlc2lkZS5cbiAgICAgKiBBY2NlcHRzIGFueSBjb21iaW5hdGlvbiBvZiBcImFib3ZlXCJ8XCJiZWxvd1wiIGFuZCBcImJlZm9yZVwifFwiYWZ0ZXJcIlxuICAgICAqL1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcbiAgICBASW5wdXQoXCJ4bWF0QmFkZ2VQb3NpdGlvblwiKSBwb3NpdGlvbjogWG1hdEJhZGdlUG9zaXRpb24gPSBcImJlbG93IGFmdGVyXCI7XG5cbiAgICAvKiogVGhlIGNvbG9yIG9mIHRoZSBiYWRnZS4gQ2FuIGJlIGBwcmltYXJ5YCwgYGFjY2VudGAsIG9yIGB3YXJuYC4gKi9cbiAgICBASW5wdXQoXCJ4bWF0QmFkZ2VDb2xvclwiKVxuICAgIHNldCBjb2xvcih2YWx1ZTogVGhlbWVQYWxldHRlKSB7XG4gICAgICAgIHRoaXMuX3NldENvbG9yKHZhbHVlKTtcbiAgICAgICAgdGhpcy5fY29sb3IgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgY29sb3IoKTogVGhlbWVQYWxldHRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbG9yO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBiYWRnZSBzaG91bGQgb3ZlcmxhcCBpdHMgY29udGVudHMgb3Igbm90ICovXG4gICAgQElucHV0KFwieG1hdEJhZGdlT3ZlcmxhcFwiKVxuICAgIGdldCBvdmVybGFwKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxhcDtcbiAgICB9XG5cbiAgICBzZXQgb3ZlcmxhcCh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxhcCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWwpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY29udGVudCBmb3IgdGhlIGJhZGdlICovXG4gICAgQElucHV0KFwieG1hdEJhZGdlXCIpXG4gICAgc2V0IGNvbnRlbnQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaGFzQ29udGVudCA9IHZhbHVlICE9IG51bGwgJiYgYCR7dmFsdWV9YC50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgdGhpcy5fdXBkYXRlVGV4dENvbnRlbnQoKTtcbiAgICB9XG5cbiAgICBnZXQgY29udGVudCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudDtcbiAgICB9XG5cbiAgICAvKiogTWVzc2FnZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBkZWNvcmF0ZWQgZWxlbWVudCB2aWEgYXJpYS1kZXNjcmliZWRieSAqL1xuICAgIEBJbnB1dChcInhtYXRCYWRnZURlc2NyaXB0aW9uXCIpXG4gICAgc2V0IGRlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKG5ld0Rlc2NyaXB0aW9uICE9PSB0aGlzLl9kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSG9zdEFyaWFEZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbiwgdGhpcy5fZGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGJhZGdlIGlzIGhpZGRlbi4gKi9cbiAgICBASW5wdXQoXCJ4bWF0QmFkZ2VIaWRkZW5cIilcbiAgICBnZXQgaGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faGlkZGVuO1xuICAgIH1cblxuICAgIHNldCBoaWRkZW4odmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2hpZGRlbiA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWwpO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBiYWRnZSBoYXMgYW55IGNvbnRlbnQuICovXG4gICAgaGFzQ29udGVudCA9IGZhbHNlO1xuICAgIC8qKiBVbmlxdWUgaWQgZm9yIHRoZSBiYWRnZSAqL1xuICAgIGlkOiBudW1iZXIgPSBYbWF0QmFkZ2VEaXJlY3RpdmUubmV4dElkKys7XG5cbiAgICBwcml2YXRlIF9iYWRnZUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgX2NvbG9yOiBUaGVtZVBhbGV0dGUgPSBcInByaW1hcnlcIjtcbiAgICBwcml2YXRlIF9jb250ZW50OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgICBwcml2YXRlIF9oaWRkZW46IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfb3ZlcmxhcDogYm9vbGVhbiA9IHRydWU7XG5cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2FyaWFEZXNjcmliZXI6IEFyaWFEZXNjcmliZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgICAgICAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG5cbiAgICAgICAgLy8gQnJpZGdlIHRvIHRoZSBuZXcgQW5ndWxhcjYgdHlwZWQgRWxlbWVudFJlZlxuICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gbmV3IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGJhZGdlIGlzIGFib3ZlIHRoZSBob3N0IG9yIG5vdCAqL1xuICAgIGlzQWJvdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uLmluZGV4T2YoXCJiZWxvd1wiKSA9PT0gLTE7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGJhZGdlIGlzIGFmdGVyIHRoZSBob3N0IG9yIG5vdCAqL1xuICAgIGlzQWZ0ZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uLmluZGV4T2YoXCJiZWZvcmVcIikgPT09IC0xO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdGlvbiAmJiB0aGlzLl9iYWRnZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FyaWFEZXNjcmliZXIucmVtb3ZlRGVzY3JpcHRpb24odGhpcy5fYmFkZ2VFbGVtZW50LCB0aGlzLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBJbmplY3RzIGEgc3BhbiBlbGVtZW50IGludG8gdGhlIERPTSB3aXRoIHRoZSBjb250ZW50LiAqL1xuICAgIHByaXZhdGUgX3VwZGF0ZVRleHRDb250ZW50KCk6IEhUTUxTcGFuRWxlbWVudCB7XG4gICAgICAgIGlmICghdGhpcy5fYmFkZ2VFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9iYWRnZUVsZW1lbnQgPSB0aGlzLl9jcmVhdGVCYWRnZUVsZW1lbnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2JhZGdlRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYmFkZ2VFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKiBDcmVhdGVzIHRoZSBiYWRnZSBlbGVtZW50ICovXG4gICAgcHJpdmF0ZSBfY3JlYXRlQmFkZ2VFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3Qgcm9vdE5vZGUgPSB0aGlzLl9yZW5kZXJlcjtcbiAgICAgICAgY29uc3QgYmFkZ2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUNsYXNzID0gXCJ4bWF0LWJhZGdlLWFjdGl2ZVwiO1xuXG4gICAgICAgIGJhZGdlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBgeG1hdC1iYWRnZS1jb250ZW50LSR7dGhpcy5pZH1gKTtcbiAgICAgICAgYmFkZ2VFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ4bWF0LWJhZGdlLWNvbnRlbnRcIik7XG4gICAgICAgIGJhZGdlRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuY29udGVudDtcblxuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgYmFkZ2VFbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdGhpcy5kZXNjcmlwdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoYmFkZ2VFbGVtZW50KTtcblxuICAgICAgICAvLyBhbmltYXRlIGluIGFmdGVyIGluc2VydGlvblxuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGJhZGdlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmFkZ2VFbGVtZW50LmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJhZGdlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKiogQWRkcyBjc3MgdGhlbWUgY2xhc3MgZ2l2ZW4gdGhlIGNvbG9yIHRvIHRoZSBjb21wb25lbnQgaG9zdCAqL1xuICAgIHByaXZhdGUgX3NldENvbG9yKGNvbG9yUGFsZXR0ZTogVGhlbWVQYWxldHRlKSB7XG4gICAgICAgIGlmIChjb2xvclBhbGV0dGUgIT09IHRoaXMuX2NvbG9yKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY29sb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShgeG1hdC1iYWRnZS0ke3RoaXMuX2NvbG9yfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbG9yUGFsZXR0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGB4bWF0LWJhZGdlLSR7Y29sb3JQYWxldHRlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFNldHMgdGhlIGFyaWEtbGFiZWwgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgKi9cbiAgICBwcml2YXRlIF91cGRhdGVIb3N0QXJpYURlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uOiBzdHJpbmcsIG9sZERlc2NyaXB0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gZW5zdXJlIGNvbnRlbnQgYXZhaWxhYmxlIGJlZm9yZSBzZXR0aW5nIGxhYmVsXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl91cGRhdGVUZXh0Q29udGVudCgpO1xuXG4gICAgICAgIGlmIChvbGREZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fYXJpYURlc2NyaWJlci5yZW1vdmVEZXNjcmlwdGlvbihjb250ZW50LCBvbGREZXNjcmlwdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3RGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2FyaWFEZXNjcmliZXIuZGVzY3JpYmUoY29udGVudCwgbmV3RGVzY3JpcHRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iXX0=