UNPKG

@kushki/ng-suka

Version:

<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>

342 lines (339 loc) 25.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, HostBinding, ViewChild, HostListener, SecurityContext } from '@angular/core'; import * as prism from 'prismjs'; import 'prismjs/components/prism-markup-templating.js'; import 'prismjs/components/prism-typescript'; import 'prismjs/components/prism-php'; import 'prismjs/components/prism-ruby'; import 'prismjs/components/prism-json'; import 'prismjs/components/prism-java'; import 'prismjs/components/prism-markdown'; import 'prismjs/components/prism-scss'; import 'prismjs/components/prism-swift'; import { DomSanitizer } from '@angular/platform-browser'; /** @enum {string} */ const SnippetType = { single: 'single', multi: 'multi', inline: 'inline', }; export { SnippetType }; /** @enum {string} */ const SnippetLanguage = { javascript: 'javascript', json: 'json', typescript: 'typescript', markup: 'markup', markdown: 'markdown', php: 'php', ruby: 'ruby', scss: 'scss', css: 'css', html: 'html', xml: 'xml', clike: 'clike', java: 'java', swift: 'swift', }; export { SnippetLanguage }; // tslint:disable-next-line: component-class-suffix export class CodeSnippet { /** * Creates an instance of CodeSnippet. * @param {?} sanitizer */ constructor(sanitizer) { this.sanitizer = sanitizer; /** * It can be `"single"`, `"multi"` or `"inline"` */ this.display = SnippetType.single; /** * Text displayed in the tooltip when user clicks button to copy code. * */ this.feedbackText = 'Copiado'; // TODO: i18n /** * Snippet highlight language * */ this.language = SnippetLanguage.javascript; /** * Time in miliseconds to keep the feedback tooltip displayed. * */ this.feedbackTimeout = 3000; /** * Set to `true` to show an expanded code snippet. */ this.expanded = false; /** * Set to `true` to show a loading code snippet. */ this.skeleton = false; this.snippetClass = true; this.showFeedback = false; CodeSnippet.codeSnippetCount++; } /** * @return {?} */ get snippetSingleClass() { return this.display === SnippetType.single; } /** * @return {?} */ get snippetMultiClass() { return this.display === SnippetType.multi; } /** * @return {?} */ get snippetInlineClass() { return this.display === SnippetType.inline; } /** * @return {?} */ get btnCopyClass() { return this.display === SnippetType.inline; } /** * @return {?} */ get displayStyle() { return this.display !== SnippetType.inline ? 'block' : null; } /** * @return {?} */ get attrType() { return this.display === SnippetType.inline ? 'button' : null; } /** * @return {?} */ get shouldShowExpandButton() { return this.code ? this.code.nativeElement.getBoundingClientRect().height > 255 : false; } /** * @return {?} */ ngOnInit() { if (this.highlight) { this.content = prism.highlight(this.content, prism.languages[this.language], this.language); } this.codeHtml = this.sanitizer.sanitize(SecurityContext.HTML, this.content); } /** * @return {?} */ toggleSnippetExpansion() { this.expanded = !this.expanded; } /** * Copies the code from the `<code>` block to clipboard. * @return {?} */ copyCode() { // create invisible, uneditable textarea with our code in it /** @type {?} */ const textarea = document.createElement('textarea'); textarea.value = this.code.nativeElement.innerText || this.code.nativeElement.textContent; textarea.setAttribute('readonly', ''); textarea.style.position = 'absolute'; textarea.style.right = '-99999px'; document.body.appendChild(textarea); // save user selection /** @type {?} */ const selected = document.getSelection().rangeCount ? document.getSelection().getRangeAt(0) : null; // copy to clipboard textarea.select(); document.execCommand('copy'); // remove textarea document.body.removeChild(textarea); // restore user selection if (selected) { document.getSelection().removeAllRanges(); document.getSelection().addRange(selected); } } /** * On copy button click, copies the code and shows feedback. * @return {?} */ onCopyButtonClicked() { this.copyCode(); this.showFeedback = true; setTimeout((/** * @return {?} */ () => { this.showFeedback = false; }), this.feedbackTimeout); } /** * Inline code snippet acts as button and makes the whole component clickable. * * This handles clicks in that case. * @return {?} */ hostClick() { if (this.display !== SnippetType.inline) { return; } this.onCopyButtonClicked(); } } /** * Variable used for creating unique ids for code-snippet components. */ CodeSnippet.codeSnippetCount = 0; CodeSnippet.decorators = [ { type: Component, args: [{ selector: 'suka-code-snippet', template: ` <ng-container *ngIf="display === 'inline'; else notInline"> <span sukaTooltip="Copiado" tooltipTrigger="click" tooltipDuration="3000" > <ng-container *ngTemplateOutlet="codeTemplate"></ng-container> </span> </ng-container> <ng-template #notInline> <div class="snippet-container" attr.aria-label="Copy code snippet"> <ng-container *ngIf="skeleton"> <span *ngIf="display === 'single'; else multiSkeleton"></span> <ng-template #multiSkeleton> <span></span> <span></span> <span></span> </ng-template> </ng-container> <pre *ngIf="!skeleton"><ng-container *ngTemplateOutlet="codeTemplate"></ng-container></pre> </div> <button *ngIf="!skeleton" class="snippet-button" attr.aria-label="Copiar" (click)="onCopyButtonClicked()" [ngClass]="{ 'snippet-button--copied': showFeedback }" sukaTooltip="Copiado" tooltipTrigger="click" tooltipDuration="3000" tabindex="0"> <suka-icon icon="copy"></suka-icon> </button> <button *ngIf="display === 'multi' && shouldShowExpandButton" class="btn snippet-btn--expand" (click)="toggleSnippetExpansion()" type="button"> <span class="snippet-btn--text">{{expanded ? 'Mostrar menos' : 'Mostrar mas'}} <suka-icon icon="chevron-down"></suka-icon> </span> </button> </ng-template> <ng-template #codeTemplate> <code #code [innerHtml]="codeHtml"></code> </ng-template> ` }] } ]; /** @nocollapse */ CodeSnippet.ctorParameters = () => [ { type: DomSanitizer } ]; CodeSnippet.propDecorators = { display: [{ type: Input }], feedbackText: [{ type: Input }], content: [{ type: Input }], highlight: [{ type: Input }], language: [{ type: Input }], feedbackTimeout: [{ type: Input }], expanded: [{ type: HostBinding, args: ['class.snippet--expand',] }, { type: Input }], skeleton: [{ type: HostBinding, args: ['class.skeleton',] }, { type: Input }], snippetClass: [{ type: HostBinding, args: ['class.snippet',] }], snippetSingleClass: [{ type: HostBinding, args: ['class.snippet--single',] }], snippetMultiClass: [{ type: HostBinding, args: ['class.snippet--multi',] }], snippetInlineClass: [{ type: HostBinding, args: ['class.snippet--inline',] }], btnCopyClass: [{ type: HostBinding, args: ['class.btn--copy',] }], displayStyle: [{ type: HostBinding, args: ['style.display',] }], attrType: [{ type: HostBinding, args: ['attr.type',] }], code: [{ type: ViewChild, args: ['code', { static: false },] }], hostClick: [{ type: HostListener, args: ['click',] }] }; if (false) { /** * Variable used for creating unique ids for code-snippet components. * @type {?} */ CodeSnippet.codeSnippetCount; /** @type {?} */ CodeSnippet.prototype.codeHtml; /** * It can be `"single"`, `"multi"` or `"inline"` * @type {?} */ CodeSnippet.prototype.display; /** * Text displayed in the tooltip when user clicks button to copy code. * * @type {?} */ CodeSnippet.prototype.feedbackText; /** * Code content * * @type {?} */ CodeSnippet.prototype.content; /** * Code highlight * * @type {?} */ CodeSnippet.prototype.highlight; /** * Snippet highlight language * * @type {?} */ CodeSnippet.prototype.language; /** * Time in miliseconds to keep the feedback tooltip displayed. * * @type {?} */ CodeSnippet.prototype.feedbackTimeout; /** * Set to `true` to show an expanded code snippet. * @type {?} */ CodeSnippet.prototype.expanded; /** * Set to `true` to show a loading code snippet. * @type {?} */ CodeSnippet.prototype.skeleton; /** @type {?} */ CodeSnippet.prototype.snippetClass; /** @type {?} */ CodeSnippet.prototype.code; /** @type {?} */ CodeSnippet.prototype.showFeedback; /** * @type {?} * @private */ CodeSnippet.prototype.sanitizer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1zbmlwcGV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9jb2RlLXNuaXBwZXQvY29kZS1zbmlwcGV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBRVosZUFBZSxFQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLCtDQUErQyxDQUFDO0FBQ3ZELE9BQU8scUNBQXFDLENBQUM7QUFDN0MsT0FBTyw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sK0JBQStCLENBQUM7QUFDdkMsT0FBTywrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7OztJQUdqRSxRQUFTLFFBQVE7SUFDakIsT0FBUSxPQUFPO0lBQ2YsUUFBUyxRQUFROzs7OztJQUlqQixZQUFjLFlBQVk7SUFDMUIsTUFBYyxNQUFNO0lBQ3BCLFlBQWMsWUFBWTtJQUMxQixRQUFjLFFBQVE7SUFDdEIsVUFBYyxVQUFVO0lBQ3hCLEtBQWMsS0FBSztJQUNuQixNQUFjLE1BQU07SUFDcEIsTUFBYyxNQUFNO0lBQ3BCLEtBQWMsS0FBSztJQUNuQixNQUFjLE1BQU07SUFDcEIsS0FBYyxLQUFLO0lBQ25CLE9BQWMsT0FBTztJQUNyQixNQUFjLE1BQU07SUFDcEIsT0FBYyxPQUFPOzs7QUEyRHZCLG1EQUFtRDtBQUNuRCxNQUFNLE9BQU8sV0FBVzs7Ozs7SUFtRnRCLFlBQW9CLFNBQXVCO1FBQXZCLGNBQVMsR0FBVCxT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QVk7OztzQkE0RmxCLEtBQUs7MkJBS0wsS0FBSztzQkFNTCxLQUFLO3dCQU1MLEtBQUs7dUJBTUwsS0FBSzs4QkFNTCxLQUFLO3VCQUtMLFdBQVcsU0FBQyx1QkFBdUIsY0FBRyxLQUFLO3VCQUszQyxXQUFXLFNBQUMsZ0JBQWdCLGNBQUcsS0FBSzsyQkFFcEMsV0FBVyxTQUFDLGVBQWU7aUNBQzNCLFdBQVcsU0FBQyx1QkFBdUI7Z0NBR25DLFdBQVcsU0FBQyxzQkFBc0I7aUNBR2xDLFdBQVcsU0FBQyx1QkFBdUI7MkJBR25DLFdBQVcsU0FBQyxpQkFBaUI7MkJBSTdCLFdBQVcsU0FBQyxlQUFlO3VCQUczQixXQUFXLFNBQUMsV0FBVzttQkFJdkIsU0FBUyxTQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7d0JBMEVuQyxZQUFZLFNBQUMsT0FBTzs7Ozs7OztJQTlJckIsNkJBQTRCOztJQUM1QiwrQkFBMEI7Ozs7O0lBSzFCLDhCQUFtRDs7Ozs7O0lBS25ELG1DQUFrQzs7Ozs7O0lBTWxDLDhCQUF5Qjs7Ozs7O0lBTXpCLGdDQUEwQjs7Ozs7O0lBTTFCLCtCQUFnRTs7Ozs7O0lBTWhFLHNDQUFnQzs7Ozs7SUFLaEMsK0JBQWdFOzs7OztJQUtoRSwrQkFBeUQ7O0lBRXpELG1DQUFrRDs7SUFxQmxELDJCQUEyQzs7SUFNM0MsbUNBQXFCOzs7OztJQUtULGdDQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIEhvc3RCaW5kaW5nLFxuICBWaWV3Q2hpbGQsXG4gIEhvc3RMaXN0ZW5lcixcbiAgT25Jbml0LFxuICBTZWN1cml0eUNvbnRleHRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBwcmlzbSBmcm9tICdwcmlzbWpzJztcbmltcG9ydCAncHJpc21qcy9jb21wb25lbnRzL3ByaXNtLW1hcmt1cC10ZW1wbGF0aW5nLmpzJztcbmltcG9ydCAncHJpc21qcy9jb21wb25lbnRzL3ByaXNtLXR5cGVzY3JpcHQnO1xuaW1wb3J0ICdwcmlzbWpzL2NvbXBvbmVudHMvcHJpc20tcGhwJztcbmltcG9ydCAncHJpc21qcy9jb21wb25lbnRzL3ByaXNtLXJ1YnknO1xuaW1wb3J0ICdwcmlzbWpzL2NvbXBvbmVudHMvcHJpc20tanNvbic7XG5pbXBvcnQgJ3ByaXNtanMvY29tcG9uZW50cy9wcmlzbS1qYXZhJztcbmltcG9ydCAncHJpc21qcy9jb21wb25lbnRzL3ByaXNtLW1hcmtkb3duJztcbmltcG9ydCAncHJpc21qcy9jb21wb25lbnRzL3ByaXNtLXNjc3MnO1xuaW1wb3J0ICdwcmlzbWpzL2NvbXBvbmVudHMvcHJpc20tc3dpZnQnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5leHBvcnQgZW51bSBTbmlwcGV0VHlwZSB7XG4gIHNpbmdsZSA9ICdzaW5nbGUnLFxuICBtdWx0aSA9ICdtdWx0aScsXG4gIGlubGluZSA9ICdpbmxpbmUnXG59XG5cbmV4cG9ydCBlbnVtIFNuaXBwZXRMYW5ndWFnZSB7XG4gIGphdmFzY3JpcHQgID0gJ2phdmFzY3JpcHQnLFxuICBqc29uICAgICAgICA9ICdqc29uJyxcbiAgdHlwZXNjcmlwdCAgPSAndHlwZXNjcmlwdCcsXG4gIG1hcmt1cCAgICAgID0gJ21hcmt1cCcsXG4gIG1hcmtkb3duICAgID0gJ21hcmtkb3duJyxcbiAgcGhwICAgICAgICAgPSAncGhwJyxcbiAgcnVieSAgICAgICAgPSAncnVieScsXG4gIHNjc3MgICAgICAgID0gJ3Njc3MnLFxuICBjc3MgICAgICAgICA9ICdjc3MnLFxuICBodG1sICAgICAgICA9ICdodG1sJyxcbiAgeG1sICAgICAgICAgPSAneG1sJyxcbiAgY2xpa2UgICAgICAgPSAnY2xpa2UnLFxuICBqYXZhICAgICAgICA9ICdqYXZhJyxcbiAgc3dpZnQgICAgICAgPSAnc3dpZnQnLFxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLWNvZGUtc25pcHBldCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXkgPT09ICdpbmxpbmUnOyBlbHNlIG5vdElubGluZVwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgc3VrYVRvb2x0aXA9XCJDb3BpYWRvXCJcbiAgICAgICAgdG9vbHRpcFRyaWdnZXI9XCJjbGlja1wiXG4gICAgICAgIHRvb2x0aXBEdXJhdGlvbj1cIjMwMDBcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29kZVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI25vdElubGluZT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzbmlwcGV0LWNvbnRhaW5lclwiIGF0dHIuYXJpYS1sYWJlbD1cIkNvcHkgY29kZSBzbmlwcGV0XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvblwiPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZGlzcGxheSA9PT0gJ3NpbmdsZSc7IGVsc2UgbXVsdGlTa2VsZXRvblwiPjwvc3Bhbj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI211bHRpU2tlbGV0b24+XG4gICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxwcmUgKm5nSWY9XCIhc2tlbGV0b25cIj48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29kZVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+PC9wcmU+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIiFza2VsZXRvblwiXG4gICAgICAgIGNsYXNzPVwic25pcHBldC1idXR0b25cIlxuICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJDb3BpYXJcIlxuICAgICAgICAoY2xpY2spPVwib25Db3B5QnV0dG9uQ2xpY2tlZCgpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICdzbmlwcGV0LWJ1dHRvbi0tY29waWVkJzogc2hvd0ZlZWRiYWNrXG4gICAgICAgIH1cIlxuICAgICAgICBzdWthVG9vbHRpcD1cIkNvcGlhZG9cIlxuICAgICAgICB0b29sdGlwVHJpZ2dlcj1cImNsaWNrXCJcbiAgICAgICAgdG9vbHRpcER1cmF0aW9uPVwiMzAwMFwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICA8c3VrYS1pY29uIGljb249XCJjb3B5XCI+PC9zdWthLWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImRpc3BsYXkgPT09ICdtdWx0aScgJiYgc2hvdWxkU2hvd0V4cGFuZEJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiYnRuIHNuaXBwZXQtYnRuLS1leHBhbmRcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlU25pcHBldEV4cGFuc2lvbigpXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNuaXBwZXQtYnRuLS10ZXh0XCI+e3tleHBhbmRlZCA/ICdNb3N0cmFyIG1lbm9zJyA6ICdNb3N0cmFyIG1hcyd9fVxuICAgICAgICAgIDxzdWthLWljb24gaWNvbj1cImNoZXZyb24tZG93blwiPjwvc3VrYS1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjY29kZVRlbXBsYXRlPlxuICAgICAgPGNvZGUgI2NvZGUgW2lubmVySHRtbF09XCJjb2RlSHRtbFwiPjwvY29kZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQ29kZVNuaXBwZXQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogVmFyaWFibGUgdXNlZCBmb3IgY3JlYXRpbmcgdW5pcXVlIGlkcyBmb3IgY29kZS1zbmlwcGV0IGNvbXBvbmVudHMuXG4gICAqL1xuICBzdGF0aWMgY29kZVNuaXBwZXRDb3VudCA9IDA7XG4gIHB1YmxpYyBjb2RlSHRtbDogU2FmZUh0bWw7XG5cbiAgLyoqXG4gICAqIEl0IGNhbiBiZSBgXCJzaW5nbGVcImAsIGBcIm11bHRpXCJgIG9yIGBcImlubGluZVwiYFxuICAgKi9cbiAgQElucHV0KCkgZGlzcGxheTogU25pcHBldFR5cGUgPSBTbmlwcGV0VHlwZS5zaW5nbGU7XG4gIC8qKlxuICAgKiBUZXh0IGRpc3BsYXllZCBpbiB0aGUgdG9vbHRpcCB3aGVuIHVzZXIgY2xpY2tzIGJ1dHRvbiB0byBjb3B5IGNvZGUuXG4gICAqXG4gICAqL1xuICBASW5wdXQoKSBmZWVkYmFja1RleHQgPSAnQ29waWFkbyc7IC8vIFRPRE86IGkxOG5cblxuICAvKipcbiAgICogQ29kZSBjb250ZW50XG4gICAqXG4gICAqL1xuICBASW5wdXQoKSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvZGUgaGlnaGxpZ2h0XG4gICAqXG4gICAqL1xuICBASW5wdXQoKSBoaWdobGlnaHQ6IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTbmlwcGV0IGhpZ2hsaWdodCBsYW5ndWFnZVxuICAgKlxuICAgKi9cbiAgQElucHV0KCkgbGFuZ3VhZ2U6IFNuaXBwZXRMYW5ndWFnZSA9IFNuaXBwZXRMYW5ndWFnZS5qYXZhc2NyaXB0O1xuXG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbGlzZWNvbmRzIHRvIGtlZXAgdGhlIGZlZWRiYWNrIHRvb2x0aXAgZGlzcGxheWVkLlxuICAgKlxuICAgKi9cbiAgQElucHV0KCkgZmVlZGJhY2tUaW1lb3V0ID0gMzAwMDtcblxuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCB0byBzaG93IGFuIGV4cGFuZGVkIGNvZGUgc25pcHBldC5cbiAgICovXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc25pcHBldC0tZXhwYW5kJykgQElucHV0KCkgZXhwYW5kZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCB0byBzaG93IGEgbG9hZGluZyBjb2RlIHNuaXBwZXQuXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNrZWxldG9uJykgQElucHV0KCkgc2tlbGV0b24gPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNuaXBwZXQnKSBzbmlwcGV0Q2xhc3MgPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNuaXBwZXQtLXNpbmdsZScpIGdldCBzbmlwcGV0U2luZ2xlQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheSA9PT0gU25pcHBldFR5cGUuc2luZ2xlO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc25pcHBldC0tbXVsdGknKSBnZXQgc25pcHBldE11bHRpQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheSA9PT0gU25pcHBldFR5cGUubXVsdGk7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zbmlwcGV0LS1pbmxpbmUnKSBnZXQgc25pcHBldElubGluZUNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXkgPT09IFNuaXBwZXRUeXBlLmlubGluZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi0tY29weScpIGdldCBidG5Db3B5Q2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheSA9PT0gU25pcHBldFR5cGUuaW5saW5lO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5kaXNwbGF5JykgZ2V0IGRpc3BsYXlTdHlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ICE9PSBTbmlwcGV0VHlwZS5pbmxpbmUgPyAnYmxvY2snIDogbnVsbDtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2F0dHIudHlwZScpIGdldCBhdHRyVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ID09PSBTbmlwcGV0VHlwZS5pbmxpbmUgPyAnYnV0dG9uJyA6IG51bGw7XG4gIH1cblxuICBAVmlld0NoaWxkKCdjb2RlJywgeyBzdGF0aWM6IGZhbHNlIH0pIGNvZGU7XG5cbiAgZ2V0IHNob3VsZFNob3dFeHBhbmRCdXR0b24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY29kZSA/IHRoaXMuY29kZS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCA+IDI1NSA6IGZhbHNlO1xuICB9XG5cbiAgc2hvd0ZlZWRiYWNrID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ29kZVNuaXBwZXQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XG4gICAgQ29kZVNuaXBwZXQuY29kZVNuaXBwZXRDb3VudCsrO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuaGlnaGxpZ2h0KSB7XG4gICAgICB0aGlzLmNvbnRlbnQgPSBwcmlzbS5oaWdobGlnaHQodGhpcy5jb250ZW50LCBwcmlzbS5sYW5ndWFnZXNbdGhpcy5sYW5ndWFnZV0sIHRoaXMubGFuZ3VhZ2UpO1xuICAgIH1cblxuICAgIHRoaXMuY29kZUh0bWwgPSB0aGlzLnNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuSFRNTCwgdGhpcy5jb250ZW50KTtcbiAgfVxuXG4gIHRvZ2dsZVNuaXBwZXRFeHBhbnNpb24oKSB7XG4gICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcGllcyB0aGUgY29kZSBmcm9tIHRoZSBgPGNvZGU+YCBibG9jayB0byBjbGlwYm9hcmQuXG4gICAqL1xuICBwdWJsaWMgY29weUNvZGUoKSB7XG4gICAgLy8gY3JlYXRlIGludmlzaWJsZSwgdW5lZGl0YWJsZSB0ZXh0YXJlYSB3aXRoIG91ciBjb2RlIGluIGl0XG4gICAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgIHRleHRhcmVhLnZhbHVlID0gdGhpcy5jb2RlLm5hdGl2ZUVsZW1lbnQuaW5uZXJUZXh0IHx8IHRoaXMuY29kZS5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50O1xuICAgIHRleHRhcmVhLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJyk7XG4gICAgdGV4dGFyZWEuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHRleHRhcmVhLnN0eWxlLnJpZ2h0ID0gJy05OTk5OXB4JztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRhcmVhKTtcblxuICAgIC8vIHNhdmUgdXNlciBzZWxlY3Rpb25cbiAgICBjb25zdCBzZWxlY3RlZCA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpLnJhbmdlQ291bnQgPyBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKS5nZXRSYW5nZUF0KDApIDogbnVsbDtcblxuICAgIC8vIGNvcHkgdG8gY2xpcGJvYXJkXG4gICAgdGV4dGFyZWEuc2VsZWN0KCk7XG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcblxuICAgIC8vIHJlbW92ZSB0ZXh0YXJlYVxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dGFyZWEpO1xuXG4gICAgLy8gcmVzdG9yZSB1c2VyIHNlbGVjdGlvblxuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKS5hZGRSYW5nZShzZWxlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIGNvcHkgYnV0dG9uIGNsaWNrLCBjb3BpZXMgdGhlIGNvZGUgYW5kIHNob3dzIGZlZWRiYWNrLlxuICAgKi9cbiAgb25Db3B5QnV0dG9uQ2xpY2tlZCgpIHtcbiAgICB0aGlzLmNvcHlDb2RlKCk7XG5cbiAgICB0aGlzLnNob3dGZWVkYmFjayA9IHRydWU7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2hvd0ZlZWRiYWNrID0gZmFsc2U7XG4gICAgfSwgdGhpcy5mZWVkYmFja1RpbWVvdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIElubGluZSBjb2RlIHNuaXBwZXQgYWN0cyBhcyBidXR0b24gYW5kIG1ha2VzIHRoZSB3aG9sZSBjb21wb25lbnQgY2xpY2thYmxlLlxuICAgKlxuICAgKiBUaGlzIGhhbmRsZXMgY2xpY2tzIGluIHRoYXQgY2FzZS5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJylcbiAgaG9zdENsaWNrKCkge1xuICAgIGlmICh0aGlzLmRpc3BsYXkgIT09IFNuaXBwZXRUeXBlLmlubGluZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub25Db3B5QnV0dG9uQ2xpY2tlZCgpO1xuICB9XG59XG4iXX0=