@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
126 lines • 19.2 kB
JavaScript
import { TemplateType } from '../sso-configuration.model';
import { at, get, head, isUndefined, map, reject } from 'lodash-es';
import { GrantType, TenantLoginOptionType, UserManagementSource } from '@c8y/client';
import { RequestConfiguration } from '../template-parts/request-configuration.model';
import { Injectable } from '@angular/core';
import { ExternalToken } from '../template-parts/external-token-config.model';
import * as i0 from "@angular/core";
export class KeyCloakConfigurationMapper {
constructor() {
this.urlPattern = /^(.+)\/auth\/realms\/((.+?))$/;
}
mapFrom(templateModel) {
const ssoConfiguration = {
template: TemplateType.KEYCLOAK,
buttonName: templateModel.buttonName,
userIdConfig: templateModel.userIdConfig,
userManagementSource: UserManagementSource.REMOTE,
type: TenantLoginOptionType.OAUTH2,
onNewUser: templateModel.onNewUser,
issuer: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}`,
redirectToPlatform: templateModel.redirectToPlatform || null,
providerName: 'keycloak',
audience: templateModel.audience,
clientId: templateModel.clientId,
logoutRequest: templateModel.logoutRequest.toRequest(),
visibleOnLoginPage: templateModel.visibleOnLoginPage,
signatureVerificationConfig: {
jwks: {
jwksUri: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/certs`
}
},
tokenRequest: {
headers: {},
method: 'POST',
requestParams: {},
operation: 'EXECUTE',
url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/token`,
body: 'grant_type=authorization_code&code=${code}&redirect_uri=${redirectUri}&client_id=${clientId}&client_secret=' +
templateModel.clientSecret
},
authorizationRequest: {
headers: {},
method: 'GET',
requestParams: {
scope: templateModel.scopeId,
client_id: '${clientId}',
redirect_uri: '${redirectUri}',
response_type: 'code'
},
operation: 'REDIRECT',
url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/auth`,
body: ''
},
refreshRequest: {
headers: {},
method: 'POST',
requestParams: {
client_id: '${clientId}',
redirect_uri: '${redirectUri}',
response_type: 'refresh'
},
operation: 'EXECUTE',
url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/token`,
body: 'grant_type=refresh_token&refresh_token=${refreshToken}&client_id=${clientId}&client_secret=' +
templateModel.clientSecret
},
grantType: GrantType.AUTHORIZATION_CODE,
accessTokenToUserDataMappings: templateModel.accessTokenToUserDataMappings,
externalTokenConfig: templateModel.externalTokenConfig.toExternalTokenConfig(),
useIdToken: templateModel.useIdToken
};
return ssoConfiguration;
}
mapTo(ssoConfiguration) {
return {
keyCloakAddress: this.getKeyCloakAddressFromUrl(ssoConfiguration.issuer),
realmName: this.getRealmName(ssoConfiguration.issuer),
clientId: ssoConfiguration.clientId,
clientSecret: this.getClientSecret(ssoConfiguration),
scopeId: this.getScopeId(ssoConfiguration),
buttonName: ssoConfiguration.buttonName,
userIdConfig: ssoConfiguration.userIdConfig,
onNewUser: ssoConfiguration.onNewUser,
redirectToPlatform: ssoConfiguration.redirectToPlatform,
audience: ssoConfiguration.audience,
logoutRequest: new RequestConfiguration(ssoConfiguration.logoutRequest),
visibleOnLoginPage: ssoConfiguration.visibleOnLoginPage,
accessTokenToUserDataMappings: ssoConfiguration.accessTokenToUserDataMappings,
externalTokenConfig: new ExternalToken(ssoConfiguration.externalTokenConfig),
useIdToken: ssoConfiguration.useIdToken
};
}
getKeyCloakAddressFromUrl(url) {
const [, keyCloakAddress] = (url || '').match(this.urlPattern) || [];
return keyCloakAddress;
}
getRealmName(url) {
const [, , realmName] = (url || '').match(this.urlPattern) || [];
return realmName;
}
getClientSecret(ssoConfiguration) {
const bodies = at(ssoConfiguration, ['tokenRequest.body', 'refreshRequest.body']);
const clientSecrets = map(bodies, body => this.getClientSecretFromBody(body));
const clientSecret = this.getFirstDefined(clientSecrets);
return clientSecret ? decodeURIComponent(clientSecret) : '';
}
getClientSecretFromBody(body) {
const [, clientSecret] = (body || '').match(/client_secret=([^&]+)/) || [];
return clientSecret;
}
getFirstDefined(values) {
return head(reject(values, isUndefined));
}
getScopeId(ssoConfiguration) {
return get(ssoConfiguration, 'authorizationRequest.requestParams.scope', '');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyCloakConfigurationMapper, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyCloakConfigurationMapper, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyCloakConfigurationMapper, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWNsb2FrLWNvbmZpZ3VyYXRpb24tbWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vYXV0aC1jb25maWd1cmF0aW9uL3Nzby1jb25maWd1cmF0aW9uL3RlbXBsYXRlcy9rZXktY2xvYWstY29uZmlndXJhdGlvbi1tYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFvQixZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7QUFLOUUsTUFBTSxPQUFPLDJCQUEyQjtJQUh4QztRQUlVLGVBQVUsR0FBRywrQkFBK0IsQ0FBQztLQW9IdEQ7SUFsSEMsT0FBTyxDQUFDLGFBQW9DO1FBQzFDLE1BQU0sZ0JBQWdCLEdBQXFCO1lBQ3pDLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUTtZQUMvQixVQUFVLEVBQUUsYUFBYSxDQUFDLFVBQVU7WUFDcEMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxZQUFZO1lBQ3hDLG9CQUFvQixFQUFFLG9CQUFvQixDQUFDLE1BQU07WUFDakQsSUFBSSxFQUFFLHFCQUFxQixDQUFDLE1BQU07WUFDbEMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTO1lBQ2xDLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxlQUFlLGdCQUFnQixhQUFhLENBQUMsU0FBUyxFQUFFO1lB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dUIsQ0FBQyxJQUFJO1FBQ2xDLE1BQU0sQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRSxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU8sZUFBZSxDQUFDLE1BQU07UUFDNUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTyxVQUFVLENBQUMsZ0JBQWdCO1FBQ2pDLE9BQU8sR0FBRyxDQUFDLGdCQUFnQixFQUFFLDBDQUEwQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLENBQUM7K0dBcEhVLDJCQUEyQjttSEFBM0IsMkJBQTJCLGNBRjFCLE1BQU07OzRGQUVQLDJCQUEyQjtrQkFIdkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTc29Db25maWd1cmF0aW9uTWFwcGVyIH0gZnJvbSAnLi9zc28tY29uZmlndXJhdGlvbi5tYXBwZXInO1xuaW1wb3J0IHsgS2V5Q2xvYWtDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9rZXktY2xvYWsubW9kZWwnO1xuaW1wb3J0IHsgU3NvQ29uZmlndXJhdGlvbiwgVGVtcGxhdGVUeXBlIH0gZnJvbSAnLi4vc3NvLWNvbmZpZ3VyYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgYXQsIGdldCwgaGVhZCwgaXNVbmRlZmluZWQsIG1hcCwgcmVqZWN0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEdyYW50VHlwZSwgVGVuYW50TG9naW5PcHRpb25UeXBlLCBVc2VyTWFuYWdlbWVudFNvdXJjZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFJlcXVlc3RDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vdGVtcGxhdGUtcGFydHMvcmVxdWVzdC1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV4dGVybmFsVG9rZW4gfSBmcm9tICcuLi90ZW1wbGF0ZS1wYXJ0cy9leHRlcm5hbC10b2tlbi1jb25maWcubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBLZXlDbG9ha0NvbmZpZ3VyYXRpb25NYXBwZXIgaW1wbGVtZW50cyBTc29Db25maWd1cmF0aW9uTWFwcGVyPEtleUNsb2FrQ29uZmlndXJhdGlvbj4ge1xuICBwcml2YXRlIHVybFBhdHRlcm4gPSAvXiguKylcXC9hdXRoXFwvcmVhbG1zXFwvKCguKz8pKSQvO1xuXG4gIG1hcEZyb20odGVtcGxhdGVNb2RlbDogS2V5Q2xvYWtDb25maWd1cmF0aW9uKTogU3NvQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3Qgc3NvQ29uZmlndXJhdGlvbjogU3NvQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgIHRlbXBsYXRlOiBUZW1wbGF0ZVR5cGUuS0VZQ0xPQUssXG4gICAgICBidXR0b25OYW1lOiB0ZW1wbGF0ZU1vZGVsLmJ1dHRvbk5hbWUsXG4gICAgICB1c2VySWRDb25maWc6IHRlbXBsYXRlTW9kZWwudXNlcklkQ29uZmlnLFxuICAgICAgdXNlck1hbmFnZW1lbnRTb3VyY2U6IFVzZXJNYW5hZ2VtZW50U291cmNlLlJFTU9URSxcbiAgICAgIHR5cGU6IFRlbmFudExvZ2luT3B0aW9uVHlwZS5PQVVUSDIsXG4gICAgICBvbk5ld1VzZXI6IHRlbXBsYXRlTW9kZWwub25OZXdVc2VyLFxuICAgICAgaXNzdWVyOiBgJHt0ZW1wbGF0ZU1vZGVsLmtleUNsb2FrQWRkcmVzc30vYXV0aC9yZWFsbXMvJHt0ZW1wbGF0ZU1vZGVsLnJlYWxtTmFtZX1gLFxuICAgICAgcmVkaXJlY3RUb1BsYXRmb3JtOiB0ZW1wbGF0ZU1vZGVsLnJlZGlyZWN0VG9QbGF0Zm9ybSB8fCBudWxsLFxuICAgICAgcHJvdmlkZXJOYW1lOiAna2V5Y2xvYWsnLFxuICAgICAgYXVkaWVuY2U6IHRlbXBsYXRlTW9kZWwuYXVkaWVuY2UsXG4gICAgICBjbGllbnRJZDogdGVtcGxhdGVNb2RlbC5jbGllbnRJZCxcbiAgICAgIGxvZ291dFJlcXVlc3Q6IHRlbXBsYXRlTW9kZWwubG9nb3V0UmVxdWVzdC50b1JlcXVlc3QoKSxcbiAgICAgIHZpc2libGVPbkxvZ2luUGFnZTogdGVtcGxhdGVNb2RlbC52aXNpYmxlT25Mb2dpblBhZ2UsXG4gICAgICBzaWduYXR1cmVWZXJpZmljYXRpb25Db25maWc6IHtcbiAgICAgICAgandrczoge1xuICAgICAgICAgIGp3a3NVcmk6IGAke3RlbXBsYXRlTW9kZWwua2V5Q2xvYWtBZGRyZXNzfS9hdXRoL3JlYWxtcy8ke3RlbXBsYXRlTW9kZWwucmVhbG1OYW1lfS9wcm90b2NvbC9vcGVuaWQtY29ubmVjdC9jZXJ0c2BcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRva2VuUmVxdWVzdDoge1xuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIHJlcXVlc3RQYXJhbXM6IHt9LFxuICAgICAgICBvcGVyYXRpb246ICdFWEVDVVRFJyxcbiAgICAgICAgdXJsOiBgJHt0ZW1wbGF0ZU1vZGVsLmtleUNsb2FrQWRkcmVzc30vYXV0aC9yZWFsbXMvJHt0ZW1wbGF0ZU1vZGVsLnJlYWxtTmFtZX0vcHJvdG9jb2wvb3BlbmlkLWNvbm5lY3QvdG9rZW5gLFxuICAgICAgICBib2R5OlxuICAgICAgICAgICdncmFudF90eXBlPWF1dGhvcml6YXRpb25fY29kZSZjb2RlPSR7Y29kZX0mcmVkaXJlY3RfdXJpPSR7cmVkaXJlY3RVcml9JmNsaWVudF9pZD0ke2NsaWVudElkfSZjbGllbnRfc2VjcmV0PScgK1xuICAgICAgICAgIHRlbXBsYXRlTW9kZWwuY2xpZW50U2VjcmV0XG4gICAgICB9LFxuICAgICAgYXV0aG9yaXphdGlvblJlcXVlc3Q6IHtcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHJlcXVlc3RQYXJhbXM6IHtcbiAgICAgICAgICBzY29wZTogdGVtcGxhdGVNb2RlbC5zY29wZUlkLFxuICAgICAgICAgIGNsaWVudF9pZDogJyR7Y2xpZW50SWR9JyxcbiAgICAgICAgICByZWRpcmVjdF91cmk6ICcke3JlZGlyZWN0VXJpfScsXG4gICAgICAgICAgcmVzcG9uc2VfdHlwZTogJ2NvZGUnXG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbjogJ1JFRElSRUNUJyxcbiAgICAgICAgdXJsOiBgJHt0ZW1wbGF0ZU1vZGVsLmtleUNsb2FrQWRkcmVzc30vYXV0aC9yZWFsbXMvJHt0ZW1wbGF0ZU1vZGVsLnJlYWxtTmFtZX0vcHJvdG9jb2wvb3BlbmlkLWNvbm5lY3QvYXV0aGAsXG4gICAgICAgIGJvZHk6ICcnXG4gICAgICB9LFxuICAgICAgcmVmcmVzaFJlcXVlc3Q6IHtcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICByZXF1ZXN0UGFyYW1zOiB7XG4gICAgICAgICAgY2xpZW50X2lkOiAnJHtjbGllbnRJZH0nLFxuICAgICAgICAgIHJlZGlyZWN0X3VyaTogJyR7cmVkaXJlY3RVcml9JyxcbiAgICAgICAgICByZXNwb25zZV90eXBlOiAncmVmcmVzaCdcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uOiAnRVhFQ1VURScsXG4gICAgICAgIHVybDogYCR7dGVtcGxhdGVNb2RlbC5rZXlDbG9ha0FkZHJlc3N9L2F1dGgvcmVhbG1zLyR7dGVtcGxhdGVNb2RlbC5yZWFsbU5hbWV9L3Byb3RvY29sL29wZW5pZC1jb25uZWN0L3Rva2VuYCxcbiAgICAgICAgYm9keTpcbiAgICAgICAgICAnZ3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuJnJlZnJlc2hfdG9rZW49JHtyZWZyZXNoVG9rZW59JmNsaWVudF9pZD0ke2NsaWVudElkfSZjbGllbnRfc2VjcmV0PScgK1xuICAgICAgICAgIHRlbXBsYXRlTW9kZWwuY2xpZW50U2VjcmV0XG4gICAgICB9LFxuICAgICAgZ3JhbnRUeXBlOiBHcmFudFR5cGUuQVVUSE9SSVpBVElPTl9DT0RFLFxuICAgICAgYWNjZXNzVG9rZW5Ub1VzZXJEYXRhTWFwcGluZ3M6IHRlbXBsYXRlTW9kZWwuYWNjZXNzVG9rZW5Ub1VzZXJEYXRhTWFwcGluZ3MsXG4gICAgICBleHRlcm5hbFRva2VuQ29uZmlnOiB0ZW1wbGF0ZU1vZGVsLmV4dGVybmFsVG9rZW5Db25maWcudG9FeHRlcm5hbFRva2VuQ29uZmlnKCksXG4gICAgICB1c2VJZFRva2VuOiB0ZW1wbGF0ZU1vZGVsLnVzZUlkVG9rZW5cbiAgICB9O1xuICAgIHJldHVybiBzc29Db25maWd1cmF0aW9uO1xuICB9XG5cbiAgbWFwVG8oc3NvQ29uZmlndXJhdGlvbjogU3NvQ29uZmlndXJhdGlvbik6IEtleUNsb2FrQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleUNsb2FrQWRkcmVzczogdGhpcy5nZXRLZXlDbG9ha0FkZHJlc3NGcm9tVXJsKHNzb0NvbmZpZ3VyYXRpb24uaXNzdWVyKSxcbiAgICAgIHJlYWxtTmFtZTogdGhpcy5nZXRSZWFsbU5hbWUoc3NvQ29uZmlndXJhdGlvbi5pc3N1ZXIpLFxuICAgICAgY2xpZW50SWQ6IHNzb0NvbmZpZ3VyYXRpb24uY2xpZW50SWQsXG4gICAgICBjbGllbnRTZWNyZXQ6IHRoaXMuZ2V0Q2xpZW50U2VjcmV0KHNzb0NvbmZpZ3VyYXRpb24pLFxuICAgICAgc2NvcGVJZDogdGhpcy5nZXRTY29wZUlkKHNzb0NvbmZpZ3VyYXRpb24pLFxuICAgICAgYnV0dG9uTmFtZTogc3NvQ29uZmlndXJhdGlvbi5idXR0b25OYW1lLFxuICAgICAgdXNlcklkQ29uZmlnOiBzc29Db25maWd1cmF0aW9uLnVzZXJJZENvbmZpZyxcbiAgICAgIG9uTmV3VXNlcjogc3NvQ29uZmlndXJhdGlvbi5vbk5ld1VzZXIsXG4gICAgICByZWRpcmVjdFRvUGxhdGZvcm06IHNzb0NvbmZpZ3VyYXRpb24ucmVkaXJlY3RUb1BsYXRmb3JtLFxuICAgICAgYXVkaWVuY2U6IHNzb0NvbmZpZ3VyYXRpb24uYXVkaWVuY2UsXG4gICAgICBsb2dvdXRSZXF1ZXN0OiBuZXcgUmVxdWVzdENvbmZpZ3VyYXRpb24oc3NvQ29uZmlndXJhdGlvbi5sb2dvdXRSZXF1ZXN0KSxcbiAgICAgIHZpc2libGVPbkxvZ2luUGFnZTogc3NvQ29uZmlndXJhdGlvbi52aXNpYmxlT25Mb2dpblBhZ2UsXG4gICAgICBhY2Nlc3NUb2tlblRvVXNlckRhdGFNYXBwaW5nczogc3NvQ29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlblRvVXNlckRhdGFNYXBwaW5ncyxcbiAgICAgIGV4dGVybmFsVG9rZW5Db25maWc6IG5ldyBFeHRlcm5hbFRva2VuKHNzb0NvbmZpZ3VyYXRpb24uZXh0ZXJuYWxUb2tlbkNvbmZpZyksXG4gICAgICB1c2VJZFRva2VuOiBzc29Db25maWd1cmF0aW9uLnVzZUlkVG9rZW5cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRLZXlDbG9ha0FkZHJlc3NGcm9tVXJsKHVybCkge1xuICAgIGNvbnN0IFssIGtleUNsb2FrQWRkcmVzc10gPSAodXJsIHx8ICcnKS5tYXRjaCh0aGlzLnVybFBhdHRlcm4pIHx8IFtdO1xuICAgIHJldHVybiBrZXlDbG9ha0FkZHJlc3M7XG4gIH1cblxuICBwcml2YXRlIGdldFJlYWxtTmFtZSh1cmwpIHtcbiAgICBjb25zdCBbLCAsIHJlYWxtTmFtZV0gPSAodXJsIHx8ICcnKS5tYXRjaCh0aGlzLnVybFBhdHRlcm4pIHx8IFtdO1xuICAgIHJldHVybiByZWFsbU5hbWU7XG4gIH1cblxuICBwcml2YXRlIGdldENsaWVudFNlY3JldChzc29Db25maWd1cmF0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBib2RpZXMgPSBhdChzc29Db25maWd1cmF0aW9uLCBbJ3Rva2VuUmVxdWVzdC5ib2R5JywgJ3JlZnJlc2hSZXF1ZXN0LmJvZHknXSk7XG4gICAgY29uc3QgY2xpZW50U2VjcmV0cyA9IG1hcChib2RpZXMsIGJvZHkgPT4gdGhpcy5nZXRDbGllbnRTZWNyZXRGcm9tQm9keShib2R5KSk7XG4gICAgY29uc3QgY2xpZW50U2VjcmV0ID0gdGhpcy5nZXRGaXJzdERlZmluZWQoY2xpZW50U2VjcmV0cyk7XG4gICAgcmV0dXJuIGNsaWVudFNlY3JldCA/IGRlY29kZVVSSUNvbXBvbmVudChjbGllbnRTZWNyZXQpIDogJyc7XG4gIH1cblxuICBwcml2YXRlIGdldENsaWVudFNlY3JldEZyb21Cb2R5KGJvZHkpIHtcbiAgICBjb25zdCBbLCBjbGllbnRTZWNyZXRdID0gKGJvZHkgfHwgJycpLm1hdGNoKC9jbGllbnRfc2VjcmV0PShbXiZdKykvKSB8fCBbXTtcbiAgICByZXR1cm4gY2xpZW50U2VjcmV0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaXJzdERlZmluZWQodmFsdWVzKSB7XG4gICAgcmV0dXJuIGhlYWQocmVqZWN0KHZhbHVlcywgaXNVbmRlZmluZWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NvcGVJZChzc29Db25maWd1cmF0aW9uKSB7XG4gICAgcmV0dXJuIGdldChzc29Db25maWd1cmF0aW9uLCAnYXV0aG9yaXphdGlvblJlcXVlc3QucmVxdWVzdFBhcmFtcy5zY29wZScsICcnKTtcbiAgfVxufVxuIl19