ngx-sand-credit-cards
Version:
An angular custom credit card package module.
135 lines • 24.3 kB
JavaScript
import { Component, EventEmitter, forwardRef, HostListener, Input, Output } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { providerImages } from '../enums/provider-images.enum';
export class NgxSandCreditCardsComponent {
constructor() {
this.selector = [false, false, false, false];
this.providerType = '1';
this.cardType = 'DEBIT';
this.cardProviders = [{
id: 1,
name: 'VISA'
}, {
id: 2,
name: 'MASTERCARD'
}, {
id: 3,
name: 'RuPay'
}];
/**
* Get the card type
*/
// @Input() public cardType = 'DEBIT';
/**
* Get the card type
*/
this.bankName = 'HDFZ BANK';
/**
* Get the card name
*/
this.cardName = 'MILLENIA';
/**
* Select event when user select a value from list
*/
this.valueSelect = new EventEmitter();
}
ngOnInit() {
this.changeProvider();
}
onClick(event) {
this.showBack = false;
switch (event) {
case 0:
this.selector = [true, false, false, false];
return;
case 1:
this.selector = [false, true, false, false];
return;
case 2:
this.selector = [false, false, true, false];
return;
case 3:
this.selector = [false, false, false, true];
this.showBack = true;
return;
default:
this.selector = [false, false, false, false];
}
}
changeMonth() {
}
changeYear() {
}
/*
*
*
* */
changeProvider() {
this.showBack = false;
switch (this.providerType) {
case "1":
this.providerLogo = providerImages.VISA;
break;
case "2":
this.providerLogo = providerImages.MASTERCARD;
break;
default:
this.providerLogo = providerImages.MASTERCARD;
}
console.log(this.providerLogo);
}
changeCardType(event) {
console.log(event.target.value);
this.cardType = event.target.value === 'credit' ? 'CREDIT' : 'DEBIT';
console.log(this.cardType);
}
/**
* click listener for host inside this component i.e
* if many instances are there, this detects if clicked inside
* this instance
*/
clickInsideComponent() {
this.clickedInside = true;
}
blur(event) {
}
focus(event) {
/* istanbul ignore else */
}
/**
* click handler on documnent to hide the open dropdown if clicked outside
*/
clickOutsideComponent() {
/* istanbul ignore else */
if (!this.clickedInside) {
this.selector = [false, false, false, false];
this.showBack = false;
}
this.clickedInside = false;
}
}
NgxSandCreditCardsComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-sand-credit-cards',
template: "<div class=\"wrapper\">\r\n\r\n <div class=\"card-wrapper\" [ngClass]=\"{transform: showBack}\">\r\n\r\n <div class=\"card-front\">\r\n <div class=\"cover\">\r\n\r\n <div class=\"bank-name entry\">\r\n <span>{{bankName }}</span>\r\n </div>\r\n <div class=\" entry card-type\">\r\n <span>{{cardType }} </span>\r\n </div>\r\n <div class=\" entry chip-placeholder\"></div>\r\n <div class=\" entry card-name\">\r\n <span>{{cardName}}</span>\r\n </div>\r\n <div class=\" entry card-number\" [ngClass]=\"{makeVisible: selector[1]}\">\r\n <span>{{ cardNumber || '**** **** **** ****'}}</span>\r\n </div>\r\n <div class=\" entry card-holder-name\" [ngClass]=\"{makeVisible: selector[0]}\">\r\n <span>{{name||'Your Name Here'}}</span>\r\n </div>\r\n <div class=\" entry expiry\" [ngClass]=\"{makeVisible: selector[2]}\">\r\n <span>{{expiryMonth || '10'}}</span> / <span>{{expiryYear || '24'}}</span>\r\n </div>\r\n <div class=\" entry issuer\">\r\n <span><img [src]=\"providerLogo\" alt=\"Provider Logo\" width=\"35px\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-front card-back\">\r\n <div class=\"cover\">\r\n <div class=\"black-stripe\"></div>\r\n <div class=\" entry signature makeVisible\"></div>\r\n <div class=\" entry cvv\" [ngClass]=\"{makeVisible: selector[3]}\">\r\n <span>{{cvv|| '007'}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"form-wrapper\">\r\n\r\n <div class=\"form-group\">\r\n <div class=\"label\"> - </div>\r\n <div class=\"flt-rt\">\r\n <input type=\"radio\" name=\"cardType\" (change)=\"changeCardType($event)\" value=\"debit\">\r\n <label for=\"male\"> Debit Card </label>\r\n <input type=\"radio\" name=\"cardType\" (change)=\"changeCardType($event)\" value=\"credit\">\r\n <label for=\"female\"> Credit Card</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"label\"> Select card option </div>\r\n <div class=\"flt-rt\">\r\n <select class=\"form-control\" [(ngModel)]=\"providerType\" (change)=\"changeProvider()\">\r\n <option [ngValue]=\"null\" selected disabled>Select Category</option>\r\n\r\n <option *ngFor=\"let item of cardProviders\" [value]=\"item.id\">{{item.name}}</option>\r\n\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"label\"> Card number </div>\r\n <div class=\"flt-rt\">\r\n <input type=\"tel\" credit-card [(ngModel)]=\"cardNumber\" id=\"cardNumber\"\r\n placeholder=\"Enter Your Card Number\" (click)=\"onClick(1)\" class=\"form-control\">\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <div class=\"label\"> Card holder name </div>\r\n <div class=\"flt-rt\">\r\n <input type=\"text\" autocomplete=false autocapitalize=\"true\" placeholder=\"Enter Card Holder Name\"\r\n [(ngModel)]=\"name\" (click)=\"onClick(0)\" class=\"form-control\">\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <div class=\"label\"> Expiry date </div>\r\n <div class=\"flt-rt\">\r\n <div class=\"month\">\r\n <select class=\"form-control\" [(ngModel)]=\"expiryMonth\" (change)=\"changeMonth()\"\r\n (click)=\"onClick(2)\">\r\n <option selected value=\"00\" selected>Month</option>\r\n <option value=\"01\">Jan</option>\r\n <option value=\"02\">Feb</option>\r\n <option value=\"03\">Mar</option>\r\n <option value=\"04\">Apr</option>\r\n <option value=\"05\">May</option>\r\n <option value=\"06\">Jun</option>\r\n <option value=\"07\">Jul</option>\r\n <option value=\"08\">Aug</option>\r\n <option value=\"09\">Sep</option>\r\n <option value=\"10\">Oct</option>\r\n <option value=\"11\">Nov</option>\r\n <option value=\"12\">Dec</option>\r\n </select>\r\n </div>\r\n <div class=\"year\">\r\n <!-- <input type=\"text\" placeholder=\"Expiry Year\" [(ngModel)]=\"expiryYear\" (click)=\"onClick(2)\"\r\n class=\"form-control\"> -->\r\n <select class=\"form-control\" [(ngModel)]=\"expiryYear\" (change)=\"changeYear()\" (click)=\"onClick(2)\">\r\n <option selected>Year</option>\r\n <option value=\"21\">2021</option>\r\n <option value=\"22\">2022</option>\r\n <option value=\"23\">2023</option>\r\n <option value=\"24\">2024</option>\r\n <option value=\"25\">2025</option>\r\n <option value=\"26\">2026</option>\r\n <option value=\"27\">2027</option>\r\n <option value=\"28\">2028</option>\r\n <option value=\"29\">2029</option>\r\n <option value=\"30\">2030</option>\r\n <option value=\"31\">2031</option>\r\n <option value=\"32\">2032</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <div class=\"label\"> Cvv number </div>\r\n <div class=\"flt-rt\">\r\n <input type=\"number\" [(ngModel)]=\"cvv\" maxlength=\"3\" id=\"cvv\" placeholder=\"cvv\" (click)=\"onClick(3)\"\r\n class=\"form-control\">\r\n </div>\r\n </div>\r\n </div>\r\n</div>",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgxSandCreditCardsComponent),
multi: true
}
],
styles: ["*{box-sizing:border-box;font-family:Consolas,Courier,monospace}.wrapper .card-wrapper{height:240px;margin:0 auto;perspective:1000px;position:relative;transform-style:preserve-3d;transition:all .4s linear;width:380px}.wrapper .card-wrapper .card-front{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#00a1ff;border-radius:14.5px;box-shadow:0 0 20px rgba(0,0,0,.2);color:#fff;height:100%;left:0;overflow:hidden;padding:5%;position:absolute;top:0;transform-style:preserve-3d;width:100%}.wrapper .card-wrapper .card-front .cover{height:100%;position:relative}.wrapper .card-wrapper .card-front .cover .entry{display:inline-block;position:absolute}.wrapper .card-wrapper .card-front .cover .makeVisible{opacity:1!important}.wrapper .card-wrapper .card-front .cover .black-stripe{background-color:#000;display:block;height:20%;left:0;position:fixed;top:13%;width:100%}.wrapper .card-wrapper .card-front .cover .card-type{right:0}.wrapper .card-wrapper .card-front .cover .chip-placeholder{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9Ijc2IiB2aWV3Qm94PSIwIDAgMTAwIDc2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIj48ZGVmcz48bGluZWFyR3JhZGllbnQgeDE9IjEwMCUiIHkxPSIwJSIgeDI9IjAlIiB5Mj0iMTAwJSIgaWQ9ImEiPjxzdG9wIHN0b3AtY29sb3I9IiNGM0QwOEYiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjRkFENzY2IiBvZmZzZXQ9IjEwMCUiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cGF0aCBkPSJNOTIuNzI3IDc1LjQ1NWgtODUuNDU1Yy00IDAtNy4yNzMtMy4yNzMtNy4yNzMtNy4yNzN2LTYwLjkwOWMwLTQgMy4yNzMtNy4yNzMgNy4yNzMtNy4yNzNoODUuNDU1YzQgMCA3LjI3MyAzLjI3MyA3LjI3MyA3LjI3M3Y2MC45MDljMCA0LTMuMjczIDcuMjczLTcuMjczIDcuMjczIiBmaWxsPSJ1cmwoI2EpIi8+PHBhdGggZD0iTTcyLjEyMyAyOC40ODVoMjcuODc4di0xLjgxOGgtMjkuNjQ4Yy0uOTY1IDAtMS44MzIuNjAxLTIuMTcyIDEuNTA0LTIuMjg3IDYuMDcyLTIuNDMzIDEyLjU5NC0uNDM4IDE5Ljg0Mi40NTUgMS42NTQuNDM1IDMuNC0uMSA1LjAzLTIuMDM2IDYuMTk1LTcuNzc5IDE5Ljk4OC0xOC41NTEgMTkuOTg4LTExLjAwOCAwLTE2LjA5Ni0xNS42OTktMTcuMzM0LTIxLjk1Mi0uMTU1LS43ODQtLjEyMi0xLjU5Mi4xMDctMi4zNTcgMS42OTUtNS42NDggMi4wOTQtMTAuNjQtLjAxNi0xOS41OS0uMjA1LS44Ny0uMTgyLTEuNzgzLjA0OC0yLjY0NiA0LjQ4LTE2Ljc1NSAxMi44ODItMjAuMTQ3IDEyLjk2NS0yMC4xNzkuMzU2LS4xMzIuNTkzLS40NzIuNTkzLS44NTJ2LTUuNDU1aC0xLjgxOHYzLjc3NmMwIC42NS0uMzMyIDEuMjUyLS44ODQgMS41OTYtMi44MDMgMS43NDItOC45MDQgNi45MzYtMTIuNTU3IDIwLjQ1Ni0uMTguNjY4LS43ODEgMS4xMzYtMS40NzMgMS4xMzNsLTI4LjcyMi0uMTM5djEuODE4bDI3LjQxNi4xMzNjMS40NjguMDA3IDIuNzM1IDEuMDQxIDMuMDM3IDIuNDc4IDEuNDE2IDYuNzQxIDEuMjE5IDExLjAzOS4wODIgMTUuNDU4LS4zMTYgMS4yMy0xLjQyIDIuMDk2LTIuNjkgMi4xMDlsLTI3Ljg0NC4yN3YxLjgxOWwyOC42MDUtLjI3OGMuNjkzLS4wMDcgMS4yOTYuNDczIDEuNDM1IDEuMTUyIDEuNDQyIDcuMDQxIDYuODg3IDIzLjA3IDE5LjA1IDIzLjA3IDYuMzY4IDAgMTIuMDYyLTQuMjUgMTYuNDY3LTEyLjI5IDIuNjQ0LTQuODI4IDQuMDY3LTkuNTkxIDQuNTQxLTExLjM0NmgyOS45MDF2LTEuODE4aC0yOC4wMTZjLTEuMTU4IDAtMi4xODMtLjc3Mi0yLjQ4OS0xLjg4OS0xLjY5Mi02LjE2NC0xLjc2MS0xMS43NTUtLjItMTYuOTU5LjM3MS0xLjIzNSAxLjUzOC0yLjA2MSAyLjgyNy0yLjA2MXptLTE3LjE1LTIxLjkxNGMuMDQ1LjAyMiA0LjUxOSAyLjMyMiA5LjI1MyAxMC4wNDEuMTcyLjI4LjQ3LjQzNC43NzYuNDM0LjE5OCAwIC4zOTktLjA2NC41NzEtLjIwMi4zNjUtLjI5Mi40MTYtLjgzNy4xNzItMS4yMzUtMy41Ny01LjgwNS03LjAyNC04LjcxLTguNzc1LTkuOTMxLS40My0uMjk5LS42OC0uNzkyLS42OC0xLjMxNXYtNC4zNjNoLTEuODE4djUuNzU4YzAgLjM0NS4xOTUuNjU5LjUwMi44MTN6IiBmaWxsPSIjMEMwMjAwIi8+PC9zdmc+);background-repeat:no-repeat;background-size:contain;height:26.36364px;left:10%;top:20%;width:41.42857px}.wrapper .card-wrapper .card-front .cover .card-name{left:40%;top:40%}.wrapper .card-wrapper .card-front .cover .card-number{left:30%;opacity:.5;top:60%;transition:opacity .3s}.wrapper .card-wrapper .card-front .cover .card-holder-name{bottom:0;opacity:.5;transition:opacity .3s}.wrapper .card-wrapper .card-front .cover .expiry{bottom:0;opacity:.5;right:25%;transition:opacity .3s}.wrapper .card-wrapper .card-front .cover .issuer{bottom:0;right:0}.wrapper .card-wrapper .card-front .cover .signature{background:repeating-linear-gradient(.1deg,#fff 20%,#fff 40%,#fea 0,#fea 44%,#fff 0);height:20%;top:35%;width:70%}.wrapper .card-wrapper .card-front .cover .cvv{height:20%;left:60%;top:45%}.wrapper .card-wrapper .card-front .cover .cvv span{color:#000;font-weight:bolder}.wrapper .card-wrapper .card-back{transform:rotateY(180deg)}.wrapper .form-wrapper{margin:0 auto;overflow:auto;width:40%;width:45%}.wrapper .form-wrapper .form-group{float:left;padding:2% 0;width:100%}.wrapper .form-wrapper .form-group .label{float:left;width:40%}.wrapper .form-wrapper .form-group .form-control{border:1px solid #bcbcbc;border-radius:3px;padding:8px;width:100%}.wrapper .form-wrapper .form-group .month{float:left;width:30%}.wrapper .form-wrapper .form-group .year{float:left;margin-left:10%;width:30%}.wrapper .form-wrapper .form-group #cvv{width:20%}.wrapper .flt-rt{float:right;width:60%}.wrapper .transform{transform:rotateY(180deg)}.wrapper #cvv:valid{color:green;font-weight:bolder}"]
},] }
];
NgxSandCreditCardsComponent.ctorParameters = () => [];
NgxSandCreditCardsComponent.propDecorators = {
bankName: [{ type: Input }],
cardName: [{ type: Input }],
valueSelect: [{ type: Output }],
clickInsideComponent: [{ type: HostListener, args: ["click",] }],
blur: [{ type: HostListener, args: ["blur", ["$event"],] }],
focus: [{ type: HostListener, args: ["focus", ["$event"],] }],
clickOutsideComponent: [{ type: HostListener, args: ["document:click",] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNhbmQtY3JlZGl0LWNhcmRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJEOi9FeHBlcmltZW50cy9OZ3hTYW5kQ3JlZGl0Q2FyZHMvcHJvamVjdHMvbmd4LXNhbmQtY3JlZGl0LWNhcmRzL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtc2FuZC1jcmVkaXQtY2FyZHMvbmd4LXNhbmQtY3JlZGl0LWNhcmRzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBZTlELE1BQU0sT0FBTywyQkFBMkI7SUFnRHRDO1FBL0NBLGFBQVEsR0FBUSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBVTdDLGlCQUFZLEdBQVEsR0FBRyxDQUFBO1FBQ3ZCLGFBQVEsR0FBUSxPQUFPLENBQUM7UUFDeEIsa0JBQWEsR0FBRyxDQUFDO2dCQUNmLEVBQUUsRUFBRSxDQUFDO2dCQUNMLElBQUksRUFBRSxNQUFNO2FBQ2IsRUFBRTtnQkFDRCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxJQUFJLEVBQUUsWUFBWTthQUNuQixFQUFFO2dCQUNELEVBQUUsRUFBRSxDQUFDO2dCQUNMLElBQUksRUFBRSxPQUFPO2FBQ2QsQ0FBQyxDQUFBO1FBRUY7O1dBRUc7UUFDSCxzQ0FBc0M7UUFFdEM7O1VBRUU7UUFDYyxhQUFRLEdBQUcsV0FBVyxDQUFDO1FBRXZDOztVQUVFO1FBQ2MsYUFBUSxHQUFHLFVBQVUsQ0FBQztRQUt0Qzs7V0FFRztRQUNjLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFH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QUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQzt3QkFDMUQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7O2FBRUY7Ozs7dUJBaUNFLEtBQUs7dUJBS0wsS0FBSzswQkFRTCxNQUFNO21DQXFFTixZQUFZLFNBQUMsT0FBTzttQkFLcEIsWUFBWSxTQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQztvQkFJL0IsWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztvQ0FPaEMsWUFBWSxTQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBwcm92aWRlckltYWdlcyB9IGZyb20gJy4uL2VudW1zL3Byb3ZpZGVyLWltYWdlcy5lbnVtJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtc2FuZC1jcmVkaXQtY2FyZHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmd4LXNhbmQtY3JlZGl0LWNhcmRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LXNhbmQtY3JlZGl0LWNhcmRzLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4U2FuZENyZWRpdENhcmRzQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuXG59KVxuZXhwb3J0IGNsYXNzIE5neFNhbmRDcmVkaXRDYXJkc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHNlbGVjdG9yOiBhbnkgPSBbZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2VdO1xuICBjbGlja2VkSW5zaWRlOiBib29sZWFuO1xuICBzaG93QmFjazogYW55O1xuICBuYW1lOiBzdHJpbmc7XG4gIGV4cGlyeTogc3RyaW5nO1xuICBleHBpcnlNb250aDogc3RyaW5nO1xuICBleHBpcnlZZWFyOiBzdHJpbmc7XG4gIGN2djogc3RyaW5nO1xuICBjYXJkTnVtYmVyOiBhbnk7XG4gIHByb3ZpZGVyTG9nbzogYW55XG4gIHByb3ZpZGVyVHlwZTogYW55ID0gJzEnXG4gIGNhcmRUeXBlOiBhbnkgPSAnREVCSVQnO1xuICBjYXJkUHJvdmlkZXJzID0gW3tcbiAgICBpZDogMSxcbiAgICBuYW1lOiAnVklTQSdcbiAgfSwge1xuICAgIGlkOiAyLFxuICAgIG5hbWU6ICdNQVNURVJDQVJEJ1xuICB9LCB7XG4gICAgaWQ6IDMsXG4gICAgbmFtZTogJ1J1UGF5J1xuICB9XVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNhcmQgdHlwZVxuICAgKi9cbiAgLy8gQElucHV0KCkgcHVibGljIGNhcmRUeXBlID0gJ0RFQklUJztcblxuICAvKipcbiAgKiBHZXQgdGhlIGNhcmQgdHlwZVxuICAqL1xuICBASW5wdXQoKSBwdWJsaWMgYmFua05hbWUgPSAnSERGWiBCQU5LJztcblxuICAvKipcbiAgKiBHZXQgdGhlIGNhcmQgbmFtZVxuICAqL1xuICBASW5wdXQoKSBwdWJsaWMgY2FyZE5hbWUgPSAnTUlMTEVOSUEnO1xuXG5cblxuXG4gIC8qKlxuICAgKiBTZWxlY3QgZXZlbnQgd2hlbiB1c2VyIHNlbGVjdCBhIHZhbHVlIGZyb20gbGlzdFxuICAgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyB2YWx1ZVNlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlUHJvdmlkZXIoKVxuICB9XG5cbiAgb25DbGljayhldmVudCkge1xuICAgIHRoaXMuc2hvd0JhY2sgPSBmYWxzZTtcbiAgICBzd2l0Y2ggKGV2ZW50KSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHRoaXMuc2VsZWN0b3IgPSBbdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZV1cblxuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHRoaXMuc2VsZWN0b3IgPSBbZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZV1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB0aGlzLnNlbGVjdG9yID0gW2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2VdXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAzOlxuICAgICAgICB0aGlzLnNlbGVjdG9yID0gW2ZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWVdXG4gICAgICAgIHRoaXMuc2hvd0JhY2sgPSB0cnVlO1xuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuc2VsZWN0b3IgPSBbZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2VdXG4gICAgfVxuICB9XG5cbiAgY2hhbmdlTW9udGgoKSB7XG5cbiAgfVxuICBjaGFuZ2VZZWFyKCkge1xuXG4gIH1cblxuICAvKlxuICAqXG4gICpcbiAgKiAqL1xuXG4gIGNoYW5nZVByb3ZpZGVyKCkge1xuICAgIHRoaXMuc2hvd0JhY2sgPSBmYWxzZTtcbiAgICBzd2l0Y2ggKHRoaXMucHJvdmlkZXJUeXBlKSB7XG4gICAgICBjYXNlIFwiMVwiOlxuICAgICAgICB0aGlzLnByb3ZpZGVyTG9nbyA9IHByb3ZpZGVySW1hZ2VzLlZJU0E7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIjJcIjpcbiAgICAgICAgdGhpcy5wcm92aWRlckxvZ28gPSBwcm92aWRlckltYWdlcy5NQVNURVJDQVJEO1xuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5wcm92aWRlckxvZ28gPSBwcm92aWRlckltYWdlcy5NQVNURVJDQVJEXG4gICAgfVxuICAgIGNvbnNvbGUubG9nKHRoaXMucHJvdmlkZXJMb2dvKVxuICB9XG5cbiAgY2hhbmdlQ2FyZFR5cGUoZXZlbnQpIHtcbiAgICBjb25zb2xlLmxvZyhldmVudC50YXJnZXQudmFsdWUpXG4gICAgdGhpcy5jYXJkVHlwZSA9IGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJ2NyZWRpdCcgPyAnQ1JFRElUJyA6ICdERUJJVCdcbiAgICBjb25zb2xlLmxvZyh0aGlzLmNhcmRUeXBlKVxuICB9XG5cbiAgLyoqXG4gICogY2xpY2sgbGlzdGVuZXIgZm9yIGhvc3QgaW5zaWRlIHRoaXMgY29tcG9uZW50IGkuZVxuICAqIGlmIG1hbnkgaW5zdGFuY2VzIGFyZSB0aGVyZSwgdGhpcyBkZXRlY3RzIGlmIGNsaWNrZWQgaW5zaWRlXG4gICogdGhpcyBpbnN0YW5jZVxuICAqL1xuICBASG9zdExpc3RlbmVyKFwiY2xpY2tcIilcbiAgcHVibGljIGNsaWNrSW5zaWRlQ29tcG9uZW50KCkge1xuICAgIHRoaXMuY2xpY2tlZEluc2lkZSA9IHRydWU7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwiYmx1clwiLCBbXCIkZXZlbnRcIl0pIHB1YmxpYyBibHVyKGV2ZW50KSB7XG5cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoXCJmb2N1c1wiLCBbXCIkZXZlbnRcIl0pIHB1YmxpYyBmb2N1cyhldmVudCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cbiAgfVxuICAvKipcbiAgICogY2xpY2sgaGFuZGxlciBvbiBkb2N1bW5lbnQgdG8gaGlkZSB0aGUgb3BlbiBkcm9wZG93biBpZiBjbGlja2VkIG91dHNpZGVcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoXCJkb2N1bWVudDpjbGlja1wiKVxuICBwdWJsaWMgY2xpY2tPdXRzaWRlQ29tcG9uZW50KCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKCF0aGlzLmNsaWNrZWRJbnNpZGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0b3IgPSBbZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2VdXG4gICAgICB0aGlzLnNob3dCYWNrID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2xpY2tlZEluc2lkZSA9IGZhbHNlO1xuICB9XG5cbn1cbiJdfQ==