@spartacus/checkout
Version:
Checkout feature library for Spartacus
168 lines • 27.9 kB
JavaScript
import { HttpHeaders, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { CARD_TYPE_NORMALIZER, PAYMENT_DETAILS_SERIALIZER, } from '@spartacus/checkout/core';
import { HttpParamsURIEncoder, PAYMENT_DETAILS_NORMALIZER, } from '@spartacus/core';
import { map, mergeMap } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "@spartacus/core";
export class OccCheckoutPaymentAdapter {
constructor(http, occEndpoints, converter) {
this.http = http;
this.occEndpoints = occEndpoints;
this.converter = converter;
if (typeof DOMParser !== 'undefined') {
this.domparser = new DOMParser();
}
}
getSetPaymentDetailsEndpoint(userId, cartId, paymentDetailsId) {
return this.occEndpoints.buildUrl('setCartPaymentDetails', {
urlParams: { userId, cartId },
queryParams: { paymentDetailsId },
});
}
getPaymentProviderSubInfoEndpoint(userId, cartId) {
return this.occEndpoints.buildUrl('paymentProviderSubInfo', {
urlParams: {
userId,
cartId,
},
});
}
getCreatePaymentDetailsEndpoint(userId, cartId) {
return this.occEndpoints.buildUrl('createPaymentDetails', {
urlParams: {
userId,
cartId,
},
});
}
getCardTypesEndpoint() {
return this.occEndpoints.buildUrl('cardTypes');
}
create(userId, cartId, paymentDetails) {
paymentDetails = this.converter.convert(paymentDetails, PAYMENT_DETAILS_SERIALIZER);
return this.getProviderSubInfo(userId, cartId).pipe(map((data) => {
const labelsMap = this.convertToMap(data.mappingLabels.entry);
return {
url: data.postUrl,
parameters: this.getParamsForPaymentProvider(paymentDetails, data.parameters.entry, labelsMap),
mappingLabels: labelsMap,
};
}), mergeMap((sub) => {
// create a subscription directly with payment provider
return this.createSubWithProvider(sub.url, sub.parameters).pipe(map((response) => this.extractPaymentDetailsFromHtml(response)), mergeMap((fromPaymentProvider) => {
var _a;
fromPaymentProvider['defaultPayment'] =
(_a = paymentDetails.defaultPayment) !== null && _a !== void 0 ? _a : false;
fromPaymentProvider['savePaymentInfo'] = true;
return this.createDetailsWithParameters(userId, cartId, fromPaymentProvider).pipe(this.converter.pipeable(PAYMENT_DETAILS_NORMALIZER));
}));
}));
}
set(userId, cartId, paymentDetailsId) {
return this.http.put(this.getSetPaymentDetailsEndpoint(userId, cartId, paymentDetailsId), {});
}
loadCardTypes() {
return this.http.get(this.getCardTypesEndpoint()).pipe(map((cardTypeList) => { var _a; return (_a = cardTypeList.cardTypes) !== null && _a !== void 0 ? _a : []; }), this.converter.pipeableMany(CARD_TYPE_NORMALIZER));
}
getProviderSubInfo(userId, cartId) {
return this.http.get(this.getPaymentProviderSubInfoEndpoint(userId, cartId));
}
createSubWithProvider(postUrl, parameters) {
const headers = new HttpHeaders({
'Content-Type': 'application/x-www-form-urlencoded',
Accept: 'text/html',
});
let httpParams = new HttpParams({ encoder: new HttpParamsURIEncoder() });
Object.keys(parameters).forEach((key) => {
httpParams = httpParams.append(key, parameters[key]);
});
return this.http.post(postUrl, httpParams, {
headers,
responseType: 'text',
});
}
createDetailsWithParameters(userId, cartId, parameters) {
let httpParams = new HttpParams({ encoder: new HttpParamsURIEncoder() });
Object.keys(parameters).forEach((key) => {
httpParams = httpParams.append(key, parameters[key]);
});
const headers = new HttpHeaders({
'Content-Type': 'application/x-www-form-urlencoded',
});
return this.http.post(this.getCreatePaymentDetailsEndpoint(userId, cartId), httpParams, { headers });
}
getParamsForPaymentProvider(paymentDetails, parameters, mappingLabels) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
const params = this.convertToMap(parameters);
params[mappingLabels['hybris_account_holder_name']] =
paymentDetails.accountHolderName;
params[mappingLabels['hybris_card_type']] = (_a = paymentDetails.cardType) === null || _a === void 0 ? void 0 : _a.code;
params[mappingLabels['hybris_card_number']] = paymentDetails.cardNumber;
if (mappingLabels['hybris_combined_expiry_date'] === 'true') {
params[mappingLabels['hybris_card_expiry_date']] =
paymentDetails.expiryMonth +
mappingLabels['hybris_separator_expiry_date'] +
paymentDetails.expiryYear;
}
else {
params[mappingLabels['hybris_card_expiration_month']] =
paymentDetails.expiryMonth;
params[mappingLabels['hybris_card_expiration_year']] =
paymentDetails.expiryYear;
}
params[mappingLabels['hybris_card_cvn']] = paymentDetails.cvn;
// billing address
params[mappingLabels['hybris_billTo_country']] =
(_c = (_b = paymentDetails.billingAddress) === null || _b === void 0 ? void 0 : _b.country) === null || _c === void 0 ? void 0 : _c.isocode;
params[mappingLabels['hybris_billTo_firstname']] =
(_d = paymentDetails.billingAddress) === null || _d === void 0 ? void 0 : _d.firstName;
params[mappingLabels['hybris_billTo_lastname']] =
(_e = paymentDetails.billingAddress) === null || _e === void 0 ? void 0 : _e.lastName;
params[mappingLabels['hybris_billTo_street1']] =
((_f = paymentDetails.billingAddress) === null || _f === void 0 ? void 0 : _f.line1) +
' ' +
((_g = paymentDetails.billingAddress) === null || _g === void 0 ? void 0 : _g.line2);
params[mappingLabels['hybris_billTo_city']] =
(_h = paymentDetails.billingAddress) === null || _h === void 0 ? void 0 : _h.town;
if ((_j = paymentDetails.billingAddress) === null || _j === void 0 ? void 0 : _j.region) {
params[mappingLabels['hybris_billTo_region']] =
paymentDetails.billingAddress.region.isocodeShort;
}
else {
params[mappingLabels['hybris_billTo_region']] = '';
}
params[mappingLabels['hybris_billTo_postalcode']] =
(_k = paymentDetails.billingAddress) === null || _k === void 0 ? void 0 : _k.postalCode;
return params;
}
extractPaymentDetailsFromHtml(html) {
const domdoc = this.domparser.parseFromString(html, 'text/xml');
const responseForm = domdoc.getElementsByTagName('form')[0];
const inputs = responseForm.getElementsByTagName('input');
const values = {};
for (let i = 0; inputs[i]; i++) {
const input = inputs[i];
const name = input.getAttribute('name');
const value = input.getAttribute('value');
if (name && name !== '{}' && value && value !== '') {
values[name] = value;
}
}
return values;
}
convertToMap(paramList) {
return paramList.reduce(function (result, item) {
const key = item.key;
result[key] = item.value;
return result;
}, {});
}
}
OccCheckoutPaymentAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OccCheckoutPaymentAdapter, deps: [{ token: i1.HttpClient }, { token: i2.OccEndpointsService }, { token: i2.ConverterService }], target: i0.ɵɵFactoryTarget.Injectable });
OccCheckoutPaymentAdapter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OccCheckoutPaymentAdapter });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OccCheckoutPaymentAdapter, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.OccEndpointsService }, { type: i2.ConverterService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NjLWNoZWNrb3V0LXBheW1lbnQuYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2ZlYXR1cmUtbGlicy9jaGVja291dC9vY2MvYWRhcHRlcnMvb2NjLWNoZWNrb3V0LXBheW1lbnQuYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUNMLG9CQUFvQixFQUVwQiwwQkFBMEIsR0FDM0IsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBR0wsb0JBQW9CLEVBSXBCLDBCQUEwQixHQUMzQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFHL0MsTUFBTSxPQUFPLHlCQUF5QjtJQUNwQyxZQUNZLElBQWdCLEVBQ2hCLFlBQWlDLEVBQ2pDLFNBQTJCO1FBRjNCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBRXJDLElBQUksT0FBTyxTQUFTLEtBQUssV0FBVyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztTQUNsQztJQUNILENBQUM7SUFJUyw0QkFBNEIsQ0FDcEMsTUFBYyxFQUNkLE1BQWMsRUFDZCxnQkFBd0I7UUFFeEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtZQUN6RCxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO1lBQzdCLFdBQVcsRUFBRSxFQUFFLGdCQUFnQixFQUFFO1NBQ2xDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFF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QUM7O3NIQWpQVSx5QkFBeUI7MEhBQXpCLHlCQUF5QjsyRkFBekIseUJBQXlCO2tCQURyQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDQVJEX1RZUEVfTk9STUFMSVpFUixcbiAgQ2hlY2tvdXRQYXltZW50QWRhcHRlcixcbiAgUEFZTUVOVF9ERVRBSUxTX1NFUklBTElaRVIsXG59IGZyb20gJ0BzcGFydGFjdXMvY2hlY2tvdXQvY29yZSc7XG5pbXBvcnQge1xuICBDYXJkVHlwZSxcbiAgQ29udmVydGVyU2VydmljZSxcbiAgSHR0cFBhcmFtc1VSSUVuY29kZXIsXG4gIE9jYyxcbiAgT2NjRW5kcG9pbnRzU2VydmljZSxcbiAgUGF5bWVudERldGFpbHMsXG4gIFBBWU1FTlRfREVUQUlMU19OT1JNQUxJWkVSLFxufSBmcm9tICdAc3BhcnRhY3VzL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBtZXJnZU1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9jY0NoZWNrb3V0UGF5bWVudEFkYXB0ZXIgaW1wbGVtZW50cyBDaGVja291dFBheW1lbnRBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJvdGVjdGVkIG9jY0VuZHBvaW50czogT2NjRW5kcG9pbnRzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY29udmVydGVyOiBDb252ZXJ0ZXJTZXJ2aWNlXG4gICkge1xuICAgIGlmICh0eXBlb2YgRE9NUGFyc2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5kb21wYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkb21wYXJzZXI6IERPTVBhcnNlcjtcblxuICBwcm90ZWN0ZWQgZ2V0U2V0UGF5bWVudERldGFpbHNFbmRwb2ludChcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBjYXJ0SWQ6IHN0cmluZyxcbiAgICBwYXltZW50RGV0YWlsc0lkOiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5vY2NFbmRwb2ludHMuYnVpbGRVcmwoJ3NldENhcnRQYXltZW50RGV0YWlscycsIHtcbiAgICAgIHVybFBhcmFtczogeyB1c2VySWQsIGNhcnRJZCB9LFxuICAgICAgcXVlcnlQYXJhbXM6IHsgcGF5bWVudERldGFpbHNJZCB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBheW1lbnRQcm92aWRlclN1YkluZm9FbmRwb2ludChcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBjYXJ0SWQ6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9jY0VuZHBvaW50cy5idWlsZFVybCgncGF5bWVudFByb3ZpZGVyU3ViSW5mbycsIHtcbiAgICAgIHVybFBhcmFtczoge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIGNhcnRJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q3JlYXRlUGF5bWVudERldGFpbHNFbmRwb2ludChcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBjYXJ0SWQ6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9jY0VuZHBvaW50cy5idWlsZFVybCgnY3JlYXRlUGF5bWVudERldGFpbHMnLCB7XG4gICAgICB1cmxQYXJhbXM6IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBjYXJ0SWQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENhcmRUeXBlc0VuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub2NjRW5kcG9pbnRzLmJ1aWxkVXJsKCdjYXJkVHlwZXMnKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUoXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgY2FydElkOiBzdHJpbmcsXG4gICAgcGF5bWVudERldGFpbHM6IFBheW1lbnREZXRhaWxzXG4gICk6IE9ic2VydmFibGU8UGF5bWVudERldGFpbHM+IHtcbiAgICBwYXltZW50RGV0YWlscyA9IHRoaXMuY29udmVydGVyLmNvbnZlcnQoXG4gICAgICBwYXltZW50RGV0YWlscyxcbiAgICAgIFBBWU1FTlRfREVUQUlMU19TRVJJQUxJWkVSXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm92aWRlclN1YkluZm8odXNlcklkLCBjYXJ0SWQpLnBpcGUoXG4gICAgICBtYXAoKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgbGFiZWxzTWFwID0gdGhpcy5jb252ZXJ0VG9NYXAoZGF0YS5tYXBwaW5nTGFiZWxzLmVudHJ5KSBhcyB7XG4gICAgICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVybDogZGF0YS5wb3N0VXJsLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHRoaXMuZ2V0UGFyYW1zRm9yUGF5bWVudFByb3ZpZGVyKFxuICAgICAgICAgICAgcGF5bWVudERldGFpbHMsXG4gICAgICAgICAgICBkYXRhLnBhcmFtZXRlcnMuZW50cnksXG4gICAgICAgICAgICBsYWJlbHNNYXBcbiAgICAgICAgICApLFxuICAgICAgICAgIG1hcHBpbmdMYWJlbHM6IGxhYmVsc01hcCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICAgbWVyZ2VNYXAoKHN1YikgPT4ge1xuICAgICAgICAvLyBjcmVhdGUgYSBzdWJzY3JpcHRpb24gZGlyZWN0bHkgd2l0aCBwYXltZW50IHByb3ZpZGVyXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVN1YldpdGhQcm92aWRlcihzdWIudXJsLCBzdWIucGFyYW1ldGVycykucGlwZShcbiAgICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB0aGlzLmV4dHJhY3RQYXltZW50RGV0YWlsc0Zyb21IdG1sKHJlc3BvbnNlKSksXG4gICAgICAgICAgbWVyZ2VNYXAoKGZyb21QYXltZW50UHJvdmlkZXIpID0+IHtcbiAgICAgICAgICAgIGZyb21QYXltZW50UHJvdmlkZXJbJ2RlZmF1bHRQYXltZW50J10gPVxuICAgICAgICAgICAgICBwYXltZW50RGV0YWlscy5kZWZhdWx0UGF5bWVudCA/PyBmYWxzZTtcbiAgICAgICAgICAgIGZyb21QYXltZW50UHJvdmlkZXJbJ3NhdmVQYXltZW50SW5mbyddID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURldGFpbHNXaXRoUGFyYW1ldGVycyhcbiAgICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgICBjYXJ0SWQsXG4gICAgICAgICAgICAgIGZyb21QYXltZW50UHJvdmlkZXJcbiAgICAgICAgICAgICkucGlwZSh0aGlzLmNvbnZlcnRlci5waXBlYWJsZShQQVlNRU5UX0RFVEFJTFNfTk9STUFMSVpFUikpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0KFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIGNhcnRJZDogc3RyaW5nLFxuICAgIHBheW1lbnREZXRhaWxzSWQ6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0KFxuICAgICAgdGhpcy5nZXRTZXRQYXltZW50RGV0YWlsc0VuZHBvaW50KHVzZXJJZCwgY2FydElkLCBwYXltZW50RGV0YWlsc0lkKSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIGxvYWRDYXJkVHlwZXMoKTogT2JzZXJ2YWJsZTxDYXJkVHlwZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8T2NjLkNhcmRUeXBlTGlzdD4odGhpcy5nZXRDYXJkVHlwZXNFbmRwb2ludCgpKS5waXBlKFxuICAgICAgbWFwKChjYXJkVHlwZUxpc3QpID0+IGNhcmRUeXBlTGlzdC5jYXJkVHlwZXMgPz8gW10pLFxuICAgICAgdGhpcy5jb252ZXJ0ZXIucGlwZWFibGVNYW55KENBUkRfVFlQRV9OT1JNQUxJWkVSKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UHJvdmlkZXJTdWJJbmZvKFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIGNhcnRJZDogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoXG4gICAgICB0aGlzLmdldFBheW1lbnRQcm92aWRlclN1YkluZm9FbmRwb2ludCh1c2VySWQsIGNhcnRJZClcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1YldpdGhQcm92aWRlcihcbiAgICBwb3N0VXJsOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVyczogYW55XG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICBBY2NlcHQ6ICd0ZXh0L2h0bWwnLFxuICAgIH0pO1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoeyBlbmNvZGVyOiBuZXcgSHR0cFBhcmFtc1VSSUVuY29kZXIoKSB9KTtcbiAgICBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksIHBhcmFtZXRlcnNba2V5XSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QocG9zdFVybCwgaHR0cFBhcmFtcywge1xuICAgICAgaGVhZGVycyxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZURldGFpbHNXaXRoUGFyYW1ldGVycyhcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBjYXJ0SWQ6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBhbnlcbiAgKTogT2JzZXJ2YWJsZTxQYXltZW50RGV0YWlscz4ge1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoeyBlbmNvZGVyOiBuZXcgSHR0cFBhcmFtc1VSSUVuY29kZXIoKSB9KTtcbiAgICBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksIHBhcmFtZXRlcnNba2V5XSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxQYXltZW50RGV0YWlscz4oXG4gICAgICB0aGlzLmdldENyZWF0ZVBheW1lbnREZXRhaWxzRW5kcG9pbnQodXNlcklkLCBjYXJ0SWQpLFxuICAgICAgaHR0cFBhcmFtcyxcbiAgICAgIHsgaGVhZGVycyB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyYW1zRm9yUGF5bWVudFByb3ZpZGVyKFxuICAgIHBheW1lbnREZXRhaWxzOiBQYXltZW50RGV0YWlscyxcbiAgICBwYXJhbWV0ZXJzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSxcbiAgICBtYXBwaW5nTGFiZWxzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9XG4gICkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuY29udmVydFRvTWFwKHBhcmFtZXRlcnMpO1xuICAgIHBhcmFtc1ttYXBwaW5nTGFiZWxzWydoeWJyaXNfYWNjb3VudF9ob2xkZXJfbmFtZSddXSA9XG4gICAgICBwYXltZW50RGV0YWlscy5hY2NvdW50SG9sZGVyTmFtZTtcbiAgICBwYXJhbXNbbWFwcGluZ0xhYmVsc1snaHlicmlzX2NhcmRfdHlwZSddXSA9IHBheW1lbnREZXRhaWxzLmNhcmRUeXBlPy5jb2RlO1xuICAgIHBhcmFtc1ttYXBwaW5nTGFiZWxzWydoeWJyaXNfY2FyZF9udW1iZXInXV0gPSBwYXltZW50RGV0YWlscy5jYXJkTnVtYmVyO1xuICAgIGlmIChtYXBwaW5nTGFiZWxzWydoeWJyaXNfY29tYmluZWRfZXhwaXJ5X2RhdGUnXSA9PT0gJ3RydWUnKSB7XG4gICAgICBwYXJhbXNbbWFwcGluZ0xhYmVsc1snaHlicmlzX2NhcmRfZXhwaXJ5X2RhdGUnXV0gPVxuICAgICAgICBwYXltZW50RGV0YWlscy5leHBpcnlNb250aCArXG4gICAgICAgIG1hcHBpbmdMYWJlbHNbJ2h5YnJpc19zZXBhcmF0b3JfZXhwaXJ5X2RhdGUnXSArXG4gICAgICAgIHBheW1lbnREZXRhaWxzLmV4cGlyeVllYXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtc1ttYXBwaW5nTGFiZWxzWydoeWJyaXNfY2FyZF9leHBpcmF0aW9uX21vbnRoJ11dID1cbiAgICAgICAgcGF5bWVudERldGFpbHMuZXhwaXJ5TW9udGg7XG4gICAgICBwYXJhbXNbbWFwcGluZ0xhYmVsc1snaHlicmlzX2NhcmRfZXhwaXJhdGlvbl95ZWFyJ11dID1cbiAgICAgICAgcGF5bWVudERldGFpbHMuZXhwaXJ5WWVhcjtcbiAgICB9XG4gICAgcGFyYW1zW21hcHBpbmdMYWJlbHNbJ2h5YnJpc19jYXJkX2N2biddXSA9IHBheW1lbnREZXRhaWxzLmN2bjtcblxuICAgIC8vIGJpbGxpbmcgYWRkcmVzc1xuICAgIHBhcmFtc1ttYXBwaW5nTGFiZWxzWydoeWJyaXNfYmlsbFRvX2NvdW50cnknXV0gPVxuICAgICAgcGF5bWVudERldGFpbHMuYmlsbGluZ0FkZHJlc3M/LmNvdW50cnk/Lmlzb2NvZGU7XG4gICAgcGFyYW1zW21hcHBpbmdMYWJlbHNbJ2h5YnJpc19iaWxsVG9fZmlyc3RuYW1lJ11dID1cbiAgICAgIHBheW1lbnREZXRhaWxzLmJpbGxpbmdBZGRyZXNzPy5maXJzdE5hbWU7XG4gICAgcGFyYW1zW21hcHBpbmdMYWJlbHNbJ2h5YnJpc19iaWxsVG9fbGFzdG5hbWUnXV0gPVxuICAgICAgcGF5bWVudERldGFpbHMuYmlsbGluZ0FkZHJlc3M/Lmxhc3ROYW1lO1xuICAgIHBhcmFtc1ttYXBwaW5nTGFiZWxzWydoeWJyaXNfYmlsbFRvX3N0cmVldDEnXV0gPVxuICAgICAgcGF5bWVudERldGFpbHMuYmlsbGluZ0FkZHJlc3M/LmxpbmUxICtcbiAgICAgICcgJyArXG4gICAgICBwYXltZW50RGV0YWlscy5iaWxsaW5nQWRkcmVzcz8ubGluZTI7XG4gICAgcGFyYW1zW21hcHBpbmdMYWJlbHNbJ2h5YnJpc19iaWxsVG9fY2l0eSddXSA9XG4gICAgICBwYXltZW50RGV0YWlscy5iaWxsaW5nQWRkcmVzcz8udG93bjtcbiAgICBpZiAocGF5bWVudERldGFpbHMuYmlsbGluZ0FkZHJlc3M/LnJlZ2lvbikge1xuICAgICAgcGFyYW1zW21hcHBpbmdMYWJlbHNbJ2h5YnJpc19iaWxsVG9fcmVnaW9uJ11dID1cbiAgICAgICAgcGF5bWVudERldGFpbHMuYmlsbGluZ0FkZHJlc3MucmVnaW9uLmlzb2NvZGVTaG9ydDtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zW21hcHBpbmdMYWJlbHNbJ2h5YnJpc19iaWxsVG9fcmVnaW9uJ11dID0gJyc7XG4gICAgfVxuICAgIHBhcmFtc1ttYXBwaW5nTGFiZWxzWydoeWJyaXNfYmlsbFRvX3Bvc3RhbGNvZGUnXV0gPVxuICAgICAgcGF5bWVudERldGFpbHMuYmlsbGluZ0FkZHJlc3M/LnBvc3RhbENvZGU7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFBheW1lbnREZXRhaWxzRnJvbUh0bWwoaHRtbDogc3RyaW5nKToge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IGJvb2xlYW47XG4gIH0ge1xuICAgIGNvbnN0IGRvbWRvYyA9IHRoaXMuZG9tcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC94bWwnKTtcbiAgICBjb25zdCByZXNwb25zZUZvcm0gPSBkb21kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2Zvcm0nKVswXTtcbiAgICBjb25zdCBpbnB1dHMgPSByZXNwb25zZUZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7XG5cbiAgICBjb25zdCB2YWx1ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgYm9vbGVhbiB9ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGlucHV0c1tpXTsgaSsrKSB7XG4gICAgICBjb25zdCBpbnB1dCA9IGlucHV0c1tpXTtcbiAgICAgIGNvbnN0IG5hbWUgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5wdXQuZ2V0QXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gJ3t9JyAmJiB2YWx1ZSAmJiB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgdmFsdWVzW25hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvTWFwKHBhcmFtTGlzdDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9IHtcbiAgICByZXR1cm4gcGFyYW1MaXN0LnJlZHVjZShmdW5jdGlvbiAoXG4gICAgICByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0sXG4gICAgICBpdGVtXG4gICAgKSB7XG4gICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcbiAgICAgIHJlc3VsdFtrZXldID0gaXRlbS52YWx1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICB7fSk7XG4gIH1cbn1cbiJdfQ==