slr-angularx-social-login
Version:
Social login and authentication module for Angular 13. Supports authentication with Google, Facebook, Amazon, and VK. Can be extended to other providers also.
130 lines • 20.2 kB
JavaScript
import { BaseLoginProvider } from '../entities/base-login-provider';
import { SocialUser } from '../entities/social-user';
/**
* Protocol modes supported by MSAL.
*/
export var ProtocolMode;
(function (ProtocolMode) {
ProtocolMode["AAD"] = "AAD";
ProtocolMode["OIDC"] = "OIDC";
})(ProtocolMode || (ProtocolMode = {}));
const COMMON_AUTHORITY = 'https://login.microsoftonline.com/common/';
/**
* Microsoft Authentication using MSAL v2: https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/lib/msal-browser
*/
export class MicrosoftLoginProvider extends BaseLoginProvider {
constructor(clientId, initOptions) {
super();
this.clientId = clientId;
this.initOptions = {
authority: COMMON_AUTHORITY,
scopes: ['openid', 'email', 'profile', 'User.Read'],
knownAuthorities: [],
protocolMode: ProtocolMode.AAD,
clientCapabilities: [],
cacheLocation: 'sessionStorage'
};
this.initOptions = {
...this.initOptions,
...initOptions
};
}
initialize() {
return new Promise((resolve, reject) => {
this.loadScript(MicrosoftLoginProvider.PROVIDER_ID, 'https://alcdn.msauth.net/browser/2.13.1/js/msal-browser.js', () => {
try {
const config = {
auth: {
clientId: this.clientId,
redirectUri: this.initOptions.redirect_uri ?? location.origin,
authority: this.initOptions.authority,
knownAuthorities: this.initOptions.knownAuthorities,
protocolMode: this.initOptions.protocolMode,
clientCapabilities: this.initOptions.clientCapabilities
},
cache: !this.initOptions.cacheLocation ? null : {
cacheLocation: this.initOptions.cacheLocation
}
};
this._instance = new msal.PublicClientApplication(config);
resolve();
}
catch (e) {
reject(e);
}
});
});
}
getSocialUser(loginResponse) {
return new Promise((resolve, reject) => {
//After login, use Microsoft Graph API to get user info
let meRequest = new XMLHttpRequest();
meRequest.onreadystatechange = () => {
if (meRequest.readyState == 4) {
try {
if (meRequest.status == 200) {
let userInfo = JSON.parse(meRequest.responseText);
let user = new SocialUser();
user.provider = MicrosoftLoginProvider.PROVIDER_ID;
user.id = loginResponse.idToken;
user.authToken = loginResponse.accessToken;
user.name = loginResponse.idTokenClaims.name;
user.email = loginResponse.account.username;
user.idToken = loginResponse.idToken;
user.response = loginResponse;
user.firstName = userInfo.givenName;
user.lastName = userInfo.surname;
resolve(user);
}
else {
reject(`Error retrieving user info: ${meRequest.status}`);
}
}
catch (err) {
reject(err);
}
}
};
//Microsoft Graph ME Endpoint: https://docs.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0&tabs=http
meRequest.open('GET', 'https://graph.microsoft.com/v1.0/me');
meRequest.setRequestHeader('Authorization', `Bearer ${loginResponse.accessToken}`);
try {
meRequest.send();
}
catch (err) {
reject(err);
}
});
}
async getLoginStatus() {
const accounts = this._instance.getAllAccounts();
if (accounts?.length > 0) {
const loginResponse = await this._instance.ssoSilent({
scopes: this.initOptions.scopes,
loginHint: accounts[0].username
});
return await this.getSocialUser(loginResponse);
}
else {
throw `No user is currently logged in with ${MicrosoftLoginProvider.PROVIDER_ID}`;
}
}
async signIn() {
const loginResponse = await this._instance.loginPopup({
scopes: this.initOptions.scopes,
prompt: this.initOptions.prompt,
});
return await this.getSocialUser(loginResponse);
}
async signOut(revoke) {
const accounts = this._instance.getAllAccounts();
if (accounts?.length > 0) {
await this._instance.logoutPopup({
account: accounts[0],
postLogoutRedirectUri: this.initOptions.logout_redirect_uri ?? this.initOptions.redirect_uri ?? location.href
});
}
}
}
MicrosoftLoginProvider.PROVIDER_ID = 'MICROSOFT';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zb2Z0LWxvZ2luLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbGliL3NyYy9wcm92aWRlcnMvbWljcm9zb2Z0LWxvZ2luLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFlBR1g7QUFIRCxXQUFZLFlBQVk7SUFDdEIsMkJBQVcsQ0FBQTtJQUNYLDZCQUFhLENBQUE7QUFDZixDQUFDLEVBSFcsWUFBWSxLQUFaLFlBQVksUUFHdkI7QUFrRkQsTUFBTSxnQkFBZ0IsR0FBVywyQ0FBMkMsQ0FBQztBQUU3RTs7R0FFRztBQUNILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxpQkFBaUI7SUFhM0QsWUFDVSxRQUFnQixFQUN4QixXQUE4QjtRQUU5QixLQUFLLEVBQUUsQ0FBQztRQUhBLGFBQVEsR0FBUixRQUFRLENBQVE7UUFWbEIsZ0JBQVcsR0FBcUI7WUFDdEMsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUM7WUFDbkQsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixZQUFZLEVBQUUsWUFBWSxDQUFDLEdBQUc7WUFDOUIsa0JBQWtCLEVBQUUsRUFBRTtZQUN0QixhQUFhLEVBQUUsZ0JBQWdCO1NBQ2hDLENBQUM7UUFRQSxJQUFJLENBQUMsV0FBVyxHQUFHO1lBQ2pCLEdBQUcsSUFBSSxDQUFDLFdBQVc7WUFDbkIsR0FBRyxXQUFXO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUNiLHNCQUFzQixDQUFDLFdBQVcsRUFDbEMsNERBQTRELEVBQzVELEdBQUcsRUFBRTtnQkFDSCxJQUFJO29CQUNGLE1BQU0sTUFBTSxHQUFHO3dCQUNiLElBQUksRUFBRTs0QkFDSixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7NEJBQ3ZCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsTUFBTTs0QkFDN0QsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUzs0QkFDckMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0I7NEJBQ25ELFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVk7NEJBQzNDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCO3lCQUN4RDt3QkFDRCxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFDOUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYTt5QkFDOUM7cUJBQ0YsQ0FBQztvQkFFRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMxRCxPQUFPLEVBQUUsQ0FBQztpQkFDWDtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDVixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ1g7WUFDSCxDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGFBQWEsQ0FBQyxhQUFhO1FBQ2pDLE9BQU8sSUFBSSxPQUFPLENBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDakQsdURBQXVEO1lBQ3ZELElBQUksU0FBUyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7WUFDckMsU0FBUyxDQUFDLGtCQUFrQixHQUFHLEdBQUcsRUFBRTtnQkFDbEMsSUFBSSxTQUFTLENBQUMsVUFBVSxJQUFJLENBQUMsRUFBRTtvQkFDN0IsSUFBSTt3QkFDRixJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFOzRCQUMzQixJQUFJLFFBQVEsR0FBb0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7NEJBRW5FLElBQUksSUFBSSxHQUFlLElBQUksVUFBVSxFQUFFLENBQUM7NEJBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxDQUFDOzRCQUNuRCxJQUFJLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7NEJBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQzs0QkFDM0MsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQzs0QkFDN0MsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQzs0QkFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDOzRCQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQzs0QkFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDOzRCQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7NEJBRWpDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDZjs2QkFBTTs0QkFDTCxNQUFNLENBQUMsK0JBQStCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO3lCQUMzRDtxQkFDRjtvQkFBQyxPQUFPLEdBQUcsRUFBRTt3QkFDWixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ2I7aUJBQ0Y7WUFDSCxDQUFDLENBQUM7WUFFRixnSEFBZ0g7WUFDaEgsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUscUNBQXFDLENBQUMsQ0FBQztZQUM3RCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLFVBQVUsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDbkYsSUFBSTtnQkFDRixTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDbEI7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDWixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDYjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakQsSUFBSSxRQUFRLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN4QixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO2dCQUNuRCxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO2dCQUMvQixTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7YUFDaEMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDaEQ7YUFBTTtZQUNMLE1BQU0sdUNBQXVDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ25GO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUNwRCxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO1lBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07U0FDaEMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBZ0I7UUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNqRCxJQUFJLFFBQVEsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7Z0JBQy9CLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixxQkFBcUIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxJQUFJO2FBQzlHLENBQUMsQ0FBQTtTQUNIO0lBQ0gsQ0FBQzs7QUE3SHNCLGtDQUFXLEdBQVcsV0FBVyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUxvZ2luUHJvdmlkZXIgfSBmcm9tICcuLi9lbnRpdGllcy9iYXNlLWxvZ2luLXByb3ZpZGVyJztcbmltcG9ydCB7IFNvY2lhbFVzZXIgfSBmcm9tICcuLi9lbnRpdGllcy9zb2NpYWwtdXNlcic7XG5cbi8qKlxuICogUHJvdG9jb2wgbW9kZXMgc3VwcG9ydGVkIGJ5IE1TQUwuXG4gKi9cbmV4cG9ydCBlbnVtIFByb3RvY29sTW9kZSB7XG4gIEFBRCA9ICdBQUQnLFxuICBPSURDID0gJ09JREMnXG59XG5cbi8qKlxuICogSW5pdGlhbGl6YXRpb24gT3B0aW9ucyBmb3IgTWljcm9zb2Z0IFByb3ZpZGVyOiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmVBRC9taWNyb3NvZnQtYXV0aGVudGljYXRpb24tbGlicmFyeS1mb3ItanMvYmxvYi9kZXYvbGliL21zYWwtYnJvd3Nlci9kb2NzL2luaXRpYWxpemF0aW9uLm1kXG4gKiBEZXRhaWxzIChub3QgYWxsIG9wdGlvbnMgYXJlIHN1cHBvcnRlZCk6IGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZUFEL21pY3Jvc29mdC1hdXRoZW50aWNhdGlvbi1saWJyYXJ5LWZvci1qcy9ibG9iL2Rldi9saWIvbXNhbC1icm93c2VyL2RvY3MvY29uZmlndXJhdGlvbi5tZFxuICovXG5leHBvcnQgdHlwZSBNaWNyb3NvZnRPcHRpb25zID0ge1xuICByZWRpcmVjdF91cmk/OiBzdHJpbmcsXG4gIGxvZ291dF9yZWRpcmVjdF91cmk/OiBzdHJpbmcsXG4gIGF1dGhvcml0eT86IHN0cmluZyxcbiAga25vd25BdXRob3JpdGllcz86IHN0cmluZ1tdLFxuICBwcm90b2NvbE1vZGU/OiBQcm90b2NvbE1vZGUsXG4gIGNsaWVudENhcGFiaWxpdGllcz86IHN0cmluZ1tdLFxuICBjYWNoZUxvY2F0aW9uPzogc3RyaW5nLFxuICBzY29wZXM/OiBzdHJpbmdbXSxcbiAgcHJvbXB0Pzogc3RyaW5nLFxufTtcblxuLy8gQ29sbGVjdGlvbiBvZiBpbnRlcm5hbCBNU0FMIGludGVyZmFjZXMgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlQUQvbWljcm9zb2Z0LWF1dGhlbnRpY2F0aW9uLWxpYnJhcnktZm9yLWpzL3RyZWUvZGV2L2xpYi9tc2FsLWJyb3dzZXIvc3JjXG5cbmludGVyZmFjZSBNU0FMQWNjb3VudCB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIGhvbWVBY2NvdW50SWQ6IHN0cmluZztcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgdXNlcm5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE1TR3JhcGhVc2VySW5mbyB7XG4gIGJ1c2luZXNzUGhvbmVzOiBzdHJpbmdbXTtcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgZ2l2ZW5OYW1lOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG4gIGpvYlRpdGxlOiBzdHJpbmc7XG4gIG1haWw6IHN0cmluZztcbiAgbW9iaWxlUGhvbmU6IHN0cmluZztcbiAgb2ZmaWNlTG9jYXRpb246IHN0cmluZztcbiAgcHJlZmVycmVkTGFuZ3VhZ2U6IHN0cmluZztcbiAgc3VybmFtZTogc3RyaW5nO1xuICB1c2VyUHJpbmNpcGFsTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTVNBTExvZ2luUmVxdWVzdCB7XG4gIHNjb3Blcz86IHN0cmluZ1tdO1xuICBzaWQ/OiBzdHJpbmc7XG4gIGxvZ2luSGludD86IHN0cmluZztcbiAgZG9tYWluSGludD86IHN0cmluZztcbiAgcHJvbXB0Pzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTVNBTExvZ2luUmVzcG9uc2Uge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBhY2NvdW50OiBNU0FMQWNjb3VudDtcbiAgZXhwaXJlc09uOiBEYXRlO1xuICBleHRFeHBpcmVzT246IERhdGU7XG4gIGZhbWlseUlkOiBzdHJpbmc7XG4gIGZyb21DYWNoZTogYm9vbGVhbjtcbiAgaWRUb2tlbjogc3RyaW5nO1xuICBpZFRva2VuQ2xhaW1zOiBhbnk7XG4gIHNjb3Blczogc3RyaW5nW107XG4gIHN0YXRlOiBzdHJpbmc7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHVuaXF1ZUlkOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBNU0FMTG9nb3V0UmVxdWVzdCB7XG4gIGFjY291bnQ/OiBNU0FMQWNjb3VudDtcbiAgcG9zdExvZ291dFJlZGlyZWN0VXJpPzogc3RyaW5nO1xuICBhdXRob3JpdHk/OiBzdHJpbmc7XG4gIGNvcnJlbGF0aW9uSWQ/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBNU0FMQ2xpZW50QXBwbGljYXRpb24ge1xuICBnZXRBbGxBY2NvdW50cygpOiBNU0FMQWNjb3VudFtdO1xuICBsb2dvdXRQb3B1cChsb2dvdXRSZXF1ZXN0PzogTVNBTExvZ291dFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+O1xuICBsb2dpblBvcHVwKGxvZ2luUmVxdWVzdDogTVNBTExvZ2luUmVxdWVzdCk6IFByb21pc2U8TVNBTExvZ2luUmVzcG9uc2U+O1xuICBzc29TaWxlbnQobG9naW5SZXF1ZXN0OiBNU0FMTG9naW5SZXF1ZXN0KTogUHJvbWlzZTxNU0FMTG9naW5SZXNwb25zZT47XG4gIGFjcXVpcmVUb2tlblNpbGVudChsb2dpblJlcXVlc3Q6IE1TQUxMb2dpblJlcXVlc3QpOiBQcm9taXNlPE1TQUxMb2dpblJlc3BvbnNlPjtcbiAgZ2V0QWNjb3VudEJ5SG9tZUlkKGhvbWVBY2NvdW50SWQ6IHN0cmluZyk6IE1TQUxBY2NvdW50O1xufVxuXG5kZWNsYXJlIGxldCBtc2FsOiBhbnk7XG5cbmNvbnN0IENPTU1PTl9BVVRIT1JJVFk6IHN0cmluZyA9ICdodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vY29tbW9uLyc7XG5cbi8qKlxuICogTWljcm9zb2Z0IEF1dGhlbnRpY2F0aW9uIHVzaW5nIE1TQUwgdjI6IGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZUFEL21pY3Jvc29mdC1hdXRoZW50aWNhdGlvbi1saWJyYXJ5LWZvci1qcy90cmVlL2Rldi9saWIvbXNhbC1icm93c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBNaWNyb3NvZnRMb2dpblByb3ZpZGVyIGV4dGVuZHMgQmFzZUxvZ2luUHJvdmlkZXIge1xuICBwcml2YXRlIF9pbnN0YW5jZTogTVNBTENsaWVudEFwcGxpY2F0aW9uO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1ZJREVSX0lEOiBzdHJpbmcgPSAnTUlDUk9TT0ZUJztcblxuICBwcml2YXRlIGluaXRPcHRpb25zOiBNaWNyb3NvZnRPcHRpb25zID0ge1xuICAgIGF1dGhvcml0eTogQ09NTU9OX0FVVEhPUklUWSxcbiAgICBzY29wZXM6IFsnb3BlbmlkJywgJ2VtYWlsJywgJ3Byb2ZpbGUnLCAnVXNlci5SZWFkJ10sXG4gICAga25vd25BdXRob3JpdGllczogW10sXG4gICAgcHJvdG9jb2xNb2RlOiBQcm90b2NvbE1vZGUuQUFELFxuICAgIGNsaWVudENhcGFiaWxpdGllczogW10sXG4gICAgY2FjaGVMb2NhdGlvbjogJ3Nlc3Npb25TdG9yYWdlJ1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2xpZW50SWQ6IHN0cmluZyxcbiAgICBpbml0T3B0aW9ucz86IE1pY3Jvc29mdE9wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuaW5pdE9wdGlvbnMgPSB7XG4gICAgICAuLi50aGlzLmluaXRPcHRpb25zLFxuICAgICAgLi4uaW5pdE9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5sb2FkU2NyaXB0KFxuICAgICAgICBNaWNyb3NvZnRMb2dpblByb3ZpZGVyLlBST1ZJREVSX0lELFxuICAgICAgICAnaHR0cHM6Ly9hbGNkbi5tc2F1dGgubmV0L2Jyb3dzZXIvMi4xMy4xL2pzL21zYWwtYnJvd3Nlci5qcycsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVcmk6IHRoaXMuaW5pdE9wdGlvbnMucmVkaXJlY3RfdXJpID8/IGxvY2F0aW9uLm9yaWdpbixcbiAgICAgICAgICAgICAgICBhdXRob3JpdHk6IHRoaXMuaW5pdE9wdGlvbnMuYXV0aG9yaXR5LFxuICAgICAgICAgICAgICAgIGtub3duQXV0aG9yaXRpZXM6IHRoaXMuaW5pdE9wdGlvbnMua25vd25BdXRob3JpdGllcyxcbiAgICAgICAgICAgICAgICBwcm90b2NvbE1vZGU6IHRoaXMuaW5pdE9wdGlvbnMucHJvdG9jb2xNb2RlLFxuICAgICAgICAgICAgICAgIGNsaWVudENhcGFiaWxpdGllczogdGhpcy5pbml0T3B0aW9ucy5jbGllbnRDYXBhYmlsaXRpZXNcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY2FjaGU6ICF0aGlzLmluaXRPcHRpb25zLmNhY2hlTG9jYXRpb24gPyBudWxsIDoge1xuICAgICAgICAgICAgICAgIGNhY2hlTG9jYXRpb246IHRoaXMuaW5pdE9wdGlvbnMuY2FjaGVMb2NhdGlvblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBtc2FsLlB1YmxpY0NsaWVudEFwcGxpY2F0aW9uKGNvbmZpZyk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U29jaWFsVXNlcihsb2dpblJlc3BvbnNlKTogUHJvbWlzZTxTb2NpYWxVc2VyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFNvY2lhbFVzZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vQWZ0ZXIgbG9naW4sIHVzZSBNaWNyb3NvZnQgR3JhcGggQVBJIHRvIGdldCB1c2VyIGluZm9cbiAgICAgIGxldCBtZVJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgIG1lUmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGlmIChtZVJlcXVlc3QucmVhZHlTdGF0ZSA9PSA0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChtZVJlcXVlc3Quc3RhdHVzID09IDIwMCkge1xuICAgICAgICAgICAgICBsZXQgdXNlckluZm8gPSA8TVNHcmFwaFVzZXJJbmZvPkpTT04ucGFyc2UobWVSZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XG5cbiAgICAgICAgICAgICAgbGV0IHVzZXI6IFNvY2lhbFVzZXIgPSBuZXcgU29jaWFsVXNlcigpO1xuICAgICAgICAgICAgICB1c2VyLnByb3ZpZGVyID0gTWljcm9zb2Z0TG9naW5Qcm92aWRlci5QUk9WSURFUl9JRDtcbiAgICAgICAgICAgICAgdXNlci5pZCA9IGxvZ2luUmVzcG9uc2UuaWRUb2tlbjtcbiAgICAgICAgICAgICAgdXNlci5hdXRoVG9rZW4gPSBsb2dpblJlc3BvbnNlLmFjY2Vzc1Rva2VuO1xuICAgICAgICAgICAgICB1c2VyLm5hbWUgPSBsb2dpblJlc3BvbnNlLmlkVG9rZW5DbGFpbXMubmFtZTtcbiAgICAgICAgICAgICAgdXNlci5lbWFpbCA9IGxvZ2luUmVzcG9uc2UuYWNjb3VudC51c2VybmFtZTtcbiAgICAgICAgICAgICAgdXNlci5pZFRva2VuID0gbG9naW5SZXNwb25zZS5pZFRva2VuO1xuICAgICAgICAgICAgICB1c2VyLnJlc3BvbnNlID0gbG9naW5SZXNwb25zZTtcbiAgICAgICAgICAgICAgdXNlci5maXJzdE5hbWUgPSB1c2VySW5mby5naXZlbk5hbWU7XG4gICAgICAgICAgICAgIHVzZXIubGFzdE5hbWUgPSB1c2VySW5mby5zdXJuYW1lO1xuXG4gICAgICAgICAgICAgIHJlc29sdmUodXNlcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZWplY3QoYEVycm9yIHJldHJpZXZpbmcgdXNlciBpbmZvOiAke21lUmVxdWVzdC5zdGF0dXN9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vTWljcm9zb2Z0IEdyYXBoIE1FIEVuZHBvaW50OiBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9ncmFwaC9hcGkvdXNlci1nZXQ/dmlldz1ncmFwaC1yZXN0LTEuMCZ0YWJzPWh0dHBcbiAgICAgIG1lUmVxdWVzdC5vcGVuKCdHRVQnLCAnaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tL3YxLjAvbWUnKTtcbiAgICAgIG1lUmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgYEJlYXJlciAke2xvZ2luUmVzcG9uc2UuYWNjZXNzVG9rZW59YCk7XG4gICAgICB0cnkge1xuICAgICAgICBtZVJlcXVlc3Quc2VuZCgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0TG9naW5TdGF0dXMoKTogUHJvbWlzZTxTb2NpYWxVc2VyPiB7XG4gICAgY29uc3QgYWNjb3VudHMgPSB0aGlzLl9pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpO1xuICAgIGlmIChhY2NvdW50cz8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbG9naW5SZXNwb25zZSA9IGF3YWl0IHRoaXMuX2luc3RhbmNlLnNzb1NpbGVudCh7XG4gICAgICAgIHNjb3BlczogdGhpcy5pbml0T3B0aW9ucy5zY29wZXMsXG4gICAgICAgIGxvZ2luSGludDogYWNjb3VudHNbMF0udXNlcm5hbWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0U29jaWFsVXNlcihsb2dpblJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgYE5vIHVzZXIgaXMgY3VycmVudGx5IGxvZ2dlZCBpbiB3aXRoICR7TWljcm9zb2Z0TG9naW5Qcm92aWRlci5QUk9WSURFUl9JRH1gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNpZ25JbigpOiBQcm9taXNlPFNvY2lhbFVzZXI+IHtcbiAgICBjb25zdCBsb2dpblJlc3BvbnNlID0gYXdhaXQgdGhpcy5faW5zdGFuY2UubG9naW5Qb3B1cCh7XG4gICAgICBzY29wZXM6IHRoaXMuaW5pdE9wdGlvbnMuc2NvcGVzLFxuICAgICAgcHJvbXB0OiB0aGlzLmluaXRPcHRpb25zLnByb21wdCxcbiAgICB9KTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRTb2NpYWxVc2VyKGxvZ2luUmVzcG9uc2UpO1xuICB9XG5cbiAgYXN5bmMgc2lnbk91dChyZXZva2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWNjb3VudHMgPSB0aGlzLl9pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpO1xuICAgIGlmIChhY2NvdW50cz8ubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5faW5zdGFuY2UubG9nb3V0UG9wdXAoe1xuICAgICAgICBhY2NvdW50OiBhY2NvdW50c1swXSxcbiAgICAgICAgcG9zdExvZ291dFJlZGlyZWN0VXJpOiB0aGlzLmluaXRPcHRpb25zLmxvZ291dF9yZWRpcmVjdF91cmkgPz8gdGhpcy5pbml0T3B0aW9ucy5yZWRpcmVjdF91cmkgPz8gbG9jYXRpb24uaHJlZlxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==