smart-webcomponents-angular
Version:
[](https://jqwidgets.com/license/)
362 lines • 61.5 kB
JavaScript
import { Directive, Input, Output, EventEmitter } from '@angular/core';
import { BaseElement, Smart } from './smart.element';
import * as i0 from "@angular/core";
export { Smart } from './smart.element';
export class AccordionComponent extends BaseElement {
constructor(ref) {
super(ref);
this.eventHandlers = [];
/** @description Triggered when an item has completed its collapse animation and is no longer expanded or visible. This event occurs only after the item is fully collapsed, ensuring that any associated transitions or content hiding have finished.
* @param event. The custom event. Custom event was created with: event.detail( content, index, label)
* content - The collapsed item's content.
* index - The index of the collapsed item.
* label - The label of the collapsed item.
*/
this.onCollapse = new EventEmitter();
/** @description Fires immediately before an item begins its collapse animation, allowing you to perform actions or prevent the collapse from occurring.
* @param event. The custom event. Custom event was created with: event.detail( content, index, label)
* content - The item content.
* index - The item's index.
* label - The item's label.
*/
this.onCollapsing = new EventEmitter();
/** @description Triggered when a user completes a drag-and-drop action to reorder items, indicating that the new order has been finalized and can be processed (e.g., saved or updated in the UI or backend).
* @param event. The custom event. Custom event was created with: event.detail( position, target, content, index, label)
* position - Current top and left coordinates of the dragged item.
* target - The dragged item element.
* content - The dragged item's content.
* index - The dragged item's index.
* label - The dragged item's label.
*/
this.onDragEnd = new EventEmitter();
/** @description Fires when the user initiates a drag-and-drop reorder action, signaling the start of an item being moved within a sortable list or container. This event provides an opportunity to perform setup tasks, such as highlighting the item being dragged or preparing the UI for reordering.
* @param event. The custom event. Custom event was created with: event.detail( position, target, content, index, label)
* position - Initial top and left coordinates of the item being dragged.
* target - The item element being dragged.
* content - The dragged item's content.
* index - The dragged item's index.
* label - The dragged item's label.
*/
this.onDragStart = new EventEmitter();
/** @description Triggered when an item has completed its expansion and is fully visible to the user. This event occurs after any expansion animations or transitions have finished, ensuring that the item's contents are now accessible for interaction.
* @param event. The custom event. Custom event was created with: event.detail( position, target, content, index, label)
* position - Current top and left coordinates of the expanded item.
* target - The expanded item element.
* content - The expanded item's content.
* index - The expanded item's index.
* label - The expanded item's label.
*/
this.onExpand = new EventEmitter();
/** @description Fires immediately before an item begins its expansion process, allowing you to perform actions or modify data right before the expansion occurs. This event provides an opportunity to prevent the expansion or make adjustments as needed.
* @param event. The custom event. Custom event was created with: event.detail( content, index, label)
* content - The content of the item being expanded.
* index - The index of the item being expanded.
* label - The label of the item being expanded.
*/
this.onExpanding = new EventEmitter();
this.nativeElement = ref.nativeElement;
}
/** @description Creates the component on demand.
* @param properties An optional object of properties, which will be added to the template binded ones.
*/
createComponent(properties = {}) {
this.nativeElement = document.createElement('smart-accordion');
for (let propertyName in properties) {
this.nativeElement[propertyName] = properties[propertyName];
}
return this.nativeElement;
}
/** @description Configures or retrieves the current animation mode. When set to 'none', all animations are disabled, resulting in instant transitions without animated effects. Setting this property to other supported values enables different animation behaviors. */
get animation() {
return this.nativeElement ? this.nativeElement.animation : undefined;
}
set animation(value) {
this.nativeElement ? this.nativeElement.animation = value : undefined;
}
/** @description Specifies the data source to be loaded and displayed within the Accordion component. This property defines the collection of items or structured data that populates each section or panel of the Accordion, enabling dynamic rendering of its contents. The data source can typically be provided as an array of objects, JSON data, or via a remote endpoint depending on configuration. */
get dataSource() {
return this.nativeElement ? this.nativeElement.dataSource : undefined;
}
set dataSource(value) {
this.nativeElement ? this.nativeElement.dataSource = value : undefined;
}
/** @description Controls whether the accordion component is enabled or disabled. When set to disabled, all interactive functionality is turned off—users cannot expand, collapse, or interact with any accordion sections. Disabled accordions appear visually inactive to indicate their non-interactive state. */
get disabled() {
return this.nativeElement ? this.nativeElement.disabled : undefined;
}
set disabled(value) {
this.nativeElement ? this.nativeElement.disabled = value : undefined;
}
/** @description Sets or retrieves the indexes of currently expanded items. By assigning an array of item indexes to this property, you can programmatically expand those specific items. The maximum number of items that can be expanded at once depends on the value specified in the expandMode property (for example, single or multiple expansion modes). When getting this property, it returns an array of the indexes of all expanded items. */
get expandedIndexes() {
return this.nativeElement ? this.nativeElement.expandedIndexes : undefined;
}
set expandedIndexes(value) {
this.nativeElement ? this.nativeElement.expandedIndexes = value : undefined;
}
/** @description Sets or retrieves the current expand mode. The expand mode specifies how list or group items behave when expanding or collapsing—such as allowing multiple items to expand simultaneously or restricting expansion to a single item at a time. */
get expandMode() {
return this.nativeElement ? this.nativeElement.expandMode : undefined;
}
set expandMode(value) {
this.nativeElement ? this.nativeElement.expandMode = value : undefined;
}
/** @description Retrieves or assigns the 'unlockKey' property, which serves as the access credential required to unlock and activate the product's full features. */
get unlockKey() {
return this.nativeElement ? this.nativeElement.unlockKey : undefined;
}
set unlockKey(value) {
this.nativeElement ? this.nativeElement.unlockKey = value : undefined;
}
/** @description Sets or retrieves the current language code (e.g., "en", "fr") for the component. This property works together with the messages property to determine which language-specific messages or translations are displayed. Use this to localize your application content based on user preference or locale. */
get locale() {
return this.nativeElement ? this.nativeElement.locale : undefined;
}
set locale(value) {
this.nativeElement ? this.nativeElement.locale = value : undefined;
}
/** @description A callback function that allows you to customize the formatting of messages returned by the Localization Module. Use this to modify or enhance localized message output—such as applying dynamic content, adjusting text structure, or handling language-specific variations—before the messages are delivered to the client application. */
get localizeFormatFunction() {
return this.nativeElement ? this.nativeElement.localizeFormatFunction : undefined;
}
set localizeFormatFunction(value) {
this.nativeElement ? this.nativeElement.localizeFormatFunction = value : undefined;
}
/** @description Specifies or retrieves an object containing the localized strings used throughout the widget interface. This allows you to define custom translations for various UI elements in different languages. Used together with the locale property to enable localization and internationalization support within the widget. */
get messages() {
return this.nativeElement ? this.nativeElement.messages : undefined;
}
set messages(value) {
this.nativeElement ? this.nativeElement.messages = value : undefined;
}
/** @description Indicates whether the element is read-only. When set to true, the element cannot be modified or interacted with by users; its value is fixed and user input is disabled. If false, the element remains editable and interactive. */
get readonly() {
return this.nativeElement ? this.nativeElement.readonly : undefined;
}
set readonly(value) {
this.nativeElement ? this.nativeElement.readonly = value : undefined;
}
/** @description Controls whether users can reorder accordion items by dragging and dropping them. When enabled, items within the accordion component can be rearranged interactively; when disabled, the order of items remains fixed. */
get reorder() {
return this.nativeElement ? this.nativeElement.reorder : undefined;
}
set reorder(value) {
this.nativeElement ? this.nativeElement.reorder = value : undefined;
}
/** @description Specifies or retrieves a value that determines whether the element is aligned to accommodate right-to-left (RTL) languages and scripts, such as Arabic or Hebrew. This property ensures the element’s layout and text direction are properly adjusted to support RTL localization. */
get rightToLeft() {
return this.nativeElement ? this.nativeElement.rightToLeft : undefined;
}
set rightToLeft(value) {
this.nativeElement ? this.nativeElement.rightToLeft = value : undefined;
}
/** @description Specifies the theme to be applied, which controls the overall appearance and visual style of the element, including aspects such as colors, fonts, and background. */
get theme() {
return this.nativeElement ? this.nativeElement.theme : undefined;
}
set theme(value) {
this.nativeElement ? this.nativeElement.theme = value : undefined;
}
/** @description Specifies whether the element is capable of receiving keyboard focus, allowing users to navigate to it using the keyboard (such as the Tab key) and interact with it through assistive technologies. */
get unfocusable() {
return this.nativeElement ? this.nativeElement.unfocusable : undefined;
}
set unfocusable(value) {
this.nativeElement ? this.nativeElement.unfocusable = value : undefined;
}
/** @description Collapses the item located at the specified index, hiding its associated content or details from view. This action typically updates the user interface to indicate that the item is no longer expanded.
* @param {number} position. Index of the item to collapse.
*/
collapse(position) {
if (this.nativeElement.isRendered) {
this.nativeElement.collapse(position);
}
else {
this.nativeElement.whenRendered(() => {
this.nativeElement.collapse(position);
});
}
}
/** @description Expands the item located at the specified index in the collection, making its detailed content visible or accessible to the user.
* @param {number} position. Index of the item to expand.
*/
expand(position) {
if (this.nativeElement.isRendered) {
this.nativeElement.expand(position);
}
else {
this.nativeElement.whenRendered(() => {
this.nativeElement.expand(position);
});
}
}
/** @description Inserts a new item into the array at the specified index, shifting existing elements to the right to accommodate the new entry. If the specified index is out of range, the operation will either append the item to the end or return an error, depending on the implementation.
* @param {number} index. Index where the new item will be inserted.
* @param {any} item. Object representing the new item's properties.
*/
insert(index, item) {
if (this.nativeElement.isRendered) {
this.nativeElement.insert(index, item);
}
else {
this.nativeElement.whenRendered(() => {
this.nativeElement.insert(index, item);
});
}
}
/** @description Removes the item located at the specified index from the array, shifting subsequent items one position to the left. The array's length is reduced by one, and the removed item is no longer accessible.
* @param {number} position. Index of the item to remove.
*/
removeAt(position) {
if (this.nativeElement.isRendered) {
this.nativeElement.removeAt(position);
}
else {
this.nativeElement.whenRendered(() => {
this.nativeElement.removeAt(position);
});
}
}
/** @description Replaces the item at the given index in the collection with an updated version, incorporating the specified new property values while preserving any unchanged properties.
* @param {number} index. Index of the item to update.
* @param {any} settings. Object containing updated property values for the item.
*/
update(index, settings) {
if (this.nativeElement.isRendered) {
this.nativeElement.update(index, settings);
}
else {
this.nativeElement.whenRendered(() => {
this.nativeElement.update(index, settings);
});
}
}
/** @description Sets the locale of a component.
* @param {string} locale. The locale abbreviation. For example: 'de'.
* @param {any} messages?. Object containing the locale messages.
*/
setLocale(locale, messages) {
if (this.nativeElement.isRendered) {
this.nativeElement.setLocale(locale, messages);
}
else {
this.nativeElement.whenRendered(() => {
this.nativeElement.setLocale(locale, messages);
});
}
}
get isRendered() {
return this.nativeElement ? this.nativeElement.isRendered : false;
}
ngOnInit() {
}
ngAfterViewInit() {
const that = this;
that.onCreate.emit(that.nativeElement);
if (Smart)
Smart.Render();
this.nativeElement.classList.add('smart-angular');
if (this.nativeElement.whenRendered)
this.nativeElement.whenRendered(() => { that.onReady.emit(that.nativeElement); });
this.listen();
}
ngOnDestroy() {
this.unlisten();
}
ngOnChanges(changes) {
if (this.nativeElement && this.nativeElement.isRendered) {
for (const propName in changes) {
if (changes.hasOwnProperty(propName)) {
this.nativeElement[propName] = changes[propName].currentValue;
}
}
}
}
/** @description Add event listeners. */
listen() {
const that = this;
that.eventHandlers['collapseHandler'] = (event) => { that.onCollapse.emit(event); };
that.nativeElement.addEventListener('collapse', that.eventHandlers['collapseHandler']);
that.eventHandlers['collapsingHandler'] = (event) => { that.onCollapsing.emit(event); };
that.nativeElement.addEventListener('collapsing', that.eventHandlers['collapsingHandler']);
that.eventHandlers['dragEndHandler'] = (event) => { that.onDragEnd.emit(event); };
that.nativeElement.addEventListener('dragEnd', that.eventHandlers['dragEndHandler']);
that.eventHandlers['dragStartHandler'] = (event) => { that.onDragStart.emit(event); };
that.nativeElement.addEventListener('dragStart', that.eventHandlers['dragStartHandler']);
that.eventHandlers['expandHandler'] = (event) => { that.onExpand.emit(event); };
that.nativeElement.addEventListener('expand', that.eventHandlers['expandHandler']);
that.eventHandlers['expandingHandler'] = (event) => { that.onExpanding.emit(event); };
that.nativeElement.addEventListener('expanding', that.eventHandlers['expandingHandler']);
}
/** @description Remove event listeners. */
unlisten() {
const that = this;
if (that.eventHandlers['collapseHandler']) {
that.nativeElement.removeEventListener('collapse', that.eventHandlers['collapseHandler']);
}
if (that.eventHandlers['collapsingHandler']) {
that.nativeElement.removeEventListener('collapsing', that.eventHandlers['collapsingHandler']);
}
if (that.eventHandlers['dragEndHandler']) {
that.nativeElement.removeEventListener('dragEnd', that.eventHandlers['dragEndHandler']);
}
if (that.eventHandlers['dragStartHandler']) {
that.nativeElement.removeEventListener('dragStart', that.eventHandlers['dragStartHandler']);
}
if (that.eventHandlers['expandHandler']) {
that.nativeElement.removeEventListener('expand', that.eventHandlers['expandHandler']);
}
if (that.eventHandlers['expandingHandler']) {
that.nativeElement.removeEventListener('expanding', that.eventHandlers['expandingHandler']);
}
}
}
AccordionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: AccordionComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
AccordionComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.6", type: AccordionComponent, selector: "smart-accordion, [smart-accordion]", inputs: { animation: "animation", dataSource: "dataSource", disabled: "disabled", expandedIndexes: "expandedIndexes", expandMode: "expandMode", unlockKey: "unlockKey", locale: "locale", localizeFormatFunction: "localizeFormatFunction", messages: "messages", readonly: "readonly", reorder: "reorder", rightToLeft: "rightToLeft", theme: "theme", unfocusable: "unfocusable" }, outputs: { onCollapse: "onCollapse", onCollapsing: "onCollapsing", onDragEnd: "onDragEnd", onDragStart: "onDragStart", onExpand: "onExpand", onExpanding: "onExpanding" }, exportAs: ["smart-accordion"], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: AccordionComponent, decorators: [{
type: Directive,
args: [{
exportAs: 'smart-accordion', selector: 'smart-accordion, [smart-accordion]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { animation: [{
type: Input
}], dataSource: [{
type: Input
}], disabled: [{
type: Input
}], expandedIndexes: [{
type: Input
}], expandMode: [{
type: Input
}], unlockKey: [{
type: Input
}], locale: [{
type: Input
}], localizeFormatFunction: [{
type: Input
}], messages: [{
type: Input
}], readonly: [{
type: Input
}], reorder: [{
type: Input
}], rightToLeft: [{
type: Input
}], theme: [{
type: Input
}], unfocusable: [{
type: Input
}], onCollapse: [{
type: Output
}], onCollapsing: [{
type: Output
}], onDragEnd: [{
type: Output
}], onDragStart: [{
type: Output
}], onExpand: [{
type: Output
}], onExpanding: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQuYWNjb3JkaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYWNjb3JkaW9uL3NyYy9zbWFydC5hY2NvcmRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFhLFNBQVMsRUFBNkIsS0FBSyxFQUErQyxNQUFNLEVBQUUsWUFBWSxFQUE4QixNQUFNLGVBQWUsQ0FBQztBQUN0TCxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUVyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFVeEMsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFdBQVc7SUFFbEQsWUFBWSxHQUEwQjtRQUNyQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFJSixrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQTJJbEM7Ozs7O1VBS0U7UUFDUSxlQUFVLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFckU7Ozs7O1VBS0U7UUFDUSxpQkFBWSxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXZFOzs7Ozs7O1VBT0U7UUFDUSxjQUFTLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFcEU7Ozs7Ozs7VUFPRTtRQUNRLGdCQUFXLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFdEU7Ozs7Ozs7VUFPRTtRQUNRLGFBQVEsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVuRTs7Ozs7VUFLRTtRQUNRLGdCQUFXLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFsTXJFLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLGFBQTBCLENBQUM7SUFDckQsQ0FBQztJQUtEOztPQUVHO0lBQ0ksZUFBZSxDQUFDLFVBQVUsR0FBRyxFQUFFO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQWMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdFLEtB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SztnQkFVRixPQUFPO3NCQURWLEtBQUs7Z0JBVUYsV0FBVztzQkFEZCxLQUFLO2dCQVVGLEtBQUs7c0JBRFIsS0FBSztnQkFVRixXQUFXO3NCQURkLEtBQUs7Z0JBY0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFRRyxZQUFZO3NCQUFyQixNQUFNO2dCQVVHLFNBQVM7c0JBQWxCLE1BQU07Z0JBVUcsV0FBVztzQkFBcEIsTUFBTTtnQkFVRyxRQUFRO3NCQUFqQixNQUFNO2dCQVFHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2NvcmRpb24gfSBmcm9tICcuLy4uL2luZGV4JztcbmltcG9ydCB7IEFuaW1hdGlvbiwgQWNjb3JkaW9uRXhwYW5kTW9kZSwgRWxlbWVudFJlbmRlck1vZGV9IGZyb20gJy4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBEaXJlY3RpdmUsIEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgUXVlcnlMaXN0LCBDb250ZW50Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhc2VFbGVtZW50LCBTbWFydCB9IGZyb20gJy4vc21hcnQuZWxlbWVudCc7XG5leHBvcnQgeyBBbmltYXRpb24sIEFjY29yZGlvbkV4cGFuZE1vZGUsIEVsZW1lbnRSZW5kZXJNb2RlfSBmcm9tICcuLy4uL2luZGV4JztcbmV4cG9ydCB7IFNtYXJ0IH0gZnJvbSAnLi9zbWFydC5lbGVtZW50JztcbmV4cG9ydCB7IEFjY29yZGlvbiB9IGZyb20gJy4vLi4vaW5kZXgnO1xuXG5cbmltcG9ydCB7IEFjY29yZGlvbkl0ZW1Db21wb25lbnQgfSBmcm9tICcuL3NtYXJ0LmFjY29yZGlvbml0ZW0nO1xuXG5ARGlyZWN0aXZlKHtcblx0ZXhwb3J0QXM6ICdzbWFydC1hY2NvcmRpb24nLFx0c2VsZWN0b3I6ICdzbWFydC1hY2NvcmRpb24sIFtzbWFydC1hY2NvcmRpb25dJ1xufSlcblxuZXhwb3J0IGNsYXNzIEFjY29yZGlvbkNvbXBvbmVudCBleHRlbmRzIEJhc2VFbGVtZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cblx0Y29uc3RydWN0b3IocmVmOiBFbGVtZW50UmVmPEFjY29yZGlvbj4pIHtcblx0XHRzdXBlcihyZWYpO1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA9IHJlZi5uYXRpdmVFbGVtZW50IGFzIEFjY29yZGlvbjtcblx0fVxuXG5cdHByaXZhdGUgZXZlbnRIYW5kbGVyczogYW55W10gPSBbXTtcblxuXHRwdWJsaWMgZGVjbGFyZSBuYXRpdmVFbGVtZW50OiBBY2NvcmRpb247XG5cdC8qKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgY29tcG9uZW50IG9uIGRlbWFuZC5cblx0ICogQHBhcmFtIHByb3BlcnRpZXMgQW4gb3B0aW9uYWwgb2JqZWN0IG9mIHByb3BlcnRpZXMsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRlbXBsYXRlIGJpbmRlZCBvbmVzLlxuXHQgKi9cblx0cHVibGljIGNyZWF0ZUNvbXBvbmVudChwcm9wZXJ0aWVzID0ge30pOiBhbnkge1xuICAgIFx0dGhpcy5uYXRpdmVFbGVtZW50ID0gPEFjY29yZGlvbj5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzbWFydC1hY2NvcmRpb24nKTtcblx0XHRmb3IgKGxldCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykgeyBcbiBcdFx0XHR0aGlzLm5hdGl2ZUVsZW1lbnRbcHJvcGVydHlOYW1lXSA9IHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudDtcblx0fVxuXHQvKiogQGRlc2NyaXB0aW9uIENvbmZpZ3VyZXMgb3IgcmV0cmlldmVzIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBtb2RlLiBXaGVuIHNldCB0byAnbm9uZScsIGFsbCBhbmltYXRpb25zIGFyZSBkaXNhYmxlZCwgcmVzdWx0aW5nIGluIGluc3RhbnQgdHJhbnNpdGlvbnMgd2l0aG91dCBhbmltYXRlZCBlZmZlY3RzLiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gb3RoZXIgc3VwcG9ydGVkIHZhbHVlcyBlbmFibGVzIGRpZmZlcmVudCBhbmltYXRpb24gYmVoYXZpb3JzLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgYW5pbWF0aW9uKCk6IEFuaW1hdGlvbiB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hbmltYXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGFuaW1hdGlvbih2YWx1ZTogQW5pbWF0aW9uIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmFuaW1hdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGEgc291cmNlIHRvIGJlIGxvYWRlZCBhbmQgZGlzcGxheWVkIHdpdGhpbiB0aGUgQWNjb3JkaW9uIGNvbXBvbmVudC4gVGhpcyBwcm9wZXJ0eSBkZWZpbmVzIHRoZSBjb2xsZWN0aW9uIG9mIGl0ZW1zIG9yIHN0cnVjdHVyZWQgZGF0YSB0aGF0IHBvcHVsYXRlcyBlYWNoIHNlY3Rpb24gb3IgcGFuZWwgb2YgdGhlIEFjY29yZGlvbiwgZW5hYmxpbmcgZHluYW1pYyByZW5kZXJpbmcgb2YgaXRzIGNvbnRlbnRzLiBUaGUgZGF0YSBzb3VyY2UgY2FuIHR5cGljYWxseSBiZSBwcm92aWRlZCBhcyBhbiBhcnJheSBvZiBvYmplY3RzLCBKU09OIGRhdGEsIG9yIHZpYSBhIHJlbW90ZSBlbmRwb2ludCBkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbi4gKi9cblx0QElucHV0KClcblx0Z2V0IGRhdGFTb3VyY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRhdGFTb3VyY2UgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRhdGFTb3VyY2UodmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kYXRhU291cmNlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdGhlIGFjY29yZGlvbiBjb21wb25lbnQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gV2hlbiBzZXQgdG8gZGlzYWJsZWQsIGFsbCBpbnRlcmFjdGl2ZSBmdW5jdGlvbmFsaXR5IGlzIHR1cm5lZCBvZmbigJR1c2VycyBjYW5ub3QgZXhwYW5kLCBjb2xsYXBzZSwgb3IgaW50ZXJhY3Qgd2l0aCBhbnkgYWNjb3JkaW9uIHNlY3Rpb25zLiBEaXNhYmxlZCBhY2NvcmRpb25zIGFwcGVhciB2aXN1YWxseSBpbmFjdGl2ZSB0byBpbmRpY2F0ZSB0aGVpciBub24taW50ZXJhY3RpdmUgc3RhdGUuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIHJldHJpZXZlcyB0aGUgaW5kZXhlcyBvZiBjdXJyZW50bHkgZXhwYW5kZWQgaXRlbXMuIEJ5IGFzc2lnbmluZyBhbiBhcnJheSBvZiBpdGVtIGluZGV4ZXMgdG8gdGhpcyBwcm9wZXJ0eSwgeW91IGNhbiBwcm9ncmFtbWF0aWNhbGx5IGV4cGFuZCB0aG9zZSBzcGVjaWZpYyBpdGVtcy4gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIGV4cGFuZGVkIGF0IG9uY2UgZGVwZW5kcyBvbiB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBleHBhbmRNb2RlIHByb3BlcnR5IChmb3IgZXhhbXBsZSwgc2luZ2xlIG9yIG11bHRpcGxlIGV4cGFuc2lvbiBtb2RlcykuIFdoZW4gZ2V0dGluZyB0aGlzIHByb3BlcnR5LCBpdCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBpbmRleGVzIG9mIGFsbCBleHBhbmRlZCBpdGVtcy4gKi9cblx0QElucHV0KClcblx0Z2V0IGV4cGFuZGVkSW5kZXhlcygpOiBudW1iZXJbXSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5leHBhbmRlZEluZGV4ZXMgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGV4cGFuZGVkSW5kZXhlcyh2YWx1ZTogbnVtYmVyW10pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZXhwYW5kZWRJbmRleGVzID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgcmV0cmlldmVzIHRoZSBjdXJyZW50IGV4cGFuZCBtb2RlLiBUaGUgZXhwYW5kIG1vZGUgc3BlY2lmaWVzIGhvdyBsaXN0IG9yIGdyb3VwIGl0ZW1zIGJlaGF2ZSB3aGVuIGV4cGFuZGluZyBvciBjb2xsYXBzaW5n4oCUc3VjaCBhcyBhbGxvd2luZyBtdWx0aXBsZSBpdGVtcyB0byBleHBhbmQgc2ltdWx0YW5lb3VzbHkgb3IgcmVzdHJpY3RpbmcgZXhwYW5zaW9uIHRvIGEgc2luZ2xlIGl0ZW0gYXQgYSB0aW1lLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZXhwYW5kTW9kZSgpOiBBY2NvcmRpb25FeHBhbmRNb2RlIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmV4cGFuZE1vZGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGV4cGFuZE1vZGUodmFsdWU6IEFjY29yZGlvbkV4cGFuZE1vZGUgfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZXhwYW5kTW9kZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3IgYXNzaWducyB0aGUgJ3VubG9ja0tleScgcHJvcGVydHksIHdoaWNoIHNlcnZlcyBhcyB0aGUgYWNjZXNzIGNyZWRlbnRpYWwgcmVxdWlyZWQgdG8gdW5sb2NrIGFuZCBhY3RpdmF0ZSB0aGUgcHJvZHVjdCdzIGZ1bGwgZmVhdHVyZXMuICovXG5cdEBJbnB1dCgpXG5cdGdldCB1bmxvY2tLZXkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnVubG9ja0tleSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdW5sb2NrS2V5KHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudW5sb2NrS2V5ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgcmV0cmlldmVzIHRoZSBjdXJyZW50IGxhbmd1YWdlIGNvZGUgKGUuZy4sIFwiZW5cIiwgXCJmclwiKSBmb3IgdGhlIGNvbXBvbmVudC4gVGhpcyBwcm9wZXJ0eSB3b3JrcyB0b2dldGhlciB3aXRoIHRoZSBtZXNzYWdlcyBwcm9wZXJ0eSB0byBkZXRlcm1pbmUgd2hpY2ggbGFuZ3VhZ2Utc3BlY2lmaWMgbWVzc2FnZXMgb3IgdHJhbnNsYXRpb25zIGFyZSBkaXNwbGF5ZWQuIFVzZSB0aGlzIHRvIGxvY2FsaXplIHlvdXIgYXBwbGljYXRpb24gY29udGVudCBiYXNlZCBvbiB1c2VyIHByZWZlcmVuY2Ugb3IgbG9jYWxlLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sb2NhbGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvY2FsZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHlvdSB0byBjdXN0b21pemUgdGhlIGZvcm1hdHRpbmcgb2YgbWVzc2FnZXMgcmV0dXJuZWQgYnkgdGhlIExvY2FsaXphdGlvbiBNb2R1bGUuIFVzZSB0aGlzIHRvIG1vZGlmeSBvciBlbmhhbmNlIGxvY2FsaXplZCBtZXNzYWdlIG91dHB1dOKAlHN1Y2ggYXMgYXBwbHlpbmcgZHluYW1pYyBjb250ZW50LCBhZGp1c3RpbmcgdGV4dCBzdHJ1Y3R1cmUsIG9yIGhhbmRsaW5nIGxhbmd1YWdlLXNwZWNpZmljIHZhcmlhdGlvbnPigJRiZWZvcmUgdGhlIG1lc3NhZ2VzIGFyZSBkZWxpdmVyZWQgdG8gdGhlIGNsaWVudCBhcHBsaWNhdGlvbi4gKi9cblx0QElucHV0KClcblx0Z2V0IGxvY2FsaXplRm9ybWF0RnVuY3Rpb24oKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvY2FsaXplRm9ybWF0RnVuY3Rpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGxvY2FsaXplRm9ybWF0RnVuY3Rpb24odmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sb2NhbGl6ZUZvcm1hdEZ1bmN0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyBvciByZXRyaWV2ZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxvY2FsaXplZCBzdHJpbmdzIHVzZWQgdGhyb3VnaG91dCB0aGUgd2lkZ2V0IGludGVyZmFjZS4gVGhpcyBhbGxvd3MgeW91IHRvIGRlZmluZSBjdXN0b20gdHJhbnNsYXRpb25zIGZvciB2YXJpb3VzIFVJIGVsZW1lbnRzIGluIGRpZmZlcmVudCBsYW5ndWFnZXMuIFVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgbG9jYWxlIHByb3BlcnR5IHRvIGVuYWJsZSBsb2NhbGl6YXRpb24gYW5kIGludGVybmF0aW9uYWxpemF0aW9uIHN1cHBvcnQgd2l0aGluIHRoZSB3aWRnZXQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBtZXNzYWdlcygpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWVzc2FnZXMgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG1lc3NhZ2VzKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWVzc2FnZXMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgcmVhZC1vbmx5LiBXaGVuIHNldCB0byB0cnVlLCB0aGUgZWxlbWVudCBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgaW50ZXJhY3RlZCB3aXRoIGJ5IHVzZXJzOyBpdHMgdmFsdWUgaXMgZml4ZWQgYW5kIHVzZXIgaW5wdXQgaXMgZGlzYWJsZWQuIElmIGZhbHNlLCB0aGUgZWxlbWVudCByZW1haW5zIGVkaXRhYmxlIGFuZCBpbnRlcmFjdGl2ZS4gKi9cblx0QElucHV0KClcblx0Z2V0IHJlYWRvbmx5KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVhZG9ubHkgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlYWRvbmx5ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdXNlcnMgY2FuIHJlb3JkZXIgYWNjb3JkaW9uIGl0ZW1zIGJ5IGRyYWdnaW5nIGFuZCBkcm9wcGluZyB0aGVtLiBXaGVuIGVuYWJsZWQsIGl0ZW1zIHdpdGhpbiB0aGUgYWNjb3JkaW9uIGNvbXBvbmVudCBjYW4gYmUgcmVhcnJhbmdlZCBpbnRlcmFjdGl2ZWx5OyB3aGVuIGRpc2FibGVkLCB0aGUgb3JkZXIgb2YgaXRlbXMgcmVtYWlucyBmaXhlZC4gKi9cblx0QElucHV0KClcblx0Z2V0IHJlb3JkZXIoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZW9yZGVyIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCByZW9yZGVyKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlb3JkZXIgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIG9yIHJldHJpZXZlcyBhIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGFsaWduZWQgdG8gYWNjb21tb2RhdGUgcmlnaHQtdG8tbGVmdCAoUlRMKSBsYW5ndWFnZXMgYW5kIHNjcmlwdHMsIHN1Y2ggYXMgQXJhYmljIG9yIEhlYnJldy4gVGhpcyBwcm9wZXJ0eSBlbnN1cmVzIHRoZSBlbGVtZW504oCZcyBsYXlvdXQgYW5kIHRleHQgZGlyZWN0aW9uIGFyZSBwcm9wZXJseSBhZGp1c3RlZCB0byBzdXBwb3J0IFJUTCBsb2NhbGl6YXRpb24uICovXG5cdEBJbnB1dCgpXG5cdGdldCByaWdodFRvTGVmdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJpZ2h0VG9MZWZ0IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCByaWdodFRvTGVmdCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yaWdodFRvTGVmdCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIHRoZW1lIHRvIGJlIGFwcGxpZWQsIHdoaWNoIGNvbnRyb2xzIHRoZSBvdmVyYWxsIGFwcGVhcmFuY2UgYW5kIHZpc3VhbCBzdHlsZSBvZiB0aGUgZWxlbWVudCwgaW5jbHVkaW5nIGFzcGVjdHMgc3VjaCBhcyBjb2xvcnMsIGZvbnRzLCBhbmQgYmFja2dyb3VuZC4gKi9cblx0QElucHV0KClcblx0Z2V0IHRoZW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50aGVtZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdGhlbWUodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50aGVtZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgd2hldGhlciB0aGUgZWxlbWVudCBpcyBjYXBhYmxlIG9mIHJlY2VpdmluZyBrZXlib2FyZCBmb2N1cywgYWxsb3dpbmcgdXNlcnMgdG8gbmF2aWdhdGUgdG8gaXQgdXNpbmcgdGhlIGtleWJvYXJkIChzdWNoIGFzIHRoZSBUYWIga2V5KSBhbmQgaW50ZXJhY3Qgd2l0aCBpdCB0aHJvdWdoIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMuICovXG5cdEBJbnB1dCgpXG5cdGdldCB1bmZvY3VzYWJsZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnVuZm9jdXNhYmxlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB1bmZvY3VzYWJsZSh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC51bmZvY3VzYWJsZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUcmlnZ2VyZWQgd2hlbiBhbiBpdGVtIGhhcyBjb21wbGV0ZWQgaXRzIGNvbGxhcHNlIGFuaW1hdGlvbiBhbmQgaXMgbm8gbG9uZ2VyIGV4cGFuZGVkIG9yIHZpc2libGUuIFRoaXMgZXZlbnQgb2NjdXJzIG9ubHkgYWZ0ZXIgdGhlIGl0ZW0gaXMgZnVsbHkgY29sbGFwc2VkLCBlbnN1cmluZyB0aGF0IGFueSBhc3NvY2lhdGVkIHRyYW5zaXRpb25zIG9yIGNvbnRlbnQgaGlkaW5nIGhhdmUgZmluaXNoZWQuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHRDdXN0b20gZXZlbnQgd2FzIGNyZWF0ZWQgd2l0aDogZXZlbnQuZGV0YWlsKFx0Y29udGVudCwgXHRpbmRleCwgXHRsYWJlbClcblx0KiAgIGNvbnRlbnQgLSBUaGUgY29sbGFwc2VkIGl0ZW0ncyBjb250ZW50LlxuXHQqICAgaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGNvbGxhcHNlZCBpdGVtLlxuXHQqICAgbGFiZWwgLSBUaGUgbGFiZWwgb2YgdGhlIGNvbGxhcHNlZCBpdGVtLlxuXHQqL1xuXHRAT3V0cHV0KCkgb25Db2xsYXBzZTogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIEZpcmVzIGltbWVkaWF0ZWx5IGJlZm9yZSBhbiBpdGVtIGJlZ2lucyBpdHMgY29sbGFwc2UgYW5pbWF0aW9uLCBhbGxvd2luZyB5b3UgdG8gcGVyZm9ybSBhY3Rpb25zIG9yIHByZXZlbnQgdGhlIGNvbGxhcHNlIGZyb20gb2NjdXJyaW5nLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Q3VzdG9tIGV2ZW50IHdhcyBjcmVhdGVkIHdpdGg6IGV2ZW50LmRldGFpbChcdGNvbnRlbnQsIFx0aW5kZXgsIFx0bGFiZWwpXG5cdCogICBjb250ZW50IC0gVGhlIGl0ZW0gY29udGVudC5cblx0KiAgIGluZGV4IC0gVGhlIGl0ZW0ncyBpbmRleC5cblx0KiAgIGxhYmVsIC0gVGhlIGl0ZW0ncyBsYWJlbC5cblx0Ki9cblx0QE91dHB1dCgpIG9uQ29sbGFwc2luZzogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRyaWdnZXJlZCB3aGVuIGEgdXNlciBjb21wbGV0ZXMgYSBkcmFnLWFuZC1kcm9wIGFjdGlvbiB0byByZW9yZGVyIGl0ZW1zLCBpbmRpY2F0aW5nIHRoYXQgdGhlIG5ldyBvcmRlciBoYXMgYmVlbiBmaW5hbGl6ZWQgYW5kIGNhbiBiZSBwcm9jZXNzZWQgKGUuZy4sIHNhdmVkIG9yIHVwZGF0ZWQgaW4gdGhlIFVJIG9yIGJhY2tlbmQpLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Q3VzdG9tIGV2ZW50IHdhcyBjcmVhdGVkIHdpdGg6IGV2ZW50LmRldGFpbChcdHBvc2l0aW9uLCBcdHRhcmdldCwgXHRjb250ZW50LCBcdGluZGV4LCBcdGxhYmVsKVxuXHQqICAgcG9zaXRpb24gLSBDdXJyZW50IHRvcCBhbmQgbGVmdCBjb29yZGluYXRlcyBvZiB0aGUgZHJhZ2dlZCBpdGVtLlxuXHQqICAgdGFyZ2V0IC0gVGhlIGRyYWdnZWQgaXRlbSBlbGVtZW50LlxuXHQqICAgY29udGVudCAtIFRoZSBkcmFnZ2VkIGl0ZW0ncyBjb250ZW50LlxuXHQqICAgaW5kZXggLSBUaGUgZHJhZ2dlZCBpdGVtJ3MgaW5kZXguXG5cdCogICBsYWJlbCAtIFRoZSBkcmFnZ2VkIGl0ZW0ncyBsYWJlbC5cblx0Ki9cblx0QE91dHB1dCgpIG9uRHJhZ0VuZDogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIEZpcmVzIHdoZW4gdGhlIHVzZXIgaW5pdGlhdGVzIGEgZHJhZy1hbmQtZHJvcCByZW9yZGVyIGFjdGlvbiwgc2lnbmFsaW5nIHRoZSBzdGFydCBvZiBhbiBpdGVtIGJlaW5nIG1vdmVkIHdpdGhpbiBhIHNvcnRhYmxlIGxpc3Qgb3IgY29udGFpbmVyLiBUaGlzIGV2ZW50IHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvIHBlcmZvcm0gc2V0dXAgdGFza3MsIHN1Y2ggYXMgaGlnaGxpZ2h0aW5nIHRoZSBpdGVtIGJlaW5nIGRyYWdnZWQgb3IgcHJlcGFyaW5nIHRoZSBVSSBmb3IgcmVvcmRlcmluZy5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdEN1c3RvbSBldmVudCB3YXMgY3JlYXRlZCB3aXRoOiBldmVudC5kZXRhaWwoXHRwb3NpdGlvbiwgXHR0YXJnZXQsIFx0Y29udGVudCwgXHRpbmRleCwgXHRsYWJlbClcblx0KiAgIHBvc2l0aW9uIC0gSW5pdGlhbCB0b3AgYW5kIGxlZ