diff --git a/eslint.config.mjs b/eslint.config.mjs index 38dc57c80..69f4bccda 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -24,6 +24,14 @@ const tsConfigs = compat 'no-console': 'warn', 'no-underscore-dangle': 'off', 'no-restricted-syntax': ['error', 'LabeledStatement', 'WithStatement'], + 'no-restricted-properties': [2, + { + object: 'program', + property: 'outputHelp', + message: + 'Use program.help() instead of program.outputHelp() for consistency. program.help() exits immediately, so no code should follow it.', + }, + ], 'no-multi-str': 'off', 'simple-import-sort/imports': 'error', 'simple-import-sort/exports': 'error', diff --git a/src/cli/_template/something-delete.ts b/src/cli/_template/something-delete.ts index 4e72f51e0..f90d2cb80 100644 --- a/src/cli/_template/something-delete.ts +++ b/src/cli/_template/something-delete.ts @@ -60,7 +60,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-describe.ts b/src/cli/_template/something-describe.ts index 33928b065..040ecb98c 100644 --- a/src/cli/_template/something-describe.ts +++ b/src/cli/_template/something-describe.ts @@ -48,7 +48,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-else-delete.ts b/src/cli/_template/something-else-delete.ts index 818b705a5..23dc1e5f6 100644 --- a/src/cli/_template/something-else-delete.ts +++ b/src/cli/_template/something-else-delete.ts @@ -58,7 +58,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-else-describe.ts b/src/cli/_template/something-else-describe.ts index b64a9e1e9..9062f4c7b 100644 --- a/src/cli/_template/something-else-describe.ts +++ b/src/cli/_template/something-else-describe.ts @@ -46,7 +46,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-else-export.ts b/src/cli/_template/something-else-export.ts index da1efba41..e8b73d6fb 100644 --- a/src/cli/_template/something-else-export.ts +++ b/src/cli/_template/something-else-export.ts @@ -70,7 +70,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-else-import.ts b/src/cli/_template/something-else-import.ts index af35a4894..b2af96882 100644 --- a/src/cli/_template/something-else-import.ts +++ b/src/cli/_template/something-else-import.ts @@ -64,7 +64,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-else-list.ts b/src/cli/_template/something-else-list.ts index b20ffdcb3..f86382765 100644 --- a/src/cli/_template/something-else-list.ts +++ b/src/cli/_template/something-else-list.ts @@ -48,7 +48,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-export.ts b/src/cli/_template/something-export.ts index ff4dafc16..ce9da1e17 100644 --- a/src/cli/_template/something-export.ts +++ b/src/cli/_template/something-export.ts @@ -70,7 +70,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-import.ts b/src/cli/_template/something-import.ts index 2feaa8f0f..810a51115 100644 --- a/src/cli/_template/something-import.ts +++ b/src/cli/_template/something-import.ts @@ -64,7 +64,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-list.ts b/src/cli/_template/something-list.ts index 7d79e8c2b..d0fb5a2c1 100644 --- a/src/cli/_template/something-list.ts +++ b/src/cli/_template/something-list.ts @@ -44,7 +44,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-other-delete.ts b/src/cli/_template/something-other-delete.ts index 5a62ceb2d..111eabb04 100644 --- a/src/cli/_template/something-other-delete.ts +++ b/src/cli/_template/something-other-delete.ts @@ -58,7 +58,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-other-describe.ts b/src/cli/_template/something-other-describe.ts index 127d96d5d..d0e202fa6 100644 --- a/src/cli/_template/something-other-describe.ts +++ b/src/cli/_template/something-other-describe.ts @@ -46,7 +46,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-other-export.ts b/src/cli/_template/something-other-export.ts index eb965b599..4bcbd3174 100644 --- a/src/cli/_template/something-other-export.ts +++ b/src/cli/_template/something-other-export.ts @@ -70,7 +70,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-other-import.ts b/src/cli/_template/something-other-import.ts index 2f078687a..6ba77097b 100644 --- a/src/cli/_template/something-other-import.ts +++ b/src/cli/_template/something-other-import.ts @@ -64,7 +64,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/_template/something-other-list.ts b/src/cli/_template/something-other-list.ts index c56664d76..92d31219c 100644 --- a/src/cli/_template/something-other-list.ts +++ b/src/cli/_template/something-other-list.ts @@ -48,7 +48,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/admin/admin-add-autoid-static-user-mapping.ts b/src/cli/admin/admin-add-autoid-static-user-mapping.ts index ab6160b29..a6154c94b 100644 --- a/src/cli/admin/admin-add-autoid-static-user-mapping.ts +++ b/src/cli/admin/admin-add-autoid-static-user-mapping.ts @@ -31,13 +31,16 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - printMessage(`Adding AutoId static user mapping...`); - const outcome = await addAutoIdStaticUserMapping(); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + printMessage(`Adding AutoId static user mapping...`); + const outcome = await addAutoIdStaticUserMapping(); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.ts b/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.ts index 680122c69..912a42642 100644 --- a/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.ts +++ b/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.ts @@ -71,70 +71,73 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - printMessage( - `Creating oauth2 client with admin privileges in realm "${state.getRealm()}"...` - ); - let clientId = uuidv4(); - let clientSecret = uuidv4(); - if (options.clientId) { - clientId = options.clientId; - } - if (options.clientSecret) { - clientSecret = options.clientSecret; - } - if ( - await createOAuth2ClientWithAdminPrivileges(clientId, clientSecret) - ) { - const table = new Table({ - chars: { - top: '', - 'top-mid': '', - 'top-left': '', - 'top-right': '', - bottom: '', - 'bottom-mid': '', - 'bottom-left': '', - 'bottom-right': '', - left: '', - 'left-mid': '', - mid: '', - 'mid-mid': '', - right: '', - 'right-mid': '', - }, - style: { 'padding-left': 0, 'padding-right': 0 }, - wordWrap: true, - }); - table.push(['Client ID'['brightCyan'], clientId]); - table.push(['Client Secret'['brightCyan'], clientSecret]); - if (options.llt) { - try { - const response = await createLongLivedToken( - clientId, - clientSecret, - options.lltScope, - options.lltEsv, - options.lltTtl - ); - if (options.lltEsv) - table.push(['Secret Name'['brightCyan'], response.secret]); - table.push(['Scope'['brightCyan'], response.scope]); - table.push(['Expires'['brightCyan'], response.expires_on]); - printMessage(table.toString()); - if (options.lltEsv === false) { - printMessage(`\nBearer token:`, 'info'); - printMessage(`${response.access_token}`, 'data'); - } - } catch (error) { - printError(error); - process.exitCode = 1; - } - } else { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(); + + printMessage( + `Creating oauth2 client with admin privileges in realm "${state.getRealm()}"...` + ); + let clientId = uuidv4(); + let clientSecret = uuidv4(); + if (options.clientId) { + clientId = options.clientId; + } + if (options.clientSecret) { + clientSecret = options.clientSecret; + } + if ( + await createOAuth2ClientWithAdminPrivileges(clientId, clientSecret) + ) { + const table = new Table({ + chars: { + top: '', + 'top-mid': '', + 'top-left': '', + 'top-right': '', + bottom: '', + 'bottom-mid': '', + 'bottom-left': '', + 'bottom-right': '', + left: '', + 'left-mid': '', + mid: '', + 'mid-mid': '', + right: '', + 'right-mid': '', + }, + style: { 'padding-left': 0, 'padding-right': 0 }, + wordWrap: true, + }); + table.push(['Client ID'['brightCyan'], clientId]); + table.push(['Client Secret'['brightCyan'], clientSecret]); + if (options.llt) { + try { + const response = await createLongLivedToken( + clientId, + clientSecret, + options.lltScope, + options.lltEsv, + options.lltTtl + ); + if (options.lltEsv) + table.push(['Secret Name'['brightCyan'], response.secret]); + table.push(['Scope'['brightCyan'], response.scope]); + table.push(['Expires'['brightCyan'], response.expires_on]); printMessage(table.toString()); + if (options.lltEsv === false) { + printMessage(`\nBearer token:`, 'info'); + printMessage(`${response.access_token}`, 'data'); + } + } catch (error) { + printError(error); + process.exitCode = 1; } } else { - process.exitCode = 1; + printMessage(table.toString()); } } else { process.exitCode = 1; diff --git a/src/cli/admin/admin-execute-rfc7523-authz-grant-flow.ts b/src/cli/admin/admin-execute-rfc7523-authz-grant-flow.ts index 2b0efbc03..b0b8d2ee5 100644 --- a/src/cli/admin/admin-execute-rfc7523-authz-grant-flow.ts +++ b/src/cli/admin/admin-execute-rfc7523-authz-grant-flow.ts @@ -65,36 +65,35 @@ export default function setup() { options, command ); - if (await getTokens()) { - printMessage(`Executing RFC7523 authorization grant flow...`); - let clientId = uuidv4(); - if (options.clientId) { - clientId = options.clientId; - } - let jwk: JwkRsa = undefined; - if (options.jwkFile) { - try { - const data = fs.readFileSync(options.jwkFile); - jwk = JSON.parse(data.toString()); - } catch (error) { - printMessage( - `Error parsing JWK from file ${options.jwkFile}: ${error.message}`, - 'error' - ); - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + printMessage(`Executing RFC7523 authorization grant flow...`); + let clientId = uuidv4(); + if (options.clientId) { + clientId = options.clientId; + } + let jwk: JwkRsa = undefined; + if (options.jwkFile) { + try { + const data = fs.readFileSync(options.jwkFile); + jwk = JSON.parse(data.toString()); + } catch (error) { + printMessage( + `Error parsing JWK from file ${options.jwkFile}: ${error.message}`, + 'error' + ); } - const outcome = await executeRfc7523AuthZGrantFlow( - clientId, - options.iss, - jwk, - options.sub, - options.scope.split(' '), - options.json - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; } + const outcome = await executeRfc7523AuthZGrantFlow( + clientId, + options.iss, + jwk, + options.sub, + options.scope.split(' '), + options.json + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-federation-export.ts b/src/cli/admin/admin-federation-export.ts index 085770f21..a9af19be0 100644 --- a/src/cli/admin/admin-federation-export.ts +++ b/src/cli/admin/admin-federation-export.ts @@ -63,44 +63,50 @@ export default function setup() { options, command ); - if (await getTokens(true, true, deploymentTypes)) { - // export by id/name - if (options.idpId) { - verboseMessage(`Exporting provider "${options.idpId}...`); - const outcome = await exportAdminFederationProviderToFile( - options.idpId, - options.file, - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all) { - verboseMessage('Exporting all providers to a single file...'); - const outcome = await exportAdminFederationProvidersToFile( - options.file, - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // --all-separate -A - else if (options.allSeparate) { - verboseMessage('Exporting all providers to separate files...'); - const outcome = await exportAdminFederationProvidersToFiles( - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + + if (!options.idpId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens( + true, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + + // export by id/name + if (options.idpId) { + verboseMessage(`Exporting provider "${options.idpId}...`); + outcome = await exportAdminFederationProviderToFile( + options.idpId, + options.file, + options.metadata + ); + } + // --all -a + else if (options.all) { + verboseMessage('Exporting all providers to a single file...'); + outcome = await exportAdminFederationProvidersToFile( + options.file, + options.metadata + ); + } + // --all-separate -A + else if (options.allSeparate) { + verboseMessage('Exporting all providers to separate files...'); + outcome = await exportAdminFederationProvidersToFiles( + options.metadata + ); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-federation-import.ts b/src/cli/admin/admin-federation-import.ts index 487e2ad1a..4a33e5394 100644 --- a/src/cli/admin/admin-federation-import.ts +++ b/src/cli/admin/admin-federation-import.ts @@ -58,64 +58,57 @@ export default function setup() { options, command ); + + if (!options.all && !options.allSeparate && !options.idpId) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens( + true, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + // import by id - if ( - options.file && - options.idpId && - (await getTokens(true, true, deploymentTypes)) - ) { + if (options.file && options.idpId) { verboseMessage(`Importing provider "${options.idpId}"...`); - const outcome = await importAdminFederationProviderFromFile( + outcome = await importAdminFederationProviderFromFile( options.idpId, options.file ); - if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - options.file && - (await getTokens(true, true, deploymentTypes)) - ) { + else if (options.all && options.file) { verboseMessage( `Importing all providers from a single file (${options.file})...` ); - const outcome = await importAdminFederationProvidersFromFile( - options.file - ); - if (!outcome) process.exitCode = 1; + outcome = await importAdminFederationProvidersFromFile(options.file); } // --all-separate -A - else if ( - options.allSeparate && - !options.file && - (await getTokens(true, true, deploymentTypes)) - ) { + else if (options.allSeparate && !options.file) { verboseMessage( 'Importing all providers from separate files in current directory...' ); - const outcome = await importAdminFederationProvidersFromFiles(); - if (!outcome) process.exitCode = 1; + outcome = await importAdminFederationProvidersFromFiles(); } // import first provider from file - else if ( - options.file && - (await getTokens(true, true, deploymentTypes)) - ) { + else if (options.file) { verboseMessage( `Importing first provider from file "${options.file}"...` ); - const outcome = await importFirstAdminFederationProviderFromFile( + outcome = await importFirstAdminFederationProviderFromFile( options.file ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-federation-list.ts b/src/cli/admin/admin-federation-list.ts index 7410c2e1d..932d9931a 100644 --- a/src/cli/admin/admin-federation-list.ts +++ b/src/cli/admin/admin-federation-list.ts @@ -31,13 +31,16 @@ export default function setup() { options, command ); - if (await getTokens(true, true, deploymentTypes)) { - verboseMessage(`Listing admin federation providers...`); - const outcome = await listAdminFederationProviders(); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + true, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage(`Listing admin federation providers...`); + const outcome = await listAdminFederationProviders(); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-generate-rfc7523-authz-grant-artefacts.ts b/src/cli/admin/admin-generate-rfc7523-authz-grant-artefacts.ts index 349c7fc04..3ad69dca3 100644 --- a/src/cli/admin/admin-generate-rfc7523-authz-grant-artefacts.ts +++ b/src/cli/admin/admin-generate-rfc7523-authz-grant-artefacts.ts @@ -80,39 +80,38 @@ export default function setup() { options, command ); - if (await getTokens()) { - printMessage( - `Generating RFC7523 authorization grant artefacts in realm "${state.getRealm()}"...` - ); - let clientId = uuidv4(); - if (options.clientId) { - clientId = options.clientId; - } - let jwk: JwkRsa = undefined; - if (options.jwkFile) { - try { - const data = fs.readFileSync(options.jwkFile); - jwk = JSON.parse(data.toString()); - } catch (error) { - printMessage( - `Error parsing JWK from file ${options.jwkFile}: ${error.message}`, - 'error' - ); - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + printMessage( + `Generating RFC7523 authorization grant artefacts in realm "${state.getRealm()}"...` + ); + let clientId = uuidv4(); + if (options.clientId) { + clientId = options.clientId; + } + let jwk: JwkRsa = undefined; + if (options.jwkFile) { + try { + const data = fs.readFileSync(options.jwkFile); + jwk = JSON.parse(data.toString()); + } catch (error) { + printMessage( + `Error parsing JWK from file ${options.jwkFile}: ${error.message}`, + 'error' + ); } - const outcome = await generateRfc7523AuthZGrantArtefacts( - clientId, - options.iss, - jwk, - options.sub, - options.scope.split(' '), - { save: options.save }, - options.json - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; } + const outcome = await generateRfc7523AuthZGrantArtefacts( + clientId, + options.iss, + jwk, + options.sub, + options.scope.split(' '), + { save: options.save }, + options.json + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-get-access-token.ts b/src/cli/admin/admin-get-access-token.ts index d62d87b78..77af9dec5 100644 --- a/src/cli/admin/admin-get-access-token.ts +++ b/src/cli/admin/admin-get-access-token.ts @@ -37,20 +37,19 @@ export default function setup() { options, command ); - if (await getTokens()) { - printMessage( - `Getting an access token using client "${options.clientId}"...` - ); - const response = await clientCredentialsGrant( - state.getHost(), - options.clientId, - options.clientSecret, - options.scope - ); - printMessage(`Token: ${response.access_token}`); - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + printMessage( + `Getting an access token using client "${options.clientId}"...` + ); + const response = await clientCredentialsGrant( + state.getHost(), + options.clientId, + options.clientSecret, + options.scope + ); + printMessage(`Token: ${response.access_token}`); } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-grant-oauth2-client-admin-privileges.ts b/src/cli/admin/admin-grant-oauth2-client-admin-privileges.ts index 097586ba5..e9660ff39 100644 --- a/src/cli/admin/admin-grant-oauth2-client-admin-privileges.ts +++ b/src/cli/admin/admin-grant-oauth2-client-admin-privileges.ts @@ -41,19 +41,22 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - printMessage( - `Granting oauth2 client "${ - options.clientId || options.target - }" in realm "${state.getRealm()}" admin privileges...` - ); - const outcome = await grantOAuth2ClientAdminPrivileges( + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + printMessage( + `Granting oauth2 client "${ options.clientId || options.target - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + }" in realm "${state.getRealm()}" admin privileges...` + ); + const outcome = await grantOAuth2ClientAdminPrivileges( + options.clientId || options.target + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-hide-generic-extension-attributes.ts b/src/cli/admin/admin-hide-generic-extension-attributes.ts index cc1b2fcf4..6095704fe 100644 --- a/src/cli/admin/admin-hide-generic-extension-attributes.ts +++ b/src/cli/admin/admin-hide-generic-extension-attributes.ts @@ -34,18 +34,21 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - printMessage( - `Hiding generic extension attributes in realm "${state.getRealm()}"...` - ); - const outcome = await hideGenericExtensionAttributes( - options.includeCustomized, - options.dryRun - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + printMessage( + `Hiding generic extension attributes in realm "${state.getRealm()}"...` + ); + const outcome = await hideGenericExtensionAttributes( + options.includeCustomized, + options.dryRun + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-list-oauth2-clients-with-admin-privileges.ts b/src/cli/admin/admin-list-oauth2-clients-with-admin-privileges.ts index 5c6d23e0f..9657a449e 100644 --- a/src/cli/admin/admin-list-oauth2-clients-with-admin-privileges.ts +++ b/src/cli/admin/admin-list-oauth2-clients-with-admin-privileges.ts @@ -31,15 +31,17 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - printMessage( - `Listing oauth2 clients with admin privileges in realm "${state.getRealm()}"...` - ); - const outcome = await listOAuth2AdminClients(); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + printMessage( + `Listing oauth2 clients with admin privileges in realm "${state.getRealm()}"...` + ); + const outcome = await listOAuth2AdminClients(); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-list-oauth2-clients-with-custom-privileges.ts b/src/cli/admin/admin-list-oauth2-clients-with-custom-privileges.ts index cf480ab91..0ec74f924 100644 --- a/src/cli/admin/admin-list-oauth2-clients-with-custom-privileges.ts +++ b/src/cli/admin/admin-list-oauth2-clients-with-custom-privileges.ts @@ -31,15 +31,18 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - printMessage( - `Listing oauth2 clients with custom privileges in realm "${state.getRealm()}"...` - ); - const outcome = await listOAuth2CustomClients(); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + printMessage( + `Listing oauth2 clients with custom privileges in realm "${state.getRealm()}"...` + ); + const outcome = await listOAuth2CustomClients(); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-list-static-user-mappings.ts b/src/cli/admin/admin-list-static-user-mappings.ts index 147a35fb5..e02bf9a89 100644 --- a/src/cli/admin/admin-list-static-user-mappings.ts +++ b/src/cli/admin/admin-list-static-user-mappings.ts @@ -42,17 +42,20 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - printMessage( - 'Listing all non-oauth2 client subjects of static user mappings...' - ); - const outcome = await listNonOAuth2AdminStaticUserMappings( - options.showProtected - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + printMessage( + 'Listing all non-oauth2 client subjects of static user mappings...' + ); + const outcome = await listNonOAuth2AdminStaticUserMappings( + options.showProtected + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-remove-static-user-mapping.ts b/src/cli/admin/admin-remove-static-user-mapping.ts index 4b3b11367..2a9a702c6 100644 --- a/src/cli/admin/admin-remove-static-user-mapping.ts +++ b/src/cli/admin/admin-remove-static-user-mapping.ts @@ -35,13 +35,16 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - printMessage("Removing a subject's static user mapping..."); - const outcome = await removeStaticUserMapping(options.subId); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + printMessage("Removing a subject's static user mapping..."); + const outcome = await removeStaticUserMapping(options.subId); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-repair-org-model.ts b/src/cli/admin/admin-repair-org-model.ts index e0aafa619..b9928f31a 100644 --- a/src/cli/admin/admin-repair-org-model.ts +++ b/src/cli/admin/admin-repair-org-model.ts @@ -47,17 +47,19 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - printMessage(`Repairing org model in realm "${state.getRealm()}"...`); - const outcome = await repairOrgModel( - options.excludeCustomized, - options.extendPermissions, - options.dryRun - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + printMessage(`Repairing org model in realm "${state.getRealm()}"...`); + const outcome = await repairOrgModel( + options.excludeCustomized, + options.extendPermissions, + options.dryRun + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-revoke-oauth2-client-admin-privileges.ts b/src/cli/admin/admin-revoke-oauth2-client-admin-privileges.ts index 88cd95995..d8fbb28a1 100644 --- a/src/cli/admin/admin-revoke-oauth2-client-admin-privileges.ts +++ b/src/cli/admin/admin-revoke-oauth2-client-admin-privileges.ts @@ -41,19 +41,21 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - printMessage( - `Revoking admin privileges from oauth2 client "${ - options.target - }" in realm "${state.getRealm()}"...` - ); - const outcome = await revokeOAuth2ClientAdminPrivileges( - options.clientId || options.target - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + printMessage( + `Revoking admin privileges from oauth2 client "${ + options.target + }" in realm "${state.getRealm()}"...` + ); + const outcome = await revokeOAuth2ClientAdminPrivileges( + options.clientId || options.target + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-show-generic-extension-attributes.ts b/src/cli/admin/admin-show-generic-extension-attributes.ts index e4fdc3e57..d22b6dcb2 100644 --- a/src/cli/admin/admin-show-generic-extension-attributes.ts +++ b/src/cli/admin/admin-show-generic-extension-attributes.ts @@ -42,18 +42,20 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - printMessage( - `Showing generic extension attributes in realm "${state.getRealm()}"...` - ); - const outcome = await showGenericExtensionAttributes( - options.includeCustomized, - options.dryRun - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + printMessage( + `Showing generic extension attributes in realm "${state.getRealm()}"...` + ); + const outcome = await showGenericExtensionAttributes( + options.includeCustomized, + options.dryRun + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/admin/admin-train-auto-access-model.ts b/src/cli/admin/admin-train-auto-access-model.ts index fbf8fddce..968c0d76f 100644 --- a/src/cli/admin/admin-train-auto-access-model.ts +++ b/src/cli/admin/admin-train-auto-access-model.ts @@ -61,25 +61,27 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - printMessage( - `Training Auto Access model in realm "${state.getRealm()}"...` + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + printMessage( + `Training Auto Access model in realm "${state.getRealm()}"...` + ); + try { + await trainAA( + options.apiKey, + options.apiSecret, + options.usernames.split(','), + options.userAgents.split(','), + options.ipAddresses.split(','), + 100 ); - try { - await trainAA( - options.apiKey, - options.apiSecret, - options.usernames.split(','), - options.userAgents.split(','), - options.ipAddresses.split(','), - 100 - ); - printMessage(`Done.`); - } catch (error) { - printMessage(error, 'error'); - process.exitCode = 1; - } - } else { + printMessage(`Done.`); + } catch (error) { + printMessage(error, 'error'); process.exitCode = 1; } } diff --git a/src/cli/agent/agent-delete.ts b/src/cli/agent/agent-delete.ts index 546a9ff27..070156907 100644 --- a/src/cli/agent/agent-delete.ts +++ b/src/cli/agent/agent-delete.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { deleteAgent, deleteAgents } from '../../ops/AgentOps'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -29,34 +29,38 @@ export default function setup() { options, command ); - if (await getTokens()) { - // delete by id - if (options.agentId) { - verboseMessage( - `Deleting agent '${ - options.agentId - }' in realm "${state.getRealm()}"...` - ); - const outcome = await deleteAgent(options.agentId); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all) { - verboseMessage( - `Deleting all agents in realm "${state.getRealm()}"...` - ); - const outcome = await deleteAgents(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + + if (!options.agentId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + + // delete by id + if (options.agentId) { + verboseMessage( + `Deleting agent '${ + options.agentId + }' in realm "${state.getRealm()}"...` + ); + outcome = await deleteAgent(options.agentId); + } + // --all -a + else if (options.all) { + verboseMessage( + `Deleting all agents in realm "${state.getRealm()}"...` + ); + outcome = await deleteAgents(); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-describe.ts b/src/cli/agent/agent-describe.ts index b1fdb7920..bf3a11a79 100644 --- a/src/cli/agent/agent-describe.ts +++ b/src/cli/agent/agent-describe.ts @@ -25,13 +25,13 @@ export default function setup() { options, command ); - if ( - await getTokens( - false, - true, - options.global ? globalDeploymentTypes : undefined - ) - ) { + const getTokensIsSuccessful = await getTokens( + false, + true, + globalDeploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/agent/agent-export.ts b/src/cli/agent/agent-export.ts index 05a4a152c..75a8ce7be 100644 --- a/src/cli/agent/agent-export.ts +++ b/src/cli/agent/agent-export.ts @@ -7,7 +7,7 @@ import { exportAgentToFile, } from '../../ops/AgentOps.js'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; const { CLASSIC_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; @@ -55,52 +55,50 @@ export default function setup() { options, command ); - if ( - await getTokens( - false, - true, - options.global ? globalDeploymentTypes : undefined - ) - ) { - // export - if (options.agentId) { - verboseMessage('Exporting agent...'); - const outcome = await exportAgentToFile( - options.agentId, - options.file, - options.global, - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all) { - verboseMessage('Exporting all agents to a single file...'); - const outcome = await exportAgentsToFile( - options.file, - options.global, - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // --all-separate -A - else if (options.allSeparate) { - verboseMessage('Exporting all agents to separate files...'); - const outcome = await exportAgentsToFiles( - options.global, - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + + if (!options.agentId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : undefined + ); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + + // export + if (options.agentId) { + verboseMessage('Exporting agent...'); + outcome = await exportAgentToFile( + options.agentId, + options.file, + options.global, + options.metadata + ); + } + // --all -a + else if (options.all) { + verboseMessage('Exporting all agents to a single file...'); + outcome = await exportAgentsToFile( + options.file, + options.global, + options.metadata + ); + } + // --all-separate -A + else if (options.allSeparate) { + verboseMessage('Exporting all agents to separate files...'); + outcome = await exportAgentsToFiles(options.global, options.metadata); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-gateway-delete.ts b/src/cli/agent/agent-gateway-delete.ts index c5b4d1e61..a1132342d 100644 --- a/src/cli/agent/agent-gateway-delete.ts +++ b/src/cli/agent/agent-gateway-delete.ts @@ -6,7 +6,7 @@ import { deleteIdentityGatewayAgents, } from '../../ops/AgentOps'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -37,32 +37,35 @@ export default function setup() { options, command ); - if (await getTokens()) { - // delete by id - if (options.agentId) { - verboseMessage( - `Deleting agent '${ - options.agentId - }' in realm "${state.getRealm()}"...` - ); - const outcome = await deleteIdentityGatewayAgent(options.agentId); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all) { - verboseMessage('Deleting all agents...'); - const outcome = await deleteIdentityGatewayAgents(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + + if (!options.agentId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + + // delete by id + if (options.agentId) { + verboseMessage( + `Deleting agent '${ + options.agentId + }' in realm "${state.getRealm()}"...` + ); + outcome = await deleteIdentityGatewayAgent(options.agentId); + } + // --all -a + else if (options.all) { + verboseMessage('Deleting all agents...'); + outcome = await deleteIdentityGatewayAgents(); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-gateway-describe.ts b/src/cli/agent/agent-gateway-describe.ts index 8dba69bdc..71ecfbdf2 100644 --- a/src/cli/agent/agent-gateway-describe.ts +++ b/src/cli/agent/agent-gateway-describe.ts @@ -20,7 +20,10 @@ export default function setup() { options, command ); - if (await getTokens()) { + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/agent/agent-gateway-export.ts b/src/cli/agent/agent-gateway-export.ts index 848408039..0191625c8 100644 --- a/src/cli/agent/agent-gateway-export.ts +++ b/src/cli/agent/agent-gateway-export.ts @@ -6,7 +6,7 @@ import { exportIdentityGatewayAgentToFile, } from '../../ops/AgentOps.js'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -50,47 +50,48 @@ export default function setup() { options, command ); - if (await getTokens()) { - // export - if (options.agentId) { - verboseMessage('Exporting identity gateway agent...'); - const outcome = await exportIdentityGatewayAgentToFile( - options.agentId, - options.file, - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all) { - verboseMessage( - 'Exporting all identity gateway agents to a single file...' - ); - const outcome = await exportIdentityGatewayAgentsToFile( - options.file, - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // --all-separate -A - else if (options.allSeparate) { - verboseMessage( - 'Exporting all identity gateway agents to separate files...' - ); - const outcome = await exportIdentityGatewayAgentsToFiles( - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + + if (!options.agentId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + + // export + if (options.agentId) { + verboseMessage('Exporting identity gateway agent...'); + outcome = await exportIdentityGatewayAgentToFile( + options.agentId, + options.file, + options.metadata + ); + } + // --all -a + else if (options.all) { + verboseMessage( + 'Exporting all identity gateway agents to a single file...' + ); + outcome = await exportIdentityGatewayAgentsToFile( + options.file, + options.metadata + ); + } + // --all-separate -A + else if (options.allSeparate) { + verboseMessage( + 'Exporting all identity gateway agents to separate files...' + ); + outcome = await exportIdentityGatewayAgentsToFiles(options.metadata); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-gateway-import.ts b/src/cli/agent/agent-gateway-import.ts index 98e68907b..a8be2046b 100644 --- a/src/cli/agent/agent-gateway-import.ts +++ b/src/cli/agent/agent-gateway-import.ts @@ -7,7 +7,7 @@ import { importIdentityGatewayAgentsFromFiles, } from '../../ops/AgentOps.js'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -45,51 +45,52 @@ export default function setup() { options, command ); - if (await getTokens()) { - // import - if (options.agentId) { - verboseMessage( - `Importing web agent ${options.agentId} from file...` - ); - const outcome = await importIdentityGatewayAgentFromFile( - options.agentId, - options.file - ); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all && options.file) { - verboseMessage( - `Importing all web agents from a single file (${options.file})...` - ); - const outcome = await importIdentityGatewayAgentsFromFile( - options.file - ); - if (!outcome) process.exitCode = 1; - } - // --all-separate -A - else if (options.allSeparate && !options.file) { - verboseMessage('Importing all web agents from separate files...'); - const outcome = await importIdentityGatewayAgentsFromFiles(); - if (!outcome) process.exitCode = 1; - } - // import first journey in file - else if (options.file) { - verboseMessage('Importing first web agent in file...'); - const outcome = await importFirstIdentityGatewayAgentFromFile( - options.file - ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + + if ( + !options.agentId && + !options.all && + !options.file && + !options.allSeparate + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + + // import + if (options.agentId) { + verboseMessage(`Importing web agent ${options.agentId} from file...`); + outcome = await importIdentityGatewayAgentFromFile( + options.agentId, + options.file + ); + } + // --all -a + else if (options.all && options.file) { + verboseMessage( + `Importing all web agents from a single file (${options.file})...` + ); + outcome = await importIdentityGatewayAgentsFromFile(options.file); + } + // --all-separate -A + else if (options.allSeparate && !options.file) { + verboseMessage('Importing all web agents from separate files...'); + outcome = await importIdentityGatewayAgentsFromFiles(); + } + // import first journey in file + else if (options.file) { + verboseMessage('Importing first web agent in file...'); + outcome = await importFirstIdentityGatewayAgentFromFile(options.file); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-gateway-list.ts b/src/cli/agent/agent-gateway-list.ts index 82e405aa2..0bbffeca6 100644 --- a/src/cli/agent/agent-gateway-list.ts +++ b/src/cli/agent/agent-gateway-list.ts @@ -23,12 +23,11 @@ export default function setup() { options, command ); - if (await getTokens()) { - const outcome = await listIdentityGatewayAgents(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + const outcome = await listIdentityGatewayAgents(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-import.ts b/src/cli/agent/agent-import.ts index e3985dbf7..0eb94ab5c 100644 --- a/src/cli/agent/agent-import.ts +++ b/src/cli/agent/agent-import.ts @@ -8,7 +8,7 @@ import { importFirstAgentFromFile, } from '../../ops/AgentOps.js'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; const { CLASSIC_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; @@ -50,58 +50,59 @@ export default function setup() { options, command ); + if ( - await getTokens( - false, - true, - options.global ? globalDeploymentTypes : undefined - ) + !options.agentId && + !options.all && + !options.file && + !options.allSeparate ) { - // import - if (options.agentId && options.file) { - verboseMessage(`Importing agent ${options.agentId}...`); - const outcome = await importAgentFromFile( - options.agentId, - options.file, - options.global - ); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all && options.file) { - verboseMessage( - `Importing all agents from a single file (${options.file})...` - ); - const outcome = await importAgentsFromFile( - options.file, - options.global - ); - if (!outcome) process.exitCode = 1; - } - // --all-separate -A - else if (options.allSeparate && !options.file) { - verboseMessage('Importing all agents from separate files...'); - const outcome = await importAgentsFromFiles(options.global); - if (!outcome) process.exitCode = 1; - } - // import first agent in file - else if (options.file) { - verboseMessage('Importing first agent in file...'); - const outcome = await importFirstAgentFromFile( - options.file, - options.global - ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : undefined + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + + // import + if (options.agentId && options.file) { + verboseMessage(`Importing agent ${options.agentId}...`); + outcome = await importAgentFromFile( + options.agentId, + options.file, + options.global + ); + } + // --all -a + else if (options.all && options.file) { + verboseMessage( + `Importing all agents from a single file (${options.file})...` + ); + outcome = await importAgentsFromFile(options.file, options.global); + } + // --all-separate -A + else if (options.allSeparate && !options.file) { + verboseMessage('Importing all agents from separate files...'); + outcome = await importAgentsFromFiles(options.global); + } + // import first agent in file + else if (options.file) { + verboseMessage('Importing first agent in file...'); + outcome = await importFirstAgentFromFile( + options.file, + options.global + ); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-java-delete.ts b/src/cli/agent/agent-java-delete.ts index a6e209adf..bd1bbdfc6 100644 --- a/src/cli/agent/agent-java-delete.ts +++ b/src/cli/agent/agent-java-delete.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { deleteJavaAgent, deleteJavaAgents } from '../../ops/AgentOps'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -31,32 +31,36 @@ export default function setup() { options, command ); - if (await getTokens()) { - // delete by id - if (options.agentId) { - verboseMessage( - `Deleting agent '${ - options.agentId - }' in realm "${state.getRealm()}"...` - ); - const outcome = await deleteJavaAgent(options.agentId); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all) { - verboseMessage('Deleting all agents...'); - const outcome = await deleteJavaAgents(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + + if (!options.agentId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + + // delete by id + if (options.agentId) { + verboseMessage( + `Deleting agent '${ + options.agentId + }' in realm "${state.getRealm()}"...` + ); + outcome = await deleteJavaAgent(options.agentId); + } + // --all -a + else if (options.all) { + verboseMessage('Deleting all agents...'); + outcome = await deleteJavaAgents(); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-java-describe.ts b/src/cli/agent/agent-java-describe.ts index 4305f2366..3c9888da3 100644 --- a/src/cli/agent/agent-java-describe.ts +++ b/src/cli/agent/agent-java-describe.ts @@ -20,7 +20,10 @@ export default function setup() { options, command ); - if (await getTokens()) { + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/agent/agent-java-export.ts b/src/cli/agent/agent-java-export.ts index b6d452092..5e5cbad28 100644 --- a/src/cli/agent/agent-java-export.ts +++ b/src/cli/agent/agent-java-export.ts @@ -6,7 +6,7 @@ import { exportJavaAgentToFile, } from '../../ops/AgentOps.js'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -50,41 +50,42 @@ export default function setup() { options, command ); - if (await getTokens()) { - // export - if (options.agentId) { - verboseMessage('Exporting java agent...'); - const outcome = await exportJavaAgentToFile( - options.agentId, - options.file, - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all) { - verboseMessage('Exporting all java agents to a single file...'); - const outcome = await exportJavaAgentsToFile( - options.file, - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // --all-separate -A - else if (options.allSeparate) { - verboseMessage('Exporting all java agents to separate files...'); - const outcome = await exportJavaAgentsToFiles(options.metadata); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + + if (!options.agentId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + + // export + if (options.agentId) { + verboseMessage('Exporting java agent...'); + outcome = await exportJavaAgentToFile( + options.agentId, + options.file, + options.metadata + ); + } + // --all -a + else if (options.all) { + verboseMessage('Exporting all java agents to a single file...'); + outcome = await exportJavaAgentsToFile( + options.file, + options.metadata + ); + } + // --all-separate -A + else if (options.allSeparate) { + verboseMessage('Exporting all java agents to separate files...'); + outcome = await exportJavaAgentsToFiles(options.metadata); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-java-import.ts b/src/cli/agent/agent-java-import.ts index 91aa46418..cca0f50bd 100644 --- a/src/cli/agent/agent-java-import.ts +++ b/src/cli/agent/agent-java-import.ts @@ -7,7 +7,7 @@ import { importJavaAgentsFromFiles, } from '../../ops/AgentOps.js'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -45,47 +45,52 @@ export default function setup() { options, command ); - if (await getTokens()) { - // import - if (options.agentId) { - verboseMessage( - `Importing web agent ${options.agentId} from file...` - ); - const outcome = await importJavaAgentFromFile( - options.agentId, - options.file - ); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all && options.file) { - verboseMessage( - `Importing all web agents from a single file (${options.file})...` - ); - const outcome = await importJavaAgentsFromFile(options.file); - if (!outcome) process.exitCode = 1; - } - // --all-separate -A - else if (options.allSeparate && !options.file) { - verboseMessage('Importing all web agents from separate files...'); - const outcome = await importJavaAgentsFromFiles(); - if (!outcome) process.exitCode = 1; - } - // import first journey in file - else if (options.file) { - verboseMessage('Importing first web agent in file...'); - const outcome = await importFirstJavaAgentFromFile(options.file); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + + if ( + !options.agentId && + !options.file && + !options.all && + !options.allSeparate + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + + // import + if (options.agentId) { + verboseMessage(`Importing web agent ${options.agentId} from file...`); + outcome = await importJavaAgentFromFile( + options.agentId, + options.file + ); + } + // --all -a + else if (options.all && options.file) { + verboseMessage( + `Importing all web agents from a single file (${options.file})...` + ); + outcome = await importJavaAgentsFromFile(options.file); + } + // --all-separate -A + else if (options.allSeparate && !options.file) { + verboseMessage('Importing all web agents from separate files...'); + outcome = await importJavaAgentsFromFiles(); + } + // import first journey in file + else if (options.file) { + verboseMessage('Importing first web agent in file...'); + outcome = await importFirstJavaAgentFromFile(options.file); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-java-list.ts b/src/cli/agent/agent-java-list.ts index 04ec5d7aa..9223aff03 100644 --- a/src/cli/agent/agent-java-list.ts +++ b/src/cli/agent/agent-java-list.ts @@ -23,12 +23,11 @@ export default function setup() { options, command ); - if (await getTokens()) { - const outcome = await listJavaAgents(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + const outcome = await listJavaAgents(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-list.ts b/src/cli/agent/agent-list.ts index a7e2ab5bd..2b6fe9b85 100644 --- a/src/cli/agent/agent-list.ts +++ b/src/cli/agent/agent-list.ts @@ -28,18 +28,15 @@ export default function setup() { options, command ); - if ( - await getTokens( - false, - true, - options.global ? globalDeploymentTypes : undefined - ) - ) { - const outcome = await listAgents(options.long, options.global); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : undefined + ); + if (!getTokensIsSuccessful) process.exit(1); + + const outcome = await listAgents(options.long, options.global); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-web-delete.ts b/src/cli/agent/agent-web-delete.ts index fecf3f8a8..e63aa8561 100644 --- a/src/cli/agent/agent-web-delete.ts +++ b/src/cli/agent/agent-web-delete.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { deleteWebAgent, deleteWebAgents } from '../../ops/AgentOps'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -31,32 +31,36 @@ export default function setup() { options, command ); - if (await getTokens()) { - // delete by id - if (options.agentId) { - verboseMessage( - `Deleting agent '${ - options.agentId - }' in realm "${state.getRealm()}"...` - ); - const outcome = await deleteWebAgent(options.agentId); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all) { - verboseMessage('Deleting all agents...'); - const outcome = await deleteWebAgents(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + + if (!options.agentId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + + // delete by id + if (options.agentId) { + verboseMessage( + `Deleting agent '${ + options.agentId + }' in realm "${state.getRealm()}"...` + ); + outcome = await deleteWebAgent(options.agentId); + } + // --all -a + else if (options.all) { + verboseMessage('Deleting all agents...'); + outcome = await deleteWebAgents(); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-web-describe.ts b/src/cli/agent/agent-web-describe.ts index 0e99eb62a..017a78090 100644 --- a/src/cli/agent/agent-web-describe.ts +++ b/src/cli/agent/agent-web-describe.ts @@ -20,7 +20,10 @@ export default function setup() { options, command ); - if (await getTokens()) { + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/agent/agent-web-export.ts b/src/cli/agent/agent-web-export.ts index 6c179300d..bdc9f9a3b 100644 --- a/src/cli/agent/agent-web-export.ts +++ b/src/cli/agent/agent-web-export.ts @@ -6,7 +6,7 @@ import { exportWebAgentToFile, } from '../../ops/AgentOps.js'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -50,41 +50,39 @@ export default function setup() { options, command ); - if (await getTokens()) { - // export - if (options.agentId) { - verboseMessage('Exporting web agent...'); - const outcome = await exportWebAgentToFile( - options.agentId, - options.file, - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all) { - verboseMessage('Exporting all web agents to a single file...'); - const outcome = await exportWebAgentsToFile( - options.file, - options.metadata - ); - if (!outcome) process.exitCode = 1; - } - // --all-separate -A - else if (options.allSeparate) { - verboseMessage('Exporting all web agents to separate files...'); - const outcome = await exportWebAgentsToFiles(options.metadata); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + if (!options.agentId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + + // export + if (options.agentId) { + verboseMessage('Exporting web agent...'); + outcome = await exportWebAgentToFile( + options.agentId, + options.file, + options.metadata + ); + } + // --all -a + else if (options.all) { + verboseMessage('Exporting all web agents to a single file...'); + outcome = await exportWebAgentsToFile(options.file, options.metadata); + } + // --all-separate -A + else if (options.allSeparate) { + verboseMessage('Exporting all web agents to separate files...'); + outcome = await exportWebAgentsToFiles(options.metadata); + } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-web-import.ts b/src/cli/agent/agent-web-import.ts index e24885b63..ba3fc5f41 100644 --- a/src/cli/agent/agent-web-import.ts +++ b/src/cli/agent/agent-web-import.ts @@ -7,7 +7,7 @@ import { importWebAgentsFromFiles, } from '../../ops/AgentOps.js'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -45,47 +45,46 @@ export default function setup() { options, command ); - if (await getTokens()) { - // import - if (options.agentId) { - verboseMessage( - `Importing web agent ${options.agentId} from file...` - ); - const outcome = await importWebAgentFromFile( - options.agentId, - options.file - ); - if (!outcome) process.exitCode = 1; - } - // --all -a - else if (options.all && options.file) { - verboseMessage( - `Importing all web agents from a single file (${options.file})...` - ); - const outcome = await importWebAgentsFromFile(options.file); - if (!outcome) process.exitCode = 1; - } - // --all-separate -A - else if (options.allSeparate && !options.file) { - verboseMessage('Importing all web agents from separate files...'); - const outcome = await importWebAgentsFromFiles(); - if (!outcome) process.exitCode = 1; - } - // import first journey in file - else if (options.file) { - verboseMessage('Importing first web agent in file...'); - const outcome = await importFirstWebAgentFromFile(options.file); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + if ( + !options.agentId && + !options.file && + !options.all && + !options.allSeparate + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + + // import + if (options.agentId) { + verboseMessage(`Importing web agent ${options.agentId} from file...`); + outcome = await importWebAgentFromFile(options.agentId, options.file); + } + // --all -a + else if (options.all && options.file) { + verboseMessage( + `Importing all web agents from a single file (${options.file})...` + ); + outcome = await importWebAgentsFromFile(options.file); + } + // --all-separate -A + else if (options.allSeparate && !options.file) { + verboseMessage('Importing all web agents from separate files...'); + outcome = await importWebAgentsFromFiles(); + } + // import first journey in file + else if (options.file) { + verboseMessage('Importing first web agent in file...'); + outcome = await importFirstWebAgentFromFile(options.file); + } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/agent/agent-web-list.ts b/src/cli/agent/agent-web-list.ts index d23fb2f73..b32de6145 100644 --- a/src/cli/agent/agent-web-list.ts +++ b/src/cli/agent/agent-web-list.ts @@ -23,12 +23,11 @@ export default function setup() { options, command ); - if (await getTokens()) { - const outcome = await listWebAgents(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + const outcome = await listWebAgents(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/app/app-delete.ts b/src/cli/app/app-delete.ts index 0e202d361..877189b13 100644 --- a/src/cli/app/app-delete.ts +++ b/src/cli/app/app-delete.ts @@ -7,7 +7,7 @@ import { deleteApplications, } from '../../ops/ApplicationOps'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console'; +import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -66,36 +66,39 @@ export default function setup() { options, command ); + + if (!options.appId && !options.appName && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + return; + } + + const getTokensisSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensisSuccessful) process.exit(1); + let outcome: boolean; + // -i/--app-id or -n/--app-name - if ( - (options.appId || options.appName) && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.appId || options.appName) { verboseMessage('Deleting application...'); - const outcome = await deleteApplication( + outcome = await deleteApplication( options.appId, options.appName, options.deep ); - if (!outcome) process.exitCode = 1; } // -a/--all - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage('Deleting all applications...'); - const outcome = await deleteApplications(options.deep); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; + outcome = await deleteApplications(options.deep); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/app/app-describe.ts b/src/cli/app/app-describe.ts index 05c0852f7..26c2be577 100644 --- a/src/cli/app/app-describe.ts +++ b/src/cli/app/app-describe.ts @@ -47,7 +47,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/app/app-export.ts b/src/cli/app/app-export.ts index 1b93d3505..3104b4b16 100644 --- a/src/cli/app/app-export.ts +++ b/src/cli/app/app-export.ts @@ -8,7 +8,7 @@ import { exportApplicationToFile, } from '../../ops/ApplicationOps'; import { getTokens } from '../../ops/AuthenticateOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -88,13 +88,33 @@ export default function setup() { options, command ); - // -i/--app-id or -n/--app-name + if ( - (options.appId || options.appName) && - (await getTokens(false, true, deploymentTypes)) + !options.appId && + !options.appName && + !options.all && + !options.allSeparate ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + return; + } + + const getTokensisSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensisSuccessful) process.exit(1); + let outcome: boolean; + + // -i/--app-id or -n/--app-name + if (options.appId || options.appName) { verboseMessage('Exporting application...'); - const outcome = await exportApplicationToFile( + outcome = await exportApplicationToFile( options.appId, options.appName, options.file, @@ -104,15 +124,11 @@ export default function setup() { deps: options.deps, } ); - if (!outcome) process.exitCode = 1; } // -a/--all - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage('Exporting all applications to file...'); - const outcome = await exportApplicationsToFile( + outcome = await exportApplicationsToFile( options.file, options.metadata, { @@ -120,28 +136,16 @@ export default function setup() { deps: options.deps, } ); - if (!outcome) process.exitCode = 1; } // -A/--all-separate - else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate) { verboseMessage('Exporting all applications to separate files...'); - const outcome = await exportApplicationsToFiles(options.metadata, { + outcome = await exportApplicationsToFiles(options.metadata, { useStringArrays: true, deps: options.deps, }); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/app/app-import.ts b/src/cli/app/app-import.ts index aac23edc7..817d6cc48 100644 --- a/src/cli/app/app-import.ts +++ b/src/cli/app/app-import.ts @@ -89,16 +89,36 @@ export default function setup() { options, command ); - // -i/--app-id or -n/--app-name + if ( - options.file && - (options.appId || options.appName) && - (await getTokens(false, true, deploymentTypes)) + !options.appId && + !options.file && + !options.appName && + !options.all && + !options.allSeparate ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + return; + } + + const getTokensisSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensisSuccessful) process.exit(1); + let outcome: boolean; + + // -i/--app-id or -n/--app-name + if (options.file && (options.appId || options.appName)) { verboseMessage( `Importing application "${options.appName ?? options.appId}"...` ); - const outcome = await importApplicationFromFile( + outcome = await importApplicationFromFile( options.appId, options.appName, options.file, @@ -106,55 +126,35 @@ export default function setup() { deps: options.deps, } ); - if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all && options.file) { verboseMessage( `Importing all applications from a single file (${options.file})...` ); - const outcome = await importApplicationsFromFile(options.file, { + outcome = await importApplicationsFromFile(options.file, { deps: options.deps, }); - if (!outcome) process.exitCode = 1; } // --all-separate -A - else if ( - options.allSeparate && - !options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate && !options.file) { verboseMessage( 'Importing all applications from separate files in current directory...' ); - const outcome = await importApplicationsFromFiles({ + outcome = await importApplicationsFromFiles({ deps: options.deps, }); - if (!outcome) process.exitCode = 1; } // import first provider from file - else if ( - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.file) { verboseMessage( `Importing first application from file "${options.file}"...` ); - const outcome = await importFirstApplicationFromFile(options.file, { + outcome = await importFirstApplicationFromFile(options.file, { deps: options.deps, }); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/app/app-list.ts b/src/cli/app/app-list.ts index 6b4d75d3f..69c574c56 100644 --- a/src/cli/app/app-list.ts +++ b/src/cli/app/app-list.ts @@ -49,13 +49,16 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage(`Listing applications...`); - const outcome = await listApplications(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage(`Listing applications...`); + const outcome = await listApplications(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authn/authn-describe.ts b/src/cli/authn/authn-describe.ts index 4f3c6b970..d4a7a28b5 100644 --- a/src/cli/authn/authn-describe.ts +++ b/src/cli/authn/authn-describe.ts @@ -29,28 +29,19 @@ export default function setup() { options, command ); - if ( - await getTokens( - false, - true, - options.global ? globalDeploymentTypes : undefined - ) - ) { - verboseMessage(`Describing authentication settings...`); - const outcome = await describeAuthenticationSettings( - options.json, - options.global - ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : undefined + ); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage(`Describing authentication settings...`); + const outcome = await describeAuthenticationSettings( + options.json, + options.global + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authn/authn-export.ts b/src/cli/authn/authn-export.ts index 3d5da2643..a4cd539e1 100644 --- a/src/cli/authn/authn-export.ts +++ b/src/cli/authn/authn-export.ts @@ -35,23 +35,20 @@ export default function setup() { options, command ); - if ( - await getTokens( - false, - true, - options.global ? globalDeploymentTypes : undefined - ) - ) { - verboseMessage('Exporting authentication settings to file...'); - const outcome = exportAuthenticationSettingsToFile( - options.file, - options.global, - options.metadata - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : undefined + ); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage('Exporting authentication settings to file...'); + const outcome = exportAuthenticationSettingsToFile( + options.file, + options.global, + options.metadata + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authn/authn-import.ts b/src/cli/authn/authn-import.ts index 2461ead3a..799810dda 100644 --- a/src/cli/authn/authn-import.ts +++ b/src/cli/authn/authn-import.ts @@ -29,22 +29,19 @@ export default function setup() { options, command ); - if ( - await getTokens( - false, - true, - options.global ? globalDeploymentTypes : undefined - ) - ) { - verboseMessage('Importing authentication settings from file...'); - const outcome = importAuthenticationSettingsFromFile( - options.file, - options.global - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : undefined + ); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage('Importing authentication settings from file...'); + const outcome = importAuthenticationSettingsFromFile( + options.file, + options.global + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-policy-delete.ts b/src/cli/authz/authz-policy-delete.ts index 7e29dd2ce..60c68f0f1 100644 --- a/src/cli/authz/authz-policy-delete.ts +++ b/src/cli/authz/authz-policy-delete.ts @@ -40,32 +40,39 @@ export default function setup() { options, command ); + + if (!options.policyId && !options.setId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + return; + } + + const getTokensisSuccessful = await getTokens(); + if (!getTokensisSuccessful) process.exit(1); + + let outcome: boolean; + // delete by id - if (options.policyId && (await getTokens())) { + if (options.policyId) { verboseMessage('Deleting authorization policy...'); - const outcome = await deletePolicyById(options.policyId); - if (!outcome) process.exitCode = 1; + outcome = await deletePolicyById(options.policyId); } // --all -a by policy set - else if (options.setId && options.all && (await getTokens())) { + else if (options.setId && options.all) { verboseMessage( `Deleting all authorization policies in policy set ${options.setId}...` ); - const outcome = await deletePoliciesByPolicySet(options.setId); - if (!outcome) process.exitCode = 1; + outcome = await deletePoliciesByPolicySet(options.setId); } // --all -a - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Deleting all authorization policies...'); - const outcome = await deletePolicies(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; + outcome = await deletePolicies(); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-policy-describe.ts b/src/cli/authz/authz-policy-describe.ts index 904b5eb61..d840ceb37 100644 --- a/src/cli/authz/authz-policy-describe.ts +++ b/src/cli/authz/authz-policy-describe.ts @@ -2,7 +2,7 @@ import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; import { describePolicy } from '../../ops/PolicyOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -28,21 +28,26 @@ export default function setup() { options, command ); - if (options.policyId && (await getTokens())) { + + if (!options.policyId) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + if (options.policyId) { verboseMessage( `Describing authorization policy ${options.policyId}...` ); const outcome = await describePolicy(options.policyId, options.json); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-policy-export.ts b/src/cli/authz/authz-policy-export.ts index 353cad036..52682bfd6 100644 --- a/src/cli/authz/authz-policy-export.ts +++ b/src/cli/authz/authz-policy-export.ts @@ -8,7 +8,7 @@ import { exportPoliciesToFiles, exportPolicyToFile, } from '../../ops/PolicyOps'; -import { verboseMessage } from '../../utils/Console'; +import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -73,10 +73,30 @@ export default function setup() { options, command ); + + if ( + !options.policyId && + !options.setId && + !options.all && + !options.allSeparate + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + // export - if (options.policyId && (await getTokens())) { + if (options.policyId) { verboseMessage('Exporting authorization policy to file...'); - const outcome = await exportPolicyToFile( + outcome = await exportPolicyToFile( options.policyId, options.file, options.metadata, @@ -87,14 +107,13 @@ export default function setup() { useStringArrays: true, } ); - if (!outcome) process.exitCode = 1; } // -a/--all by policy set - else if (options.setId && options.all && (await getTokens())) { + else if (options.setId && options.all) { verboseMessage( `Exporting all authorization policies in policy set ${options.setId} to file...` ); - const outcome = await exportPoliciesByPolicySetToFile( + outcome = await exportPoliciesByPolicySetToFile( options.setId, options.file, options.metadata, @@ -105,12 +124,11 @@ export default function setup() { useStringArrays: true, } ); - if (!outcome) process.exitCode = 1; } // -a/--all - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Exporting all authorization policies to file...'); - const outcome = await exportPoliciesToFile( + outcome = await exportPoliciesToFile( options.file, options.metadata, options.modifiedProperties, @@ -120,14 +138,13 @@ export default function setup() { useStringArrays: true, } ); - if (!outcome) process.exitCode = 1; } // -A/--all-separate by policy set - else if (options.setId && options.allSeparate && (await getTokens())) { + else if (options.setId && options.allSeparate) { verboseMessage( `Exporting all authorization policies in policy set ${options.setId} to separate files...` ); - const outcome = await exportPoliciesByPolicySetToFiles( + outcome = await exportPoliciesByPolicySetToFiles( options.setId, options.metadata, options.modifiedProperties, @@ -137,14 +154,13 @@ export default function setup() { useStringArrays: true, } ); - if (!outcome) process.exitCode = 1; } // -A/--all-separate - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage( 'Exporting all authorization policies to separate files...' ); - const outcome = await exportPoliciesToFiles( + outcome = await exportPoliciesToFiles( options.metadata, options.modifiedProperties, { @@ -153,16 +169,8 @@ export default function setup() { useStringArrays: true, } ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-policy-import.ts b/src/cli/authz/authz-policy-import.ts index f1464a33e..7e163a06d 100644 --- a/src/cli/authz/authz-policy-import.ts +++ b/src/cli/authz/authz-policy-import.ts @@ -7,7 +7,7 @@ import { importPoliciesFromFiles, importPolicyFromFile, } from '../../ops/PolicyOps'; -import { verboseMessage } from '../../utils/Console'; +import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -60,62 +60,66 @@ export default function setup() { options, command ); + + if ( + !options.policyId && + !options.all && + !options.allSeparate && + !options.file + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + // import - if (options.policyId && (await getTokens())) { + if (options.policyId) { verboseMessage('Importing authorization policy from file...'); - const outcome = await importPolicyFromFile( - options.policyId, - options.file, - { - deps: options.deps, - prereqs: options.prereqs, - policySetName: options.setId, - } - ); - if (!outcome) process.exitCode = 1; + outcome = await importPolicyFromFile(options.policyId, options.file, { + deps: options.deps, + prereqs: options.prereqs, + policySetName: options.setId, + }); } // -a/--all - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Importing all authorization policies from file...'); - const outcome = await importPoliciesFromFile(options.file, { + outcome = await importPoliciesFromFile(options.file, { deps: options.deps, prereqs: options.prereqs, policySetName: options.setId, }); - if (!outcome) process.exitCode = 1; } // -A/--all-separate - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage( 'Importing all authorization policies from separate files...' ); - const outcome = await importPoliciesFromFiles({ + outcome = await importPoliciesFromFiles({ deps: options.deps, prereqs: options.prereqs, policySetName: options.setId, }); - if (!outcome) process.exitCode = 1; } // import first policy set from file - else if (options.file && (await getTokens())) { + else if (options.file) { verboseMessage( `Importing first authorization policy from file "${options.file}"...` ); - const outcome = await importFirstPolicyFromFile(options.file, { + outcome = await importFirstPolicyFromFile(options.file, { deps: options.deps, prereqs: options.prereqs, policySetName: options.setId, }); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-policy-list.ts b/src/cli/authz/authz-policy-list.ts index 3ab7b6cde..49ff018bd 100644 --- a/src/cli/authz/authz-policy-list.ts +++ b/src/cli/authz/authz-policy-list.ts @@ -25,31 +25,24 @@ export default function setup() { options, command ); + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + // by policy set - if (options.setId && (await getTokens())) { + if (options.setId) { verboseMessage( `Listing authorization policies in policy set ${options.setId}...` ); - const outcome = await listPoliciesByPolicySet( - options.setId, - options.long - ); - if (!outcome) process.exitCode = 1; + outcome = await listPoliciesByPolicySet(options.setId, options.long); } // all policies - else if (await getTokens()) { - verboseMessage(`Listing authorization policies...`); - const outcome = await listPolicies(options.long); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; + verboseMessage(`Listing authorization policies...`); + outcome = await listPolicies(options.long); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-set-delete.ts b/src/cli/authz/authz-set-delete.ts index 2aa2112ed..48359b8f7 100644 --- a/src/cli/authz/authz-set-delete.ts +++ b/src/cli/authz/authz-set-delete.ts @@ -28,24 +28,32 @@ export default function setup() { options, command ); + + if (!options.setId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + // delete by id - if (options.setId && (await getTokens())) { + if (options.setId) { verboseMessage('Deleting authorization policy set...'); - const outcome = await deletePolicySetById(options.setId); - if (!outcome) process.exitCode = 1; + outcome = await deletePolicySetById(options.setId); } // --all -a - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Deleting all authorization policy sets...'); - const outcome = await deletePolicySets(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; + outcome = await deletePolicySets(); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-set-describe.ts b/src/cli/authz/authz-set-describe.ts index 611ec0711..73f14cd5d 100644 --- a/src/cli/authz/authz-set-describe.ts +++ b/src/cli/authz/authz-set-describe.ts @@ -2,7 +2,7 @@ import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; import { describePolicySet } from '../../ops/PolicySetOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -28,21 +28,26 @@ export default function setup() { options, command ); - if (options.setId && (await getTokens())) { + + if (!options.setId) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + if (options.setId) { verboseMessage( `Describing authorization policy set ${options.setId}...` ); const outcome = await describePolicySet(options.setId, options.json); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-set-export.ts b/src/cli/authz/authz-set-export.ts index c8152f1f2..b7d444f96 100644 --- a/src/cli/authz/authz-set-export.ts +++ b/src/cli/authz/authz-set-export.ts @@ -6,7 +6,7 @@ import { exportPolicySetsToFiles, exportPolicySetToFile, } from '../../ops/PolicySetOps'; -import { verboseMessage } from '../../utils/Console'; +import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -65,10 +65,25 @@ export default function setup() { options, command ); + + if (!options.setId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + // export - if (options.setId && (await getTokens())) { + if (options.setId) { verboseMessage('Exporting authorization policy set to file...'); - const outcome = await exportPolicySetToFile( + outcome = await exportPolicySetToFile( options.setId, options.file, options.metadata, @@ -79,12 +94,11 @@ export default function setup() { prereqs: options.prereqs, } ); - if (!outcome) process.exitCode = 1; } // -a/--all - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Exporting all authorization policy sets to file...'); - const outcome = await exportPolicySetsToFile( + outcome = await exportPolicySetsToFile( options.file, options.metadata, options.modifiedProperties, @@ -94,14 +108,13 @@ export default function setup() { prereqs: options.prereqs, } ); - if (!outcome) process.exitCode = 1; } // -A/--all-separate - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage( 'Exporting all authorization policy sets to separate files...' ); - const outcome = await exportPolicySetsToFiles( + outcome = await exportPolicySetsToFiles( options.metadata, options.modifiedProperties, { @@ -110,16 +123,8 @@ export default function setup() { prereqs: options.prereqs, } ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-set-import.ts b/src/cli/authz/authz-set-import.ts index 1c1d7ed0f..bd548279b 100644 --- a/src/cli/authz/authz-set-import.ts +++ b/src/cli/authz/authz-set-import.ts @@ -7,7 +7,7 @@ import { importPolicySetsFromFile, importPolicySetsFromFiles, } from '../../ops/PolicySetOps'; -import { verboseMessage } from '../../utils/Console'; +import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -54,60 +54,64 @@ export default function setup() { options, command ); + + if ( + !options.setId && + !options.file && + !options.all && + !options.allSeparate + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + // import - if (options.setId && (await getTokens())) { + if (options.setId) { verboseMessage('Importing authorization policy set from file...'); - const outcome = await importPolicySetFromFile( - options.setId, - options.file, - { - deps: options.deps, - prereqs: options.prereqs, - } - ); - if (!outcome) process.exitCode = 1; + outcome = await importPolicySetFromFile(options.setId, options.file, { + deps: options.deps, + prereqs: options.prereqs, + }); } // -a/--all - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage( 'Importing all authorization policy sets from file...' ); - const outcome = await importPolicySetsFromFile(options.file, { + outcome = await importPolicySetsFromFile(options.file, { deps: options.deps, prereqs: options.prereqs, }); - if (!outcome) process.exitCode = 1; } // -A/--all-separate - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage( 'Importing all authorization policy sets from separate files...' ); - const outcome = await importPolicySetsFromFiles({ + outcome = await importPolicySetsFromFiles({ deps: options.deps, prereqs: options.prereqs, }); - if (!outcome) process.exitCode = 1; } // import first policy set from file - else if (options.file && (await getTokens())) { + else if (options.file) { verboseMessage( `Importing first authorization policy set from file "${options.file}"...` ); - const outcome = await importFirstPolicySetFromFile(options.file, { + outcome = await importFirstPolicySetFromFile(options.file, { deps: options.deps, prereqs: options.prereqs, }); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-set-list.ts b/src/cli/authz/authz-set-list.ts index 891207b46..1e45e7c73 100644 --- a/src/cli/authz/authz-set-list.ts +++ b/src/cli/authz/authz-set-list.ts @@ -17,13 +17,11 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage('Listing authorization policy sets...'); - const outcome = await listPolicySets(); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Listing authorization policy sets...'); + const outcome = await listPolicySets(); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-type-delete.ts b/src/cli/authz/authz-type-delete.ts index bb6bcc506..0e5e04ab7 100644 --- a/src/cli/authz/authz-type-delete.ts +++ b/src/cli/authz/authz-type-delete.ts @@ -1,3 +1,4 @@ +import { ResourceTypeSkeleton } from '@rockcarver/frodo-lib/types/api/ResourceTypesApi'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -43,30 +44,36 @@ export default function setup() { options, command ); + + if (!options.typeId && !options.typeName && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean | ResourceTypeSkeleton; + // delete by uuid - if (options.typeId && (await getTokens())) { + if (options.typeId) { verboseMessage('Deleting authorization resource type...'); - const outcome = await deleteResourceTypeById(options.typeId); - if (!outcome) process.exitCode = 1; + outcome = await deleteResourceTypeById(options.typeId); } // delete by name - else if (options.typeName && (await getTokens())) { + else if (options.typeName) { verboseMessage('Deleting authorization resource type...'); - const outcome = await deleteResourceTypeUsingName(options.typeName); - if (!outcome) process.exitCode = 1; + outcome = await deleteResourceTypeUsingName(options.typeName); } // --all -a - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Deleting all authorization resource types...'); - const outcome = await deleteResourceTypes(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; + outcome = await deleteResourceTypes(); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-type-describe.ts b/src/cli/authz/authz-type-describe.ts index a9414a1f0..6ab15fefe 100644 --- a/src/cli/authz/authz-type-describe.ts +++ b/src/cli/authz/authz-type-describe.ts @@ -5,7 +5,7 @@ import { describeResourceType, describeResourceTypeByName, } from '../../ops/ResourceTypeOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -27,29 +27,31 @@ export default function setup() { options, command ); - if (options.typeId && (await getTokens())) { - verboseMessage(`Describing authorization resource type by uuid...`); - const outcome = await describeResourceType( - options.typeId, - options.json + + if (!options.typeId && !options.typeName) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' ); - if (!outcome) process.exitCode = 1; - } else if (options.typeName && (await getTokens())) { + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + + if (options.typeId) { + verboseMessage(`Describing authorization resource type by uuid...`); + outcome = await describeResourceType(options.typeId, options.json); + } else if (options.typeName) { verboseMessage(`Describing authorization resource type by name...`); - const outcome = await describeResourceTypeByName( + outcome = await describeResourceTypeByName( options.typeName, options.json ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-type-export.ts b/src/cli/authz/authz-type-export.ts index 7ab91f2f5..260adf906 100644 --- a/src/cli/authz/authz-type-export.ts +++ b/src/cli/authz/authz-type-export.ts @@ -7,7 +7,7 @@ import { exportResourceTypesToFiles, exportResourceTypeToFile, } from '../../ops/ResourceTypeOps'; -import { verboseMessage } from '../../utils/Console'; +import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -63,59 +63,67 @@ export default function setup() { options, command ); + + if ( + !options.typeId && + !options.typeName && + !options.all && + !options.allSeparate + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + // export by uuid - if (options.typeId && (await getTokens())) { + if (options.typeId) { verboseMessage('Exporting authorization resource type to file...'); - const outcome = await exportResourceTypeToFile( + outcome = await exportResourceTypeToFile( options.typeId, options.file, options.metadata, options.modifiedProperties ); - if (!outcome) process.exitCode = 1; } // export by name - else if (options.typeName && (await getTokens())) { + else if (options.typeName) { verboseMessage('Exporting authorization resource type to file...'); - const outcome = await exportResourceTypeByNameToFile( + outcome = await exportResourceTypeByNameToFile( options.typeName, options.file, options.metadata, options.modifiedProperties ); - if (!outcome) process.exitCode = 1; } // -a/--all - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage( 'Exporting all authorization resource types to file...' ); - const outcome = await exportResourceTypesToFile( + outcome = await exportResourceTypesToFile( options.file, options.metadata, options.modifiedProperties ); - if (!outcome) process.exitCode = 1; } // -A/--all-separate - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage( 'Exporting all authorization resource types to separate files...' ); - const outcome = await exportResourceTypesToFiles( + outcome = await exportResourceTypesToFiles( options.metadata, options.modifiedProperties ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-type-import.ts b/src/cli/authz/authz-type-import.ts index 0d02565c7..8bc22f0c9 100644 --- a/src/cli/authz/authz-type-import.ts +++ b/src/cli/authz/authz-type-import.ts @@ -8,7 +8,7 @@ import { importResourceTypesFromFile, importResourceTypesFromFiles, } from '../../ops/ResourceTypeOps'; -import { verboseMessage } from '../../utils/Console'; +import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -52,60 +52,68 @@ export default function setup() { options, command ); + + if ( + !options.typeId && + !options.typeName && + !options.file && + !options.all && + !options.allSeparate + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + // import by uuid - if (options.typeId && (await getTokens())) { + if (options.typeId) { verboseMessage( 'Importing authorization resource type by uuid from file...' ); - const outcome = await importResourceTypeFromFile( + outcome = await importResourceTypeFromFile( options.typeId, options.file ); - if (!outcome) process.exitCode = 1; } // import by name - else if (options.typeName && (await getTokens())) { + else if (options.typeName) { verboseMessage( 'Importing authorization resource type by name from file...' ); - const outcome = await importResourceTypeByNameFromFile( + outcome = await importResourceTypeByNameFromFile( options.typeName, options.file ); - if (!outcome) process.exitCode = 1; } // -a/--all - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage( 'Importing all authorization resource types from file...' ); - const outcome = await importResourceTypesFromFile(options.file); - if (!outcome) process.exitCode = 1; + outcome = await importResourceTypesFromFile(options.file); } // -A/--all-separate - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage( 'Importing all authorization resource types from separate files...' ); - const outcome = await importResourceTypesFromFiles(); - if (!outcome) process.exitCode = 1; + outcome = await importResourceTypesFromFiles(); } // import first - else if (options.file && (await getTokens())) { + else if (options.file) { verboseMessage( `Importing first authorization resource type from file "${options.file}"...` ); - const outcome = await importFirstResourceTypeFromFile(options.file); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; + outcome = await importFirstResourceTypeFromFile(options.file); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/authz/authz-type-list.ts b/src/cli/authz/authz-type-list.ts index 6d065af36..12c94262c 100644 --- a/src/cli/authz/authz-type-list.ts +++ b/src/cli/authz/authz-type-list.ts @@ -24,13 +24,11 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage('Listing resource types...'); - const outcome = await listResourceTypes(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Listing resource types...'); + const outcome = await listResourceTypes(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts index e02521a55..2feb71d88 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportAccessConfig } from '../../../configManagerOps/FrConfigAccessConfigOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,16 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity access-config'); - const outcome = await configManagerExportAccessConfig(options.envFile); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage('Exporting config entity access-config'); + const outcome = await configManagerExportAccessConfig(options.envFile); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-all-static.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-all-static.ts index e97d16099..8649beab0 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-all-static.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-all-static.ts @@ -31,10 +31,12 @@ export default function setup() { command ); - if (!(await getTokens(false, true, deploymentTypes))) { - process.exitCode = 1; - return; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); const outcome = await configManagerExportAllStatic(); if (!outcome) process.exitCode = 1; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-all.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-all.ts index ab591170c..c8d313dad 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-all.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-all.ts @@ -51,10 +51,14 @@ export default function setup() { command ); - if ( - options.configFolder && - (await getTokens(false, true, deploymentTypes)) - ) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options.configFolder) { verboseMessage( 'Exporting config files that fr-config-manager supports.' ); @@ -70,8 +74,8 @@ export default function setup() { 'Please refer to the help message for more information.', 'error' ); - program.help(); process.exitCode = 1; + program.help(); } }); diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts index cef4b6e9f..414b133c2 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportAudit } from '../../../configManagerOps/FrConfigAuditOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,16 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity audit'); - const outcome = await configManagerExportAudit(options.envFile); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage('Exporting config entity audit'); + const outcome = await configManagerExportAudit(options.envFile); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-authentication.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-authentication.ts index ad0987b3e..cfb8f6bab 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-authentication.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-authentication.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportAuthentication } from '../../../configManagerOps/FrConfigAuthenticationOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -41,20 +41,16 @@ export default function setup() { if (options.realm) { realm = options.realm; } - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity authentication'); - const outcome = await configManagerExportAuthentication(realm); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage('Exporting config entity authentication'); + const outcome = await configManagerExportAuthentication(realm); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-authz-policies.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-authz-policies.ts index 639c70cf8..332a8064f 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-authz-policies.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-authz-policies.ts @@ -84,92 +84,87 @@ export default function setup() { realm = options.realm; } - if (await getTokens(false, true, deploymentTypes)) { - let outcome: boolean; - - // -p/--p-set - if (options.policyName) { - printMessage( - `Exporting the policy set "${options.policyName}" in the ${state.getRealm()} realm.` - ); - - // try and find script in current realm - outcome = await configManagerExportAuthzPolicySet( - { - policySetName: options.policyName, - }, - options.file - ); - - // check other realms for the script but only if there is no config file specified - if (!outcome && !options.file) { - const checkedRealms: string[] = [state.getRealm()]; - for (const realm of await readRealms()) { - if (outcome) { - break; - } - if (!checkedRealms.includes(realm.name)) { - printMessage( - `Exporting the policy set "${options.policyName}" from the ${checkedRealms[checkedRealms.length - 1]} realm failed.` - ); - state.setRealm(realm.name); - checkedRealms.push(state.getRealm()); - printMessage( - `Looking for the policy set "${options.policyName}" in the ${state.getRealm()} realm now.` - ); - outcome = await configManagerExportAuthzPolicySet( - { - policySetName: options.policyName, - }, - null - ); - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + + // -p/--p-set + if (options.policyName) { + printMessage( + `Exporting the policy set "${options.policyName}" in the ${state.getRealm()} realm.` + ); + + // try and find script in current realm + outcome = await configManagerExportAuthzPolicySet( + { + policySetName: options.policyName, + }, + options.file + ); + + // check other realms for the script but only if there is no config file specified + if (!outcome && !options.file) { + const checkedRealms: string[] = [state.getRealm()]; + for (const realm of await readRealms()) { + if (outcome) { + break; } - if (!outcome) { + if (!checkedRealms.includes(realm.name)) { + printMessage( + `Exporting the policy set "${options.policyName}" from the ${checkedRealms[checkedRealms.length - 1]} realm failed.` + ); + state.setRealm(realm.name); + checkedRealms.push(state.getRealm()); printMessage( - `Did not find the policy set "${options.policyName}" anywhere.` + `Looking for the policy set "${options.policyName}" in the ${state.getRealm()} realm now.` + ); + outcome = await configManagerExportAuthzPolicySet( + { + policySetName: options.policyName, + }, + null ); } } + if (!outcome) { + printMessage( + `Did not find the policy set "${options.policyName}" anywhere.` + ); + } } + } - // -f/--file - else if (options.file) { - printMessage( - `Exporting all the policy sets in the provided config file.` - ); - outcome = await configManagerExportAuthzPolicySets(options.file); - } - - // -r/--realm - else if (realm !== constants.DEFAULT_REALM_KEY) { - printMessage( - `Exporting all the policy sets in the ${state.getRealm()} realm.` - ); - outcome = await configManagerExportAuthzPolicySetsRealm(); - } - - // export all policy sets from all realms, the default when no options are provided - else { - printMessage('Exporting all the policy sets in the host tenant.'); - outcome = await configManagerExportAuthzPoliciesAll(); - } + // -f/--file + else if (options.file) { + printMessage( + `Exporting all the policy sets in the provided config file.` + ); + outcome = await configManagerExportAuthzPolicySets(options.file); + } - if (!outcome) { - printMessage( - `Failed to export one or more authorization policy sets. ${options.verbose ? '' : 'Check --verbose for me details.'}` - ); - process.exitCode = 1; - } + // -r/--realm + else if (realm !== constants.DEFAULT_REALM_KEY) { + printMessage( + `Exporting all the policy sets in the ${state.getRealm()} realm.` + ); + outcome = await configManagerExportAuthzPolicySetsRealm(); } - // unrecognized combination of options or no options + // export all policy sets from all realms, the default when no options are provided else { + printMessage('Exporting all the policy sets in the host tenant.'); + outcome = await configManagerExportAuthzPoliciesAll(); + } + + if (!outcome) { printMessage( - 'Unrecognized combination of options or no options...', - 'error' + `Failed to export one or more authorization policy sets. ${options.verbose ? '' : 'Check --verbose for more details.'}` ); - program.help(); process.exitCode = 1; } }); diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-definitions.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-definitions.ts index 9ed88cde2..2f5368bd5 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-definitions.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-definitions.ts @@ -42,30 +42,26 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - let outcome: boolean; - if (options.name) { - printMessage( - `Exporting connector definition for connector: "${options.name}"` - ); - outcome = await configManagerExportConnectorDefinition({ - connectorName: options.name, - }); - } else { - printMessage('Exporting all connector defitions.'); - outcome = await configManagerExportConnectorDefinitionsAll(); - } - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; + if (options.name) { printMessage( - 'Unrecognized combination of options or no options...', - 'error' + `Exporting connector definition for connector: "${options.name}"` ); - program.help(); - process.exitCode = 1; + outcome = await configManagerExportConnectorDefinition({ + connectorName: options.name, + }); + } else { + printMessage('Exporting all connector defitions.'); + outcome = await configManagerExportConnectorDefinitionsAll(); } + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-mappings.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-mappings.ts index 2c9013145..98bec5db3 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-mappings.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-mappings.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportMappings } from '../../../configManagerOps/FrConfigConnectorMappingOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -31,21 +31,15 @@ export default function setup() { options, command ); - - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting connector mappings'); - const outcome = await configManagerExportMappings(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting connector mappings'); + const outcome = await configManagerExportMappings(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-cookie-domains.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-cookie-domains.ts index bf278771e..792400bec 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-cookie-domains.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-cookie-domains.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportCookieDomains } from '../../../configManagerOps/FrConfigCookieDomainsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -31,21 +31,16 @@ export default function setup() { options, command ); + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity cookie-domains'); - const outcome = await configManagerExportCookieDomains(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + verboseMessage('Exporting config entity cookie-domains'); + const outcome = await configManagerExportCookieDomains(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-cors.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-cors.ts index d3cd94e37..6f70b4a66 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-cors.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-cors.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportCors } from '../../../configManagerOps/FrConfigCorsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting CORS configuration'); - const outcome = await configManagerExportCors(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting CORS configuration'); + const outcome = await configManagerExportCors(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-csp.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-csp.ts index 857ecc3a8..1421d8d37 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-csp.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-csp.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportCsp } from '../../../configManagerOps/FrConfigCspOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -56,20 +56,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting content security policy'); - const outcome = await configManagerExportCsp(options.file); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting content security policy'); + const outcome = await configManagerExportCsp(options.file); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-custom-nodes.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-custom-nodes.ts index 322aa0a94..2030dddd2 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-custom-nodes.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-custom-nodes.ts @@ -39,19 +39,19 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - if (options.nodeName) { - verboseMessage( - `Fetching custom node with name '${options.nodeName}'` - ); - } else { - verboseMessage('Fetching custom nodes'); - } - const outcome = await configManagerExportCustomNodes(options.nodeName); - if (!outcome) process.exitCode = 1; + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.nodeName) { + verboseMessage(`Fetching custom node with name '${options.nodeName}'`); } else { - process.exitCode = 1; + verboseMessage('Fetching custom nodes'); } + const outcome = await configManagerExportCustomNodes(options.nodeName); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-email-provider.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-email-provider.ts index 4faaf2687..34dd618d7 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-email-provider.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-email-provider.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportEmailProviderConfiguration } from '../../../configManagerOps/FrConfigEmailProviderOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting email provider configuration'); - const outcome = await configManagerExportEmailProviderConfiguration(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting email provider configuration'); + const outcome = await configManagerExportEmailProviderConfiguration(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-email-templates.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-email-templates.ts index 5f8b993fb..7b84560ed 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-email-templates.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-email-templates.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportEmailTemplates } from '../../../configManagerOps/FrConfigEmailTemplatesOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -38,21 +38,21 @@ export default function setup() { options, command ); - - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity email-templates'); - const outcome = await configManagerExportEmailTemplates(options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + verboseMessage( + `Exporting config entity email-template with name ${options.name}` ); - program.help(); - process.exitCode = 1; + } else { + verboseMessage('Exporting all config entity email-templates'); } + const outcome = await configManagerExportEmailTemplates(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-endpoints.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-endpoints.ts index d9b51d617..4c7181a86 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-endpoints.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-endpoints.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportEndpoints } from '../../../configManagerOps/FrConfigEndpointsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -39,20 +39,21 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity endpoints'); - const outcome = await configManagerExportEndpoints(options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + verboseMessage( + `Exporting config entity endpoint with name ${options.name}` ); - program.help(); - process.exitCode = 1; + } else { + verboseMessage('Exporting all config entity endpoints'); } + const outcome = await configManagerExportEndpoints(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-internal-roles.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-internal-roles.ts index f0d1a2b95..1368d784c 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-internal-roles.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-internal-roles.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportInternalRoles } from '../../../configManagerOps/FrConfigInternalRolesOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -40,20 +40,19 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting internal roles'); - const outcome = await configManagerExportInternalRoles(options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + verboseMessage(`Exporting internal role with name ${options.name}`); + } else { + verboseMessage('Exporting all internal roles'); } + const outcome = await configManagerExportInternalRoles(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-journeys.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-journeys.ts index bc947bec2..c1038df11 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-journeys.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-journeys.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportJourneys } from '../../../configManagerOps/FrConfigJourneysOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -53,24 +53,19 @@ export default function setup() { realm = options.realm; } - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity journeys'); - const outcome = await configManagerExportJourneys( - options.name, - realm, - options.pullDependencies - ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting config entity journeys'); + const outcome = await configManagerExportJourneys( + options.name, + realm, + options.pullDependencies + ); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts index a13aa9152..c152b745e 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportKbaConfig } from '../../../configManagerOps/FrConfigKbaOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity kba-config'); - const outcome = await configManagerExportKbaConfig(options.envFile); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting config entity kba-config'); + const outcome = await configManagerExportKbaConfig(options.envFile); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-locales.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-locales.ts index 447dc6cc3..f86ad738a 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-locales.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-locales.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportLocales } from '../../../configManagerOps/FrConfigLocalesOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -39,20 +39,21 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity locales'); - const outcome = await configManagerExportLocales(options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + verboseMessage( + `Exporting config entity locale with name ${options.name}` ); - program.help(); - process.exitCode = 1; + } else { + verboseMessage('Exporting config entity locales'); } + const outcome = await configManagerExportLocales(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-managed-objects.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-managed-objects.ts index ca49c2d6c..6e6a3ffa6 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-managed-objects.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-managed-objects.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportManagedObjects } from '../../../configManagerOps/FrConfigManagedObjectsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -39,20 +39,21 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity managed-objects'); - const outcome = await configManagerExportManagedObjects(options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + verboseMessage( + `Exporting config entity managed-object with name ${options.name}` ); - program.help(); - process.exitCode = 1; + } else { + verboseMessage('Exporting config entity managed-objects'); } + const outcome = await configManagerExportManagedObjects(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-oauth2-agents.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-oauth2-agents.ts index b31c79663..d4862b91c 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-oauth2-agents.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-oauth2-agents.ts @@ -99,88 +99,76 @@ export default function setup() { realm = options.realm; } - if (await getTokens(false, true, deploymentTypes)) { - let outcome: boolean; + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + let outcome: boolean; - // -n/--script-name - if (options.agentName) { - printMessage( - `Exporting the agent "${options.agentName}" from the ${state.getRealm()} realm.` - ); + // -n/--script-name + if (options.agentName) { + printMessage( + `Exporting the agent "${options.agentName}" from the ${state.getRealm()} realm.` + ); - // try and find the agent in current realm - outcome = await configManagerExportAgent( - options.agentName, - options.file - ); + // try and find the agent in current realm + outcome = await configManagerExportAgent( + options.agentName, + options.file + ); - // check other realms for the agent - if (!outcome && !options.file) { - const checkedRealms: string[] = [state.getRealm()]; - for (const realm of await readRealms()) { - if (outcome) { - break; - } - if (!checkedRealms.includes(realm.name)) { - printMessage( - `Exporting the agent "${options.agentName}" from the ${state.getRealm()} realm failed.` - ); - state.setRealm(realm.name); - checkedRealms.push(state.getRealm()); - printMessage( - `Looking for the agent "${options.agentName}" in the ${state.getRealm()} realm now.` - ); - outcome = await configManagerExportAgent( - options.agentName, - null - ); - } + // check other realms for the agent + if (!outcome && !options.file) { + const checkedRealms: string[] = [state.getRealm()]; + for (const realm of await readRealms()) { + if (outcome) { + break; } - if (!outcome) { + if (!checkedRealms.includes(realm.name)) { + printMessage( + `Exporting the agent "${options.agentName}" from the ${state.getRealm()} realm failed.` + ); + state.setRealm(realm.name); + checkedRealms.push(state.getRealm()); printMessage( - `Did not find the agent "${options.agentName}" anywhere.` + `Looking for the agent "${options.agentName}" in the ${state.getRealm()} realm now.` ); + outcome = await configManagerExportAgent(options.agentName, null); } } - } - - // -f/--file - else if (options.file) { - printMessage( - `Exporting all the agents defined in the provided config file.` - ); - outcome = await configManagerExportConfigAgents(options.file); - } - - // -r/--realm - else if (realm !== constants.DEFAULT_REALM_KEY) { - printMessage( - `Exporting all the agents from the ${state.getRealm()} realm.` - ); - outcome = await configManagerExportAgentsRealm(); - } - - // export all oauth2 agents, the default when no options are provided - else { - printMessage(`Exporting all the agents in the host tenant.`); - outcome = await configManagerExportAgentsAll(); - } - - if (!outcome) { - printMessage( - `Failed to export one or more oauth2 agents. ${options.verbose ? '' : 'Check --verbose for me details.'}` - ); - process.exitCode = 1; + if (!outcome) { + printMessage( + `Did not find the agent "${options.agentName}" anywhere.` + ); + } } } - - // unrecognized combination of options or no options + // -f/--file + else if (options.file) { + printMessage( + `Exporting all the agents defined in the provided config file.` + ); + outcome = await configManagerExportConfigAgents(options.file); + } + // -r/--realm + else if (realm !== constants.DEFAULT_REALM_KEY) { + printMessage( + `Exporting all the agents from the ${state.getRealm()} realm.` + ); + outcome = await configManagerExportAgentsRealm(); + } + // export all oauth2 agents, the default when no options are provided else { + printMessage(`Exporting all the agents in the host tenant.`); + outcome = await configManagerExportAgentsAll(); + } + if (!outcome) { printMessage( - 'Unrecognized combination of options or no options...', - 'error' + `Failed to export one or more oauth2 agents. ${options.verbose ? '' : 'Check --verbose for me details.'}` ); - program.help(); process.exitCode = 1; } }); diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-org-privileges.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-org-privileges.ts index 9f9910c3f..b291e0f22 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-org-privileges.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-org-privileges.ts @@ -49,33 +49,26 @@ export default function setup() { realm = options.realm; } - if (await getTokens(false, true, deploymentTypes)) { - let outcome: boolean; - if (realm !== constants.DEFAULT_REALM_KEY) { - printMessage( - `Exporting organization privileges config from the realm: "${realm}"` - ); - outcome = - (await configManagerExportOrgPrivileges()) && - (await configManagerExportOrgPrivilegesRealm(realm)); - } else { - printMessage( - 'Exporting oranization privileges config from all realms' - ); - outcome = await configManagerExportOrgPrivilegesAllRealms(); - } - - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + if (realm !== constants.DEFAULT_REALM_KEY) { printMessage( - 'Unrecognized combination of options or no options...', - 'error' + `Exporting organization privileges config from the realm: "${realm}"` ); - program.help(); - process.exitCode = 1; + outcome = + (await configManagerExportOrgPrivileges()) && + (await configManagerExportOrgPrivilegesRealm(realm)); + } else { + printMessage('Exporting oranization privileges config from all realms'); + outcome = await configManagerExportOrgPrivilegesAllRealms(); } + + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-password-policy.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-password-policy.ts index 97a3c629e..9341c2b44 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-password-policy.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-password-policy.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportPasswordPolicy } from '../../../configManagerOps/FrConfigPasswordPolicyOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -41,20 +41,15 @@ export default function setup() { if (options.realm) { realm = options.realm; } - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity password-policy'); - const outcome = await configManagerExportPasswordPolicy(realm); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting config entity password-policy'); + const outcome = await configManagerExportPasswordPolicy(realm); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-raw.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-raw.ts index 3003b3e14..8565e7968 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-raw.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-raw.ts @@ -60,26 +60,18 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - const outcome: boolean = await configManagerExportRaw( - options.configFile - ); - - if (!outcome) { - printMessage( - `Failed to export one or more config files. ${options.verbose ? '' : 'Check --verbose for me details.'}` - ); - process.exitCode = 1; - } - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + const outcome: boolean = await configManagerExportRaw(options.configFile); - // unrecognized combination of options or no options - else { + if (!outcome) { printMessage( - 'Unrecognized combination of options or no options...', - 'error' + `Failed to export one or more config files. ${options.verbose ? '' : 'Check --verbose for me details.'}` ); - program.help(); process.exitCode = 1; } }); diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts index 02caebd42..bcb3d2fd4 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportRemoteServers } from '../../../configManagerOps/FrConfigRemoteServersOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity remote-servers'); - const outcome = await configManagerExportRemoteServers(options.envFile); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting config entity remote-servers'); + const outcome = await configManagerExportRemoteServers(options.envFile); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-saml.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-saml.ts index 6c25c05cb..64f144668 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-saml.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-saml.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportSaml } from '../../../configManagerOps/FrConfigSamlOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -68,20 +68,15 @@ export default function setup() { realm = options.realm; } - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity saml'); - const outcome = await configManagerExportSaml(options.file); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting config entity saml'); + const outcome = await configManagerExportSaml(options.file); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-schedules.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-schedules.ts index 7981a4bac..cf8c69810 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-schedules.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-schedules.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportSchedules } from '../../../configManagerOps/FrConfigSchedulesOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { printMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -40,20 +40,19 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting schedules'); - const outcome = await configManagerExportSchedules(options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + printMessage(`Exporting schedule with name ${options.name}`); + } else { + printMessage('Exporting all schedules...'); } + const outcome = await configManagerExportSchedules(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-scripts.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-scripts.ts index 3beb7f298..208a0aaf5 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-scripts.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-scripts.ts @@ -121,95 +121,89 @@ export default function setup() { options.justContent || options.prefix; - if (await getTokens(false, true, deploymentTypes)) { - let outcome: boolean; + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; - // -n/--script-name - if (options.scriptName) { - // try and find script in current realm - printMessage( - `Exporting script ${options.scriptName} from the ${state.getRealm()} realm.` - ); - const originalRealm: string = state.getRealm(); - outcome = await configManagerExportScript( - { - scriptName: options.scriptName, - }, - options.justContent, - options.justConfig - ); + // -n/--script-name + if (options.scriptName) { + // try and find script in current realm + printMessage( + `Exporting script ${options.scriptName} from the ${state.getRealm()} realm.` + ); + const originalRealm: string = state.getRealm(); + outcome = await configManagerExportScript( + { + scriptName: options.scriptName, + }, + options.justContent, + options.justConfig + ); - // check other realms for the script - if (!outcome) { - for (const realm of await readRealms()) { - if (outcome) { - break; - } - if (realm.name !== originalRealm) { - printMessage( - `Exporting script ${options.scriptName} from the ${state.getRealm()} realm failed.` - ); - state.setRealm(realm.name); - printMessage( - `Looking for the ${options.scriptName} script in the ${state.getRealm()} realm now.` - ); - outcome = await configManagerExportScript( - { - scriptName: options.scriptName, - }, - options.justContent, - options.justConfig - ); - } + // check other realms for the script + if (!outcome) { + for (const realm of await readRealms()) { + if (outcome) { + break; } - if (!outcome) { + if (realm.name !== originalRealm) { printMessage( - `Did not find the script "${options.scriptName}" anywhere.` + `Exporting script ${options.scriptName} from the ${state.getRealm()} realm failed.` + ); + state.setRealm(realm.name); + printMessage( + `Looking for the ${options.scriptName} script in the ${state.getRealm()} realm now.` + ); + outcome = await configManagerExportScript( + { + scriptName: options.scriptName, + }, + options.justContent, + options.justConfig ); } } + if (!outcome) { + printMessage( + `Did not find the script "${options.scriptName}" anywhere.` + ); + } } + } - // -r/--realm - else if (realm !== constants.DEFAULT_REALM_KEY) { - printMessage( - `Exporting scripts from the ${state.getRealm()} realm${hasOptions ? ' with custom options.' : '.'}` - ); - outcome = await configManagerExportScriptsRealms( - options.prefix, - options.justContent, - options.justConfig, - options.scriptType, - options.language - ); - } - - // export all, the default - else { - printMessage( - `Exporting scripts from entire tenant${hasOptions ? ' with custom options.' : '.'}` - ); - outcome = await configManagerExportScriptsAll( - options.prefix, - options.justContent, - options.justConfig, - options.scriptType, - options.language - ); - } - - if (!outcome) { - process.exitCode = 1; - } + // -r/--realm + else if (realm !== constants.DEFAULT_REALM_KEY) { + printMessage( + `Exporting scripts from the ${state.getRealm()} realm${hasOptions ? ' with custom options.' : '.'}` + ); + outcome = await configManagerExportScriptsRealms( + options.prefix, + options.justContent, + options.justConfig, + options.scriptType, + options.language + ); } - // unrecognized combination of options or no options + // export all, the default else { printMessage( - 'Unrecognized combination of options or no options...', - 'error' + `Exporting scripts from entire tenant${hasOptions ? ' with custom options.' : '.'}` ); - program.help(); + outcome = await configManagerExportScriptsAll( + options.prefix, + options.justContent, + options.justConfig, + options.scriptType, + options.language + ); + } + + if (!outcome) { process.exitCode = 1; } }); diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-secret-mappings.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-secret-mappings.ts index 18871508a..690e1cd70 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-secret-mappings.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-secret-mappings.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportSecretMappings } from '../../../configManagerOps/FrConfigSecretMappingsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -47,24 +47,18 @@ export default function setup() { if (options.realm) { realm = options.realm; } - - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity secret-mappings'); - const outcome = await configManagerExportSecretMappings( - options.name, - realm - ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting config entity secret-mappings'); + const outcome = await configManagerExportSecretMappings( + options.name, + realm + ); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-secrets.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-secrets.ts index ec4a69658..c51c56c72 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-secrets.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-secrets.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportSecrets } from '../../../configManagerOps/FrConfigSecretOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -31,21 +31,15 @@ export default function setup() { options, command ); - - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting secrets'); - const outcome = await configManagerExportSecrets(options); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting secrets'); + const outcome = await configManagerExportSecrets(options); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-service-objects.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-service-objects.ts index bea9ae6dc..d8c180507 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-service-objects.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-service-objects.ts @@ -90,19 +90,28 @@ export default function setup() { command ); - if (options.file && (await getTokens(false, true, deploymentTypes))) { - verboseMessage('Exporting service objects'); - const outcome = await configManagerExportServiceObjectsFromFile( - options.file - ); - if (!outcome) process.exitCode = 1; - } else { + if (!options.file) { printMessage( 'Unrecognized combination of options or no options...', 'error' ); - program.help(); process.exitCode = 1; + return; + } + + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options.file) { + verboseMessage('Exporting service objects'); + const outcome = await configManagerExportServiceObjectsFromFile( + options.file + ); + if (!outcome) process.exitCode = 1; } }); diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-services.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-services.ts index fbc618007..ae8d84979 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-services.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-services.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerExportServices } from '../../../configManagerOps/FrConfigServiceOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { printMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -47,20 +47,21 @@ export default function setup() { realm = options.realm; } - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting services'); - const outcome = await configManagerExportServices(realm, options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { printMessage( - 'Unrecognized combination of options or no options...', - 'error' + `Exporting service with name ${options.name} from realm ${realm}` ); - program.help(); - process.exitCode = 1; + } else { + printMessage(`Exporting all services from realm ${realm}`); } + const outcome = await configManagerExportServices(realm, options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-terms-and-conditions.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-terms-and-conditions.ts index adcb38163..7705fbfaa 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-terms-and-conditions.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-terms-and-conditions.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportTermsAndConditions } from '../../../configManagerOps/FrConfigTermsAndConditionsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -31,21 +31,15 @@ export default function setup() { options, command ); - - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting terms and conditions'); - const outcome = await configManagerExportTermsAndConditions(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting terms and conditions'); + const outcome = await configManagerExportTermsAndConditions(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-test.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-test.ts index 1b468deb3..08ccf8092 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-test.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-test.ts @@ -31,19 +31,14 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Test connection and authentication'); - printMessage('Authenticated successfully'); - } - // unrecognized combination of options or no options - else { - printMessage( - `Error getting tokens from the host: ${host}. Make sure to connect to the host using frodo conn save command.`, - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Test connection and authentication'); + printMessage('Authenticated successfully'); }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-themes.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-themes.ts index 814691787..3ec19c721 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-themes.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-themes.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportThemes } from '../../../configManagerOps/FrConfigThemeOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting themes'); - const outcome = await configManagerExportThemes(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting themes'); + const outcome = await configManagerExportThemes(); + if (!outcome) process.exitCode = 1; }); return program; } diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts index 40dafdf17..2ce87e856 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportUiConfig } from '../../../configManagerOps/FrConfigUiConfigOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -31,21 +31,15 @@ export default function setup() { options, command ); - - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity ui-configuration'); - const outcome = await configManagerExportUiConfig(options.envFile); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting config entity ui-configuration'); + const outcome = await configManagerExportUiConfig(options.envFile); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-variables.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-variables.ts index febceff1b..7789b24b3 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-variables.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-variables.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerExportVariables } from '../../../configManagerOps/FrConfigVariableOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; @@ -26,21 +26,15 @@ export default function setup() { options, command ); - - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting variables'); - const outcome = await configManagerExportVariables(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting variables'); + const outcome = await configManagerExportVariables(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-access-config.ts b/src/cli/config-manager/config-manager-push/config-manager-push-access-config.ts index 348444583..7ff7acb01 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-access-config.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-access-config.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerImportAccessConfig } from '../../../configManagerOps/FrConfigAccessConfigOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,16 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing access configuration...'); - const outcome = await configManagerImportAccessConfig(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage('Importing access configuration...'); + const outcome = await configManagerImportAccessConfig(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-audit.ts b/src/cli/config-manager/config-manager-push/config-manager-push-audit.ts index 38b37264d..0c28d45d8 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-audit.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-audit.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerImportAudit } from '../../../configManagerOps/FrConfigAuditOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing audit configuration...'); - const outcome = await configManagerImportAudit(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Importing audit configuration...'); + const outcome = await configManagerImportAudit(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-authentication.ts b/src/cli/config-manager/config-manager-push/config-manager-push-authentication.ts index a4466a0c2..e43df8b44 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-authentication.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-authentication.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerImportAuthentication } from '../../../configManagerOps/FrConfigAuthenticationOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -38,20 +38,15 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing config entity authentication'); - const outcome = await configManagerImportAuthentication(options.realm); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Importing config entity authentication'); + const outcome = await configManagerImportAuthentication(options.realm); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-connector-definitions.ts b/src/cli/config-manager/config-manager-push/config-manager-push-connector-definitions.ts index da6545402..daef95923 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-connector-definitions.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-connector-definitions.ts @@ -39,13 +39,22 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing connector definitions'); - const outcome = await configManagerImportConnectors(options.name); - if (!outcome) process.exitCode = 1; + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + verboseMessage( + `Importing connector definition with name "${options.name}"` + ); } else { - process.exitCode = 1; + verboseMessage('Importing all connector definitions'); } + + const outcome = await configManagerImportConnectors(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-cookie-domain.ts b/src/cli/config-manager/config-manager-push/config-manager-push-cookie-domain.ts index ce845a969..da471ae9c 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-cookie-domain.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-cookie-domain.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerImportCookieDomains } from '../../../configManagerOps/FrConfigCookieDomainsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing cookie domains...'); - const outcome = await configManagerImportCookieDomains(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Importing cookie domains...'); + const outcome = await configManagerImportCookieDomains(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-email-provider.ts b/src/cli/config-manager/config-manager-push/config-manager-push-email-provider.ts index 9d9fccf03..4d1f6e964 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-email-provider.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-email-provider.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerImportEmailProvider } from '../../../configManagerOps/FrConfigEmailProviderOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing email provider configuration.'); - const outcome = await configManagerImportEmailProvider(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Importing email provider configuration.'); + const outcome = await configManagerImportEmailProvider(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-email-templates.ts b/src/cli/config-manager/config-manager-push/config-manager-push-email-templates.ts index 18ce0728f..ff5adee81 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-email-templates.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-email-templates.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerImportEmailTemplates } from '../../../configManagerOps/FrConfigEmailTemplatesOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -39,20 +39,19 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing config entity email-templates'); - const outcome = await configManagerImportEmailTemplates(options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + verboseMessage(`Importing email template with name "${options.name}"`); + } else { + verboseMessage('Importing all email templates'); } + const outcome = await configManagerImportEmailTemplates(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-endpoints.ts b/src/cli/config-manager/config-manager-push/config-manager-push-endpoints.ts index 5fded8d5b..086949ceb 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-endpoints.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-endpoints.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerImportEndpoints } from '../../../configManagerOps/FrConfigEndpointsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -39,20 +39,21 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing config entity endpoints'); - const outcome = await configManagerImportEndpoints(options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + verboseMessage( + `Importing config entity endpoint with name "${options.name}"` ); - program.help(); - process.exitCode = 1; + } else { + verboseMessage('Importing config entity endpoints'); } + const outcome = await configManagerImportEndpoints(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-internal-roles.ts b/src/cli/config-manager/config-manager-push/config-manager-push-internal-roles.ts index 847b25993..fc90d72cd 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-internal-roles.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-internal-roles.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerImportInternalRoles } from '../../../configManagerOps/FrConfigInternalRolesOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -40,20 +40,19 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing internal roles'); - const outcome = await configManagerImportInternalRoles(options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + verboseMessage(`Importing internal role with name "${options.name}"`); + } else { + verboseMessage('Importing all internal roles'); } + const outcome = await configManagerImportInternalRoles(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-kba.ts b/src/cli/config-manager/config-manager-push/config-manager-push-kba.ts index 9e4b8c393..334acb42d 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-kba.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-kba.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerImportKbaConfig } from '../../../configManagerOps/FrConfigKbaOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -31,21 +31,15 @@ export default function setup() { options, command ); - - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing kba configuration.'); - const outcome = await configManagerImportKbaConfig(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Importing kba configuration.'); + const outcome = await configManagerImportKbaConfig(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-locales.ts b/src/cli/config-manager/config-manager-push/config-manager-push-locales.ts index 74eb8b1c7..d342b220d 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-locales.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-locales.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerImportLocales } from '../../../configManagerOps/FrConfigLocalesOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -39,20 +39,21 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing config entity locales'); - const outcome = await configManagerImportLocales(options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + verboseMessage( + `Importing config entity locale with name "${options.name}"` ); - program.help(); - process.exitCode = 1; + } else { + verboseMessage('Importing config entity locales'); } + const outcome = await configManagerImportLocales(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-managed-objects.ts b/src/cli/config-manager/config-manager-push/config-manager-push-managed-objects.ts index f56bff29e..3e4803dd0 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-managed-objects.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-managed-objects.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerImportManagedObjects } from '../../../configManagerOps/FrConfigManagedObjectsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -39,20 +39,19 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing managed objects'); - const outcome = await configManagerImportManagedObjects(options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + verboseMessage(`Importing managed object with name "${options.name}"`); + } else { + verboseMessage('Importing all managed objects'); } + const outcome = await configManagerImportManagedObjects(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-org-privileges.ts b/src/cli/config-manager/config-manager-push/config-manager-push-org-privileges.ts index 03edd11ed..f250855d6 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-org-privileges.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-org-privileges.ts @@ -42,30 +42,23 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - let outcome: boolean; - if (options.name) { - printMessage( - `Importing organization privileges config for "${options.name}"` - ); - outcome = await configManagerImportOrgPrivilegesByName(options.name); - } else { - printMessage( - 'Importing organization privileges config to all realms' - ); - outcome = await configManagerImportOrgPrivilegesAllRealms(); - } - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + if (options.name) { printMessage( - 'Unrecognized combination of options or no options...', - 'error' + `Importing organization privileges config for "${options.name}"` ); - program.help(); - process.exitCode = 1; + outcome = await configManagerImportOrgPrivilegesByName(options.name); + } else { + printMessage('Importing organization privileges config to all realms'); + outcome = await configManagerImportOrgPrivilegesAllRealms(); } + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-password-policy.ts b/src/cli/config-manager/config-manager-push/config-manager-push-password-policy.ts index cbdf12ed3..d47bfe3d3 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-password-policy.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-password-policy.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerImportPasswordPolicy } from '../../../configManagerOps/FrConfigPasswordPolicyOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -41,20 +41,15 @@ export default function setup() { if (options.realm) { realm = options.realm; } - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing config entity password-policy'); - const outcome = await configManagerImportPasswordPolicy(realm); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Importing config entity password-policy'); + const outcome = await configManagerImportPasswordPolicy(realm); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-schedules.ts b/src/cli/config-manager/config-manager-push/config-manager-push-schedules.ts index c16b9e417..bc55adf4d 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-schedules.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-schedules.ts @@ -3,7 +3,7 @@ import { Option } from 'commander'; import { configManagerImportSchedules } from '../../../configManagerOps/FrConfigSchedulesOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -38,20 +38,19 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing schedules'); - const outcome = await configManagerImportSchedules(options.name); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.name) { + verboseMessage(`Importing schedule with name "${options.name}"`); + } else { + verboseMessage('Importing all schedules'); } + const outcome = await configManagerImportSchedules(options.name); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-service-objects.ts b/src/cli/config-manager/config-manager-push/config-manager-push-service-objects.ts index 04e64bba8..6fdea5ef5 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-service-objects.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-service-objects.ts @@ -32,13 +32,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing service objects...'); - const outcome = await configManagerImportServiceObjects(); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Importing service objects...'); + const outcome = await configManagerImportServiceObjects(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-terms-and-conditions.ts b/src/cli/config-manager/config-manager-push/config-manager-push-terms-and-conditions.ts index 690c2c94b..a5773e851 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-terms-and-conditions.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-terms-and-conditions.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerImportTermsAndConditions } from '../../../configManagerOps/FrConfigTermsAndConditionsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Exporting config entity ui-configuration'); - const outcome = await configManagerImportTermsAndConditions(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Exporting config entity ui-configuration'); + const outcome = await configManagerImportTermsAndConditions(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-themes.ts b/src/cli/config-manager/config-manager-push/config-manager-push-themes.ts index 0ecb48eca..c9e1fc6f2 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-themes.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-themes.ts @@ -2,7 +2,7 @@ import { frodo } from '@rockcarver/frodo-lib'; import { configManagerImportThemes } from '../../../configManagerOps/FrConfigThemeOps'; import { getTokens } from '../../../ops/AuthenticateOps'; -import { printMessage, verboseMessage } from '../../../utils/Console'; +import { verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = @@ -32,20 +32,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing themes'); - const outcome = await configManagerImportThemes(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Importing themes'); + const outcome = await configManagerImportThemes(); + if (!outcome) process.exitCode = 1; }); return program; } diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-ui-config.ts b/src/cli/config-manager/config-manager-push/config-manager-push-ui-config.ts index 62aa7d132..4af436b6c 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push-ui-config.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push-ui-config.ts @@ -32,15 +32,15 @@ export default function setup() { command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Importing UI configuration...'); - const outcome = await configManagerImportUiConfig(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Importing UI configuration...'); + const outcome = await configManagerImportUiConfig(); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/config/config-delete.ts b/src/cli/config/config-delete.ts index 2664548a9..3282c4052 100644 --- a/src/cli/config/config-delete.ts +++ b/src/cli/config/config-delete.ts @@ -37,7 +37,10 @@ export default function setup() { options, command ); - if (await getTokens()) { + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/config/config-describe.ts b/src/cli/config/config-describe.ts index c018e98db..3cfd43909 100644 --- a/src/cli/config/config-describe.ts +++ b/src/cli/config/config-describe.ts @@ -20,7 +20,9 @@ export default function setup() { options, command ); - if (await getTokens()) { + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/config/config-export.ts b/src/cli/config/config-export.ts index f3ab91426..66162e997 100644 --- a/src/cli/config/config-export.ts +++ b/src/cli/config/config-export.ts @@ -153,10 +153,24 @@ export default function setup() { options, command ); + + if (!options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + // --all -a - if (options.all && (await getTokens())) { + if (options.all) { verboseMessage('Exporting everything to a single file...'); - const outcome = await exportEverythingToFile( + outcome = await exportEverythingToFile( options.file, options.metadata, options.modifiedProperties, @@ -172,7 +186,6 @@ export default function setup() { onlyGlobal: options.globalOnly, } ); - if (!outcome) process.exitCode = 1; } // require --directory -D for all-separate function else if (options.allSeparate && !state.getDirectory()) { @@ -180,13 +193,13 @@ export default function setup() { '-D or --directory required when using -A or --all-separate', 'error' ); - program.help(); process.exitCode = 1; + program.help(); } // --all-separate -A - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Exporting everything to separate files...'); - const outcome = await exportEverythingToFiles( + outcome = await exportEverythingToFiles( options.extract, options.separateMappings, options.separateObjects, @@ -204,16 +217,8 @@ export default function setup() { onlyGlobal: options.globalOnly, } ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/config/config-import.ts b/src/cli/config/config-import.ts index a999b50c3..dd0aae903 100644 --- a/src/cli/config/config-import.ts +++ b/src/cli/config/config-import.ts @@ -112,16 +112,30 @@ export default function setup() { options, command ); + + if (!options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + // Require --file -f for all function if (options.all && !options.file) { printMessage('-f or --file required when using -a or --all', 'error'); - program.help(); process.exitCode = 1; + program.help(); } // --all -a - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Exporting everything from a single file...'); - const outcome = await importEverythingFromFile(options.file, { + outcome = await importEverythingFromFile(options.file, { reUuidJourneys: options.reUuidJourneys, reUuidScripts: options.reUuidScripts, reUuidCustomNodes: options.reUuidCustomNodes, @@ -130,7 +144,6 @@ export default function setup() { includeActiveValues: options.includeActiveValues, source: options.source, }); - if (!outcome) process.exitCode = 1; } // require --directory -D for all-separate function else if (options.allSeparate && !state.getDirectory()) { @@ -138,13 +151,13 @@ export default function setup() { '-D or --directory required when using -A or --all-separate', 'error' ); - program.help(); process.exitCode = 1; + program.help(); } // --all-separate -A - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Importing everything from separate files...'); - const outcome = await importEverythingFromFiles({ + outcome = await importEverythingFromFiles({ reUuidJourneys: options.reUuidJourneys, reUuidScripts: options.reUuidScripts, reUuidCustomNodes: options.reUuidCustomNodes, @@ -153,34 +166,21 @@ export default function setup() { includeActiveValues: options.includeActiveValues, source: options.source, }); - if (!outcome) process.exitCode = 1; } // Import entity from file - else if (options.file && (await getTokens())) { + else if (options.file) { verboseMessage('Importing config entity from file...'); - const outcome = await importEntityfromFile( - options.file, - options.global, - { - reUuidJourneys: options.reUuidJourneys, - reUuidScripts: options.reUuidScripts, - reUuidCustomNodes: options.reUuidCustomNodes, - cleanServices: options.clean, - includeDefault: options.default, - includeActiveValues: options.includeActiveValues, - source: options.source, - } - ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; + outcome = await importEntityfromFile(options.file, options.global, { + reUuidJourneys: options.reUuidJourneys, + reUuidScripts: options.reUuidScripts, + reUuidCustomNodes: options.reUuidCustomNodes, + cleanServices: options.clean, + includeDefault: options.default, + includeActiveValues: options.includeActiveValues, + source: options.source, + }); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/config/config-list.ts b/src/cli/config/config-list.ts index 789cadb57..192f29c01 100644 --- a/src/cli/config/config-list.ts +++ b/src/cli/config/config-list.ts @@ -22,7 +22,9 @@ export default function setup() { options, command ); - if (await getTokens()) { + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/dcc/dcc-session-abort.ts b/src/cli/dcc/dcc-session-abort.ts index 45201cd39..beecf6393 100644 --- a/src/cli/dcc/dcc-session-abort.ts +++ b/src/cli/dcc/dcc-session-abort.ts @@ -45,12 +45,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - const outcome = await abortDirectConfigurationSession(options.json); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + const outcome = await abortDirectConfigurationSession(options.json); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/dcc/dcc-session-apply.ts b/src/cli/dcc/dcc-session-apply.ts index 3843594bc..6afe56469 100644 --- a/src/cli/dcc/dcc-session-apply.ts +++ b/src/cli/dcc/dcc-session-apply.ts @@ -45,12 +45,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - const outcome = await applyDirectConfigurationSession(options.json); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + const outcome = await applyDirectConfigurationSession(options.json); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/dcc/dcc-session-init.ts b/src/cli/dcc/dcc-session-init.ts index f6c659ce2..49882175d 100644 --- a/src/cli/dcc/dcc-session-init.ts +++ b/src/cli/dcc/dcc-session-init.ts @@ -45,12 +45,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - const outcome = await initDirectConfigurationSession(options.json); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + const outcome = await initDirectConfigurationSession(options.json); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/dcc/dcc-session-state.ts b/src/cli/dcc/dcc-session-state.ts index 0abb7a5bf..c5c314ff6 100644 --- a/src/cli/dcc/dcc-session-state.ts +++ b/src/cli/dcc/dcc-session-state.ts @@ -45,14 +45,14 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - const outcome = await readDirectConfigurationSessionState( - options.json - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + const outcome = await readDirectConfigurationSessionState(options.json); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/email/email-template-delete.ts b/src/cli/email/email-template-delete.ts index b12a4a62b..32c8fa208 100644 --- a/src/cli/email/email-template-delete.ts +++ b/src/cli/email/email-template-delete.ts @@ -36,26 +36,27 @@ export default function setup() { options, command ); + + if (!options.templateId && !options.all) { + printMessage('Unrecognized combination of options or no options...'); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; // delete by id - if (options.templateId && (await getTokens())) { + if (options.templateId) { verboseMessage('Deleting email template...'); - const outcome = await deleteEmailTemplateById(options.templateId); - if (!outcome) process.exitCode = 1; + outcome = await deleteEmailTemplateById(options.templateId); } // --all -a - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Deleting all email templates...'); - const outcome = await deleteAllEmailTemplates(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; + outcome = await deleteAllEmailTemplates(); } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; diff --git a/src/cli/email/email-template-export.ts b/src/cli/email/email-template-export.ts index d3bfb6ce0..dc172ea7d 100644 --- a/src/cli/email/email-template-export.ts +++ b/src/cli/email/email-template-export.ts @@ -68,55 +68,46 @@ export default function setup() { options, command ); + if (!options.templateId && !options.all && !options.allSeparate) { + printMessage('Unrecognized combination of options or no options...'); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; // export by id/name - if ( - options.templateId && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.templateId) { verboseMessage( `Exporting email template "${ options.templateId }" from realm "${state.getRealm()}"...` ); - const outcome = await exportEmailTemplateToFile( + outcome = await exportEmailTemplateToFile( options.templateId, options.file, options.metadata ); - if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage('Exporting all email templates to a single file...'); - const outcome = await exportEmailTemplatesToFile( + outcome = await exportEmailTemplatesToFile( options.file, options.metadata ); - if (!outcome) process.exitCode = 1; } // --all-separate -A - else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate) { verboseMessage('Exporting all email templates to separate files...'); - const outcome = await exportEmailTemplatesToFiles(options.metadata); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; + outcome = await exportEmailTemplatesToFiles(options.metadata); } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; diff --git a/src/cli/email/email-template-import.ts b/src/cli/email/email-template-import.ts index ddab7e241..415eca3f6 100644 --- a/src/cli/email/email-template-import.ts +++ b/src/cli/email/email-template-import.ts @@ -64,69 +64,58 @@ export default function setup() { options, command ); - // import by id if ( - options.file && - options.templateId && - (await getTokens(false, true, deploymentTypes)) + !options.templateId && + !options.all && + !options.allSeparate && + !options.file ) { + printMessage('Unrecognized combination of options or no options...'); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + // import by id + if (options.file && options.templateId) { verboseMessage(`Importing email template "${options.templateId}"...`); - const outcome = await importEmailTemplateFromFile( + outcome = await importEmailTemplateFromFile( options.templateId, options.file, options.raw ); - if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all && options.file) { verboseMessage( `Importing all email templates from a single file (${options.file})...` ); - const outcome = await importEmailTemplatesFromFile(options.file); - if (!outcome) process.exitCode = 1; + outcome = await importEmailTemplatesFromFile(options.file); } // --all-separate -A - else if ( - options.allSeparate && - !options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate && !options.file) { verboseMessage( 'Importing all email templates from separate files (*.template.email.json) in current directory...' ); - const outcome = await importEmailTemplatesFromFiles(options.raw); - if (!outcome) process.exitCode = 1; + outcome = await importEmailTemplatesFromFiles(options.raw); } // import first template from file - else if ( - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.file) { verboseMessage( `Importing first email template from file "${options.file}"...` ); - const outcome = await importFirstEmailTemplateFromFile( + outcome = await importFirstEmailTemplateFromFile( options.file, options.raw ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } - // end program logic inside action handler ); return program; diff --git a/src/cli/email/email-template-list.ts b/src/cli/email/email-template-list.ts index 086ba8a18..df99d2358 100644 --- a/src/cli/email/email-template-list.ts +++ b/src/cli/email/email-template-list.ts @@ -37,13 +37,15 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage(`Listing email templates ...`); - const outcome = await listEmailTemplates(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Listing email templates ...`); + const outcome = await listEmailTemplates(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/esv/esv-apply.ts b/src/cli/esv/esv-apply.ts index 263f5b8bb..0f74a2d8d 100644 --- a/src/cli/esv/esv-apply.ts +++ b/src/cli/esv/esv-apply.ts @@ -56,61 +56,61 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - const updates = await checkForUpdates(); - const updatesTable = createTable([ - 'Type', - 'Name', - 'Modified', - 'Modifier', - ]); - for (const secret of updates.secrets) { - if (!secret['loaded']) { - updatesTable.push([ - 'secret', - secret['_id'], - new Date(secret['lastChangeDate']).toLocaleString(), - // eslint-disable-next-line no-await-in-loop - await resolveUserName('teammember', secret['lastChangedBy']), - ]); - } - } - for (const variable of updates.variables) { - if (!variable['loaded']) { - updatesTable.push([ - 'variable', - variable['_id'], - new Date(variable['lastChangeDate']).toLocaleString(), - // eslint-disable-next-line no-await-in-loop - await resolveUserName('teammember', variable['lastChangedBy']), - ]); - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + const updates = await checkForUpdates(); + const updatesTable = createTable([ + 'Type', + 'Name', + 'Modified', + 'Modifier', + ]); + for (const secret of updates.secrets) { + if (!secret['loaded']) { + updatesTable.push([ + 'secret', + secret['_id'], + new Date(secret['lastChangeDate']).toLocaleString(), + // eslint-disable-next-line no-await-in-loop + await resolveUserName('teammember', secret['lastChangedBy']), + ]); } - if (updatesTable.length > 0) { - printMessage(updatesTable.toString(), 'data'); + } + for (const variable of updates.variables) { + if (!variable['loaded']) { + updatesTable.push([ + 'variable', + variable['_id'], + new Date(variable['lastChangeDate']).toLocaleString(), + // eslint-disable-next-line no-await-in-loop + await resolveUserName('teammember', variable['lastChangedBy']), + ]); } - if (!options.checkOnly) { - if ( - updates.secrets?.length || - updates.variables?.length || - options.force - ) { - const ok = - options.yes || - (await yesno({ - question: `\nChanges may take up to 10 minutes to propagate, during which time you will not be able to make further updates.\n\nApply updates? (y|n):`, - })); - if (ok) { - if ( - !(await applyUpdates(options.wait, options.timeout * 1000)) - ) { - process.exitCode = 1; - } + } + if (updatesTable.length > 0) { + printMessage(updatesTable.toString(), 'data'); + } + if (!options.checkOnly) { + if ( + updates.secrets?.length || + updates.variables?.length || + options.force + ) { + const ok = + options.yes || + (await yesno({ + question: `\nChanges may take up to 10 minutes to propagate, during which time you will not be able to make further updates.\n\nApply updates? (y|n):`, + })); + if (ok) { + if (!(await applyUpdates(options.wait, options.timeout * 1000))) { + process.exitCode = 1; } } } - } else { - process.exitCode = 1; } } // end command logic inside action handler diff --git a/src/cli/esv/esv-secret-create.ts b/src/cli/esv/esv-secret-create.ts index 9bdc819ed..e50f8c6e5 100644 --- a/src/cli/esv/esv-secret-create.ts +++ b/src/cli/esv/esv-secret-create.ts @@ -49,32 +49,35 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Creating secret...'); - let outcome = null; - if (options.value) { - outcome = await createSecret( - options.secretId, - options.value, - options.description, - options.encoding, - options.useInPlaceholders - ); - } else { - outcome = await createSecretFromFile( - options.secretId, - options.file, - options.description, - options.encoding, - options.useInPlaceholders - ); - } - if (!outcome) process.exitCode = 1; + + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage('Creating secret...'); + let outcome = null; + if (options.value) { + outcome = await createSecret( + options.secretId, + options.value, + options.description, + options.encoding, + options.useInPlaceholders + ); } else { - process.exitCode = 1; + outcome = await createSecretFromFile( + options.secretId, + options.file, + options.description, + options.encoding, + options.useInPlaceholders + ); } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; diff --git a/src/cli/esv/esv-secret-delete.ts b/src/cli/esv/esv-secret-delete.ts index fe761365f..06826f1c5 100644 --- a/src/cli/esv/esv-secret-delete.ts +++ b/src/cli/esv/esv-secret-delete.ts @@ -38,31 +38,34 @@ export default function setup() { options, command ); + if (!options.secretId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + // delete by id - if ( - options.secretId && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.secretId) { verboseMessage('Deleting secret...'); - const outcome = await deleteSecret(options.secretId); - if (!outcome) process.exitCode = 1; + outcome = await deleteSecret(options.secretId); } // --all -a - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage('Deleting all secrets...'); - const outcome = await deleteSecrets(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - process.exitCode = 1; + outcome = await deleteSecrets(); } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; diff --git a/src/cli/esv/esv-secret-describe.ts b/src/cli/esv/esv-secret-describe.ts index 9b409008d..aac7c2a29 100644 --- a/src/cli/esv/esv-secret-describe.ts +++ b/src/cli/esv/esv-secret-describe.ts @@ -48,10 +48,21 @@ export default function setup() { options, command ); - if ( - options.secretId && - (await getTokens(false, true, deploymentTypes)) - ) { + if (!options.secretId) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options.secretId) { verboseMessage(`Describing secret ${options.secretId}...`); const outcome = await describeSecret( options.secretId, @@ -61,17 +72,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/esv/esv-secret-export.ts b/src/cli/esv/esv-secret-export.ts index 57da05c80..c1f913bb2 100644 --- a/src/cli/esv/esv-secret-export.ts +++ b/src/cli/esv/esv-secret-export.ts @@ -100,16 +100,30 @@ export default function setup() { options, command ); - if ( - options.secretId && - (await getTokens(false, true, deploymentTypes)) - ) { + + if (!options.secretId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + return; + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + + if (options.secretId) { verboseMessage( `Exporting secret "${ options.secretId }" from realm "${state.getRealm()}"...` ); - const outcome = await exportSecretToFile( + outcome = await exportSecretToFile( options.secretId, options.file, options.metadata, @@ -117,41 +131,26 @@ export default function setup() { options.includeActiveValues, options.target ); - if (!outcome) process.exitCode = 1; - } else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + } else if (options.all) { verboseMessage('Exporting all secrets to a single file...'); - const outcome = await exportSecretsToFile( + outcome = await exportSecretsToFile( options.file, options.metadata, options.modifiedProperties, options.includeActiveValues, options.target ); - if (!outcome) process.exitCode = 1; - } else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + } else if (options.allSeparate) { verboseMessage('Exporting all secrets to separate files...'); - const outcome = await exportSecretsToFiles( + outcome = await exportSecretsToFiles( options.metadata, options.modifiedProperties, options.includeActiveValues, options.target ); - if (!outcome) process.exitCode = 1; - } else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; diff --git a/src/cli/esv/esv-secret-import.ts b/src/cli/esv/esv-secret-import.ts index 48e2523a2..c4c71dfe7 100644 --- a/src/cli/esv/esv-secret-import.ts +++ b/src/cli/esv/esv-secret-import.ts @@ -87,73 +87,72 @@ export default function setup() { options, command ); - // import + if ( - options.secretId && - (await getTokens(false, true, deploymentTypes)) + !options.secretId && + !options.all && + !options.allSeparate && + !options.file ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + + // import + if (options.secretId) { printMessage(`Importing secret ${options.secretId}...`); - const outcome = await importSecretFromFile( + outcome = await importSecretFromFile( options.secretId, options.file, options.includeActiveValues, options.source ); - if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all && options.file) { printMessage( `Importing all secrets from a single file (${options.file})...` ); - const outcome = await importSecretsFromFile( + outcome = await importSecretsFromFile( options.file, options.includeActiveValues, options.source ); - if (!outcome) process.exitCode = 1; } // --all-separate -A - else if ( - options.allSeparate && - !options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate && !options.file) { printMessage( 'Importing all secrets from separate files in working directory...' ); - const outcome = await importSecretsFromFiles( + outcome = await importSecretsFromFiles( options.includeActiveValues, options.source ); - if (!outcome) process.exitCode = 1; } // import first - else if ( - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.file) { printMessage('Importing first secret in file...'); - const outcome = await importSecretFromFile( + outcome = await importSecretFromFile( null, options.file, options.includeActiveValues, options.source ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; diff --git a/src/cli/esv/esv-secret-list.ts b/src/cli/esv/esv-secret-list.ts index 9ae408cd4..616abab5e 100644 --- a/src/cli/esv/esv-secret-list.ts +++ b/src/cli/esv/esv-secret-list.ts @@ -47,17 +47,19 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Listing secrets...'); - const outcome = await listSecrets( - options.long, - options.usage, - options.file - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Listing secrets...'); + const outcome = await listSecrets( + options.long, + options.usage, + options.file + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/esv/esv-secret-set.ts b/src/cli/esv/esv-secret-set.ts index a62ab88a1..fb31da6a2 100644 --- a/src/cli/esv/esv-secret-set.ts +++ b/src/cli/esv/esv-secret-set.ts @@ -31,16 +31,18 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Setting secret description...'); - const outcome = await setSecretDescription( - options.secretId, - options.description - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Setting secret description...'); + const outcome = await setSecretDescription( + options.secretId, + options.description + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/esv/esv-secret-version-activate.ts b/src/cli/esv/esv-secret-version-activate.ts index 07bdb7617..0460cf44e 100644 --- a/src/cli/esv/esv-secret-version-activate.ts +++ b/src/cli/esv/esv-secret-version-activate.ts @@ -31,12 +31,23 @@ export default function setup() { options, command ); + if (!options.secretId && !options.version) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + // activate by id - if ( - options.secretId && - options.version && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.secretId && options.version) { verboseMessage(`Activating version of secret...`); const outcome = await activateVersionOfSecret( options.secretId, @@ -44,13 +55,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/esv/esv-secret-version-create.ts b/src/cli/esv/esv-secret-version-create.ts index 87da609c8..002d1b56c 100644 --- a/src/cli/esv/esv-secret-version-create.ts +++ b/src/cli/esv/esv-secret-version-create.ts @@ -40,24 +40,26 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Creating new version of secret...'); - let outcome = null; - if (options.value) { - outcome = await createVersionOfSecret( - options.secretId, - options.value - ); - } else { - outcome = await createVersionOfSecretFromFile( - options.secretId, - options.file - ); - } - if (!outcome) process.exitCode = 1; + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Creating new version of secret...'); + let outcome: boolean = null; + if (options.value) { + outcome = await createVersionOfSecret( + options.secretId, + options.value + ); } else { - process.exitCode = 1; + outcome = await createVersionOfSecretFromFile( + options.secretId, + options.file + ); } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/esv/esv-secret-version-deactivate.ts b/src/cli/esv/esv-secret-version-deactivate.ts index 7393805a7..c391df842 100644 --- a/src/cli/esv/esv-secret-version-deactivate.ts +++ b/src/cli/esv/esv-secret-version-deactivate.ts @@ -31,12 +31,22 @@ export default function setup() { options, command ); + if (!options.secretId && !options.version) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); // activate by id - if ( - options.secretId && - options.version && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.secretId && options.version) { verboseMessage(`Deactivating version of secret...`); const outcome = await deactivateVersionOfSecret( options.secretId, @@ -44,13 +54,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/esv/esv-secret-version-delete.ts b/src/cli/esv/esv-secret-version-delete.ts index b436c3052..9aa985a65 100644 --- a/src/cli/esv/esv-secret-version-delete.ts +++ b/src/cli/esv/esv-secret-version-delete.ts @@ -39,32 +39,39 @@ export default function setup() { options, command ); + if (!options.secretId && !options.version) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + // delete by id - if ( - options.secretId && - options.version && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.secretId && options.version) { verboseMessage(`Deleting version of secret...`); - const outcome = await deleteVersionOfSecret( + outcome = await deleteVersionOfSecret( options.secretId, options.version ); - if (!outcome) process.exitCode = 1; } + if (!outcome) process.exitCode = 1; + // --all -a // else if (options.all && (await getTokens(false, true, deploymentTypes))) { // printMessage('Deleting all versions...'); - // const outcome = deleteJourneys(options); + // outcome = deleteJourneys(options); // if (!outcome) process.exitCode = 1; // } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/esv/esv-secret-version-list.ts b/src/cli/esv/esv-secret-version-list.ts index eec8e5c2e..8f97b9595 100644 --- a/src/cli/esv/esv-secret-version-list.ts +++ b/src/cli/esv/esv-secret-version-list.ts @@ -33,13 +33,15 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Listing versions...'); - const outcome = await listSecretVersions(options.secretId); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Listing versions...'); + const outcome = await listSecretVersions(options.secretId); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/esv/esv-variable-create.ts b/src/cli/esv/esv-variable-create.ts index a1bb7f958..9b1ffd9f7 100644 --- a/src/cli/esv/esv-variable-create.ts +++ b/src/cli/esv/esv-variable-create.ts @@ -61,18 +61,20 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Creating variable...'); - const outcome = await createVariable( - options.variableId, - options.value, - options.description, - options.variableType - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Creating variable...'); + const outcome = await createVariable( + options.variableId, + options.value, + options.description, + options.variableType + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/esv/esv-variable-delete.ts b/src/cli/esv/esv-variable-delete.ts index 312980b52..6e04c1c00 100644 --- a/src/cli/esv/esv-variable-delete.ts +++ b/src/cli/esv/esv-variable-delete.ts @@ -50,32 +50,34 @@ export default function setup() { options, command ); + if (!options.variableId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + // delete by id - if ( - options.variableId && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.variableId) { verboseMessage('Deleting variable...'); - const outcome = await deleteVariableById(options.variableId); - if (!outcome) process.exitCode = 1; + outcome = await deleteVariableById(options.variableId); } // --all -a - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage('Deleting all variables...'); - const outcome = await deleteVariables(); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; + outcome = await deleteVariables(); } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; diff --git a/src/cli/esv/esv-variable-describe.ts b/src/cli/esv/esv-variable-describe.ts index 6fb665d7a..8079215e5 100644 --- a/src/cli/esv/esv-variable-describe.ts +++ b/src/cli/esv/esv-variable-describe.ts @@ -48,10 +48,22 @@ export default function setup() { options, command ); - if ( - options.variableId && - (await getTokens(false, true, deploymentTypes)) - ) { + if (!options.variableId) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options.variableId) { verboseMessage(`Describing variable ${options.variableId}...`); const outcome = await describeVariable( options.variableId, @@ -61,17 +73,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/esv/esv-variable-export.ts b/src/cli/esv/esv-variable-export.ts index 9cfbea576..95014c6ae 100644 --- a/src/cli/esv/esv-variable-export.ts +++ b/src/cli/esv/esv-variable-export.ts @@ -70,16 +70,29 @@ export default function setup() { options, command ); - if ( - options.variableId && - (await getTokens(false, true, deploymentTypes)) - ) { + if (!options.variableId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + + if (options.variableId) { verboseMessage( `Exporting variable "${ options.variableId }" from realm "${state.getRealm()}"...` ); - const outcome = await exportVariableToFile( + outcome = await exportVariableToFile( options.variableId, options.file, options.decode, @@ -87,39 +100,25 @@ export default function setup() { options.modifiedProperties ); if (!outcome) process.exitCode = 1; - } else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + } else if (options.all) { verboseMessage('Exporting all variables to a single file...'); - const outcome = await exportVariablesToFile( + outcome = await exportVariablesToFile( options.file, options.decode, options.metadata, options.modifiedProperties ); if (!outcome) process.exitCode = 1; - } else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + } else if (options.allSeparate) { verboseMessage('Exporting all variables to separate files...'); - const outcome = await exportVariablesToFiles( + outcome = await exportVariablesToFiles( options.decode, options.metadata, options.modifiedProperties ); - if (!outcome) process.exitCode = 1; - } else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; diff --git a/src/cli/esv/esv-variable-import.ts b/src/cli/esv/esv-variable-import.ts index b024dc75f..6498aa22f 100644 --- a/src/cli/esv/esv-variable-import.ts +++ b/src/cli/esv/esv-variable-import.ts @@ -52,59 +52,56 @@ export default function setup() { options, command ); - // import if ( - options.variableId && - (await getTokens(false, true, deploymentTypes)) + !options.variableId && + !options.all && + !options.allSeparate && + !options.file ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + + // import + if (options.variableId) { printMessage(`Importing variable ${options.variableId}...`); - const outcome = await importVariableFromFile( + outcome = await importVariableFromFile( options.variableId, options.file ); - if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all && options.file) { printMessage( `Importing all variables from a single file (${options.file})...` ); - const outcome = await importVariablesFromFile(options.file); - if (!outcome) process.exitCode = 1; + outcome = await importVariablesFromFile(options.file); } // --all-separate -A - else if ( - options.allSeparate && - !options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate && !options.file) { printMessage( 'Importing all variables from separate files in working directory...' ); - const outcome = await importVariablesFromFiles(); - if (!outcome) process.exitCode = 1; + outcome = await importVariablesFromFiles(); } // import first - else if ( - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.file) { printMessage('Importing first variable in file...'); - const outcome = await importVariableFromFile(null, options.file); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; + outcome = await importVariableFromFile(null, options.file); } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; diff --git a/src/cli/esv/esv-variable-list.ts b/src/cli/esv/esv-variable-list.ts index cd727e788..0e6931cc8 100644 --- a/src/cli/esv/esv-variable-list.ts +++ b/src/cli/esv/esv-variable-list.ts @@ -47,17 +47,19 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Listing variables...'); - const outcome = await listVariables( - options.long, - options.usage, - options.file - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Listing variables...'); + const outcome = await listVariables( + options.long, + options.usage, + options.file + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/esv/esv-variable-set.ts b/src/cli/esv/esv-variable-set.ts index e5b909b57..0dbea5b3a 100644 --- a/src/cli/esv/esv-variable-set.ts +++ b/src/cli/esv/esv-variable-set.ts @@ -34,41 +34,38 @@ export default function setup() { options, command ); - if ( - options.variableId && - options.value && - options.description && - (await getTokens(false, true, deploymentTypes)) - ) { + if (!options.variableId && !options.value && !options.description) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + + if (options.variableId && options.value && options.description) { verboseMessage('Updating variable...'); - const outcome = await updateVariable( + outcome = await updateVariable( options.variableId, options.value, options.description ); - if (!outcome) process.exitCode = 1; - } else if ( - options.variableId && - options.description && - (await getTokens(false, true, deploymentTypes)) - ) { + } else if (options.variableId && options.description) { verboseMessage('Updating variable...'); - const outcome = await setVariableDescription( + outcome = await setVariableDescription( options.variableId, options.description ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Provide --variable-id and either one or both of --value and --description.' - ); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; diff --git a/src/cli/idm/idm-count.ts b/src/cli/idm/idm-count.ts index b69d4a76c..723ff721f 100644 --- a/src/cli/idm/idm-count.ts +++ b/src/cli/idm/idm-count.ts @@ -36,15 +36,15 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage( - `Counting managed ${options.managedObject} objects...` - ); - const outcome = await countManagedObjects(options.managedObject); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Counting managed ${options.managedObject} objects...`); + const outcome = await countManagedObjects(options.managedObject); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/idm/idm-delete.ts b/src/cli/idm/idm-delete.ts index 4f5c779fa..7bf08c22e 100644 --- a/src/cli/idm/idm-delete.ts +++ b/src/cli/idm/idm-delete.ts @@ -2,6 +2,7 @@ import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; import { deleteConfigEntityById } from '../../ops/IdmOps'; +import { printMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -40,13 +41,20 @@ export default function setup() { ); // const globalConfig = options.global ?? false; + if (!options.id) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } - if (options.id && (await getTokens())) { + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + if (options.id) { const outcome = await deleteConfigEntityById(options.id); if (!outcome) process.exitCode = 1; - } else { - program.help(); - process.exitCode = 1; } } ); diff --git a/src/cli/idm/idm-export.ts b/src/cli/idm/idm-export.ts index 045b5b63c..310c07604 100644 --- a/src/cli/idm/idm-export.ts +++ b/src/cli/idm/idm-export.ts @@ -84,6 +84,21 @@ export default function setup() { options, command ); + if (!options.entityId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + const entitiesMessage = options.entitiesFile ? ` specified in ${options.entitiesFile}` : ''; @@ -95,10 +110,7 @@ export default function setup() { ? ` into separate files in ${state.getDirectory()}` : ''; // export by id/name - if ( - options.entityId && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.entityId) { verboseMessage( `Exporting object "${options.entityId}"${envMessage}${fileMessage}...` ); @@ -112,10 +124,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; // --all -a - } else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + } else if (options.all) { verboseMessage( `Exporting IDM configuration objects${entitiesMessage}${envMessage}${fileMessage}...` ); @@ -134,14 +143,11 @@ export default function setup() { '-D or --directory required when using -A or --all-separate', 'error' ); - program.help(); process.exitCode = 1; + program.help(); } // --all-separate -A - else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate) { verboseMessage( `Exporting IDM configuration objects${entitiesMessage}${envMessage}${directoryMessage}...` ); @@ -155,17 +161,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; await warnAboutOfflineConnectorServers(); } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/idm/idm-import.ts b/src/cli/idm/idm-import.ts index 967e66d0c..1bdb298cf 100644 --- a/src/cli/idm/idm-import.ts +++ b/src/cli/idm/idm-import.ts @@ -83,6 +83,26 @@ export default function setup() { options, command ); + if ( + !options.entityId && + !options.file && + !options.all && + !options.allSeparate + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + const entitiesMessage = options.entitiesFile ? ` specified in ${options.entitiesFile}` : ''; @@ -94,10 +114,7 @@ export default function setup() { ? ` from separate files in ${state.getDirectory()}` : ''; // import by id/name - if ( - options.entityId && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.entityId) { verboseMessage( `Importing object "${options.entityId}"${envMessage}${fileMessage}...` ); @@ -109,11 +126,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all && options.file) { verboseMessage( `Importing IDM configuration objects${entitiesMessage}${envMessage}${fileMessage}` ); @@ -125,10 +138,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // import from file - else if ( - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.file) { verboseMessage( `Importing first object${envMessage}${fileMessage}...` ); @@ -144,14 +154,11 @@ export default function setup() { '-D or --directory required when using -A or --all-separate', 'error' ); - program.help(); process.exitCode = 1; + program.help(); } // --all-separate -A - else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate) { verboseMessage( `Importing IDM configuration objects${entitiesMessage}${envMessage}${directoryMessage}` ); @@ -161,17 +168,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/idm/idm-list.ts b/src/cli/idm/idm-list.ts index 58cc2c315..129c31332 100644 --- a/src/cli/idm/idm-list.ts +++ b/src/cli/idm/idm-list.ts @@ -35,14 +35,16 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage('Listing all IDM configuration objects...'); - const outcome = await listAllConfigEntities(); - if (!outcome) process.exitCode = 1; - await warnAboutOfflineConnectorServers(); - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Listing all IDM configuration objects...'); + const outcome = await listAllConfigEntities(); + if (!outcome) process.exitCode = 1; + await warnAboutOfflineConnectorServers(); } // end command logic inside action handler ); diff --git a/src/cli/idm/idm-schema-object-export.ts b/src/cli/idm/idm-schema-object-export.ts index f9e73a52e..7150e590f 100644 --- a/src/cli/idm/idm-schema-object-export.ts +++ b/src/cli/idm/idm-schema-object-export.ts @@ -64,6 +64,21 @@ export default function setup() { options, command ); + if (!options.individualObject && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + const envMessage = options.envFile ? ` using ${options.envFile} for variable replacement` : ''; @@ -72,10 +87,7 @@ export default function setup() { ? ` into separate files in ${state.getDirectory()}` : ''; // -i, --individual-object - if ( - options.individualObject && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.individualObject) { verboseMessage( `Exporting managed object "${options.individualObject}"${envMessage}${fileMessage}...` ); @@ -86,10 +98,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } // -a, --all - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage( `Exporting managed objects ${envMessage}${fileMessage}...` ); @@ -103,10 +112,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } // -A, --all-separate - else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate) { verboseMessage( `Exporting managed objects ${envMessage}${directoryMessage}...` ); @@ -120,17 +126,8 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; await warnAboutOfflineConnectorServers(); - } // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; } } - // end command logic inside action handler ); return program; diff --git a/src/cli/idm/idm-schema-object-import.ts b/src/cli/idm/idm-schema-object-import.ts index 251c87157..f8cbbd67f 100644 --- a/src/cli/idm/idm-schema-object-import.ts +++ b/src/cli/idm/idm-schema-object-import.ts @@ -46,6 +46,13 @@ export default function setup() { options, command ); + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + const envMessage = options.envFile ? ` using ${options.envFile} for variable replacement` : ''; @@ -60,14 +67,10 @@ export default function setup() { '-D, --directory or -f, --file required to import managed objects', 'error' ); - program.help(); process.exitCode = 1; + program.help(); } // -i, --individual-object - else if ( - options.individualObject && - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.individualObject && options.file) { verboseMessage( `Importing managed object ${envMessage}${fileMessage}...` ); @@ -77,10 +80,7 @@ export default function setup() { options.envFile ); if (!outcome) process.exitCode = 1; - } else if ( - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + } else if (options.file) { verboseMessage( `Importing IDM configuration objects ${envMessage}${fileMessage}` ); @@ -90,10 +90,7 @@ export default function setup() { options.envFile ); if (!outcome) process.exitCode = 1; - } else if ( - state.getDirectory() && - (await getTokens(false, true, deploymentTypes)) - ) { + } else if (state.getDirectory()) { verboseMessage( `Importing IDM configuration objects ${envMessage}${directoryMessage}` ); @@ -103,17 +100,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/idp/idp-delete.ts b/src/cli/idp/idp-delete.ts index 9a6565801..3828aa337 100644 --- a/src/cli/idp/idp-delete.ts +++ b/src/cli/idp/idp-delete.ts @@ -23,22 +23,23 @@ export default function setup() { options, command ); - if ((await getTokens()) && options.idpId) { - verboseMessage( - `Deleting idp ${options.idpId} in realm "${state.getRealm()}"...` - ); - const outcome = await deleteSocialIdentityProviderById(options.idpId); - if (!outcome) process.exitCode = 1; - } else { + if (!options.idpId) { printMessage( 'Unrecognized combination of options or no options...', 'error' ); - program.help(); process.exitCode = 1; + program.help(); } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage( + `Deleting idp ${options.idpId} in realm "${state.getRealm()}"...` + ); + const outcome = await deleteSocialIdentityProviderById(options.idpId); + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; diff --git a/src/cli/idp/idp-export.ts b/src/cli/idp/idp-export.ts index 50ded2e85..12fb7fccb 100644 --- a/src/cli/idp/idp-export.ts +++ b/src/cli/idp/idp-export.ts @@ -56,46 +56,48 @@ export default function setup() { options, command ); + if (!options.idpId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; + // export by id/name - if (options.idpId && (await getTokens())) { + if (options.idpId) { verboseMessage( `Exporting provider "${ options.idpId }" from realm "${state.getRealm()}"...` ); - const outcome = await exportSocialIdentityProviderToFile( + outcome = await exportSocialIdentityProviderToFile( options.idpId, options.file, options.metadata ); - if (!outcome) process.exitCode = 1; } // --all -a - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Exporting all providers to a single file...'); - const outcome = await exportSocialIdentityProvidersToFile( + outcome = await exportSocialIdentityProvidersToFile( options.file, options.metadata ); - if (!outcome) process.exitCode = 1; } // --all-separate -A - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Exporting all providers to separate files...'); - const outcome = await exportSocialIdentityProvidersToFiles( + outcome = await exportSocialIdentityProvidersToFiles( options.metadata ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/idp/idp-import.ts b/src/cli/idp/idp-import.ts index 8fe05cb10..d69a1a1b1 100644 --- a/src/cli/idp/idp-import.ts +++ b/src/cli/idp/idp-import.ts @@ -54,66 +54,71 @@ export default function setup() { options, command ); + if ( + !options.idpId && + !options.all && + !options.allSeparate && + !options.file + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + let outcome: boolean; // import by id - if (options.file && options.idpId && (await getTokens())) { + if (options.file && options.idpId) { verboseMessage( `Importing provider "${ options.idpId }" into realm "${state.getRealm()}"...` ); - const outcome = await importSocialIdentityProviderFromFile( + outcome = await importSocialIdentityProviderFromFile( options.idpId, options.file, { deps: options.deps, } ); - if (!outcome) process.exitCode = 1; } // --all -a - else if (options.all && options.file && (await getTokens())) { + else if (options.all && options.file) { verboseMessage( `Importing all providers from a single file (${options.file})...` ); - const outcome = await importSocialIdentityProvidersFromFile( - options.file, - { - deps: options.deps, - } - ); - if (!outcome) process.exitCode = 1; + outcome = await importSocialIdentityProvidersFromFile(options.file, { + deps: options.deps, + }); } // --all-separate -A - else if (options.allSeparate && !options.file && (await getTokens())) { + else if (options.allSeparate && !options.file) { verboseMessage( 'Importing all providers from separate files in current directory...' ); - const outcome = await importSocialIdentityProvidersFromFiles({ + outcome = await importSocialIdentityProvidersFromFiles({ deps: options.deps, }); - if (!outcome) process.exitCode = 1; } // import first provider from file - else if (options.file && (await getTokens())) { + else if (options.file) { verboseMessage( `Importing first provider from file "${ options.file }" into realm "${state.getRealm()}"...` ); - const outcome = await importFirstSocialIdentityProviderFromFile( + outcome = await importFirstSocialIdentityProviderFromFile( options.file, { deps: options.deps, } ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/idp/idp-list.ts b/src/cli/idp/idp-list.ts index 85e0e15b1..caa431bd2 100644 --- a/src/cli/idp/idp-list.ts +++ b/src/cli/idp/idp-list.ts @@ -24,13 +24,13 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage(`Listing providers in realm "${state.getRealm()}"...`); - const outcome = await listSocialProviders(); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage(`Listing providers in realm "${state.getRealm()}"...`); + const outcome = await listSocialProviders(); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/info/info.ts b/src/cli/info/info.ts index 1b78a0216..ad24d785e 100644 --- a/src/cli/info/info.ts +++ b/src/cli/info/info.ts @@ -41,40 +41,38 @@ export default function setup() { ) .action(async (host, user, password, options, command) => { command.handleDefaultArgsAndOpts(host, user, password, options, command); - if (await getTokens()) { - const info = await getInfo(); - if (!options.scriptFriendly && !options.json) { - verboseMessage('Printing info, versions, and tokens...'); - delete info.sessionToken; - delete info.bearerToken; - const labels = { - amVersion: 'AM Version', - authenticatedSubject: 'Subject (Type)', - config_promotion_done: 'Promotion Done', - cookieName: 'Cookie Name', - deploymentType: 'Deployment Type', - host: 'Host URL', - immutable: 'Immutable', - locked: 'Locked', - placeholder_management: 'Placeholder Management', - region: 'Region', - tier: 'Tier', - }; - const table = createObjectTable(info, labels); - printMessage(`\n${table.toString()}`); - if (state.getCookieValue()) { - printMessage(`\nSession token:`, 'info'); - printMessage(`${state.getCookieValue()}`); - } - if (state.getBearerToken()) { - printMessage(`\nBearer token:`, 'info'); - printMessage(`${state.getBearerToken()}`); - } - } else { - printMessage(JSON.stringify(info, null, 2), 'data'); + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + const info = await getInfo(); + if (!options.scriptFriendly && !options.json) { + verboseMessage('Printing info, versions, and tokens...'); + delete info.sessionToken; + delete info.bearerToken; + const labels = { + amVersion: 'AM Version', + authenticatedSubject: 'Subject (Type)', + config_promotion_done: 'Promotion Done', + cookieName: 'Cookie Name', + deploymentType: 'Deployment Type', + host: 'Host URL', + immutable: 'Immutable', + locked: 'Locked', + placeholder_management: 'Placeholder Management', + region: 'Region', + tier: 'Tier', + }; + const table = createObjectTable(info, labels); + printMessage(`\n${table.toString()}`); + if (state.getCookieValue()) { + printMessage(`\nSession token:`, 'info'); + printMessage(`${state.getCookieValue()}`); + } + if (state.getBearerToken()) { + printMessage(`\nBearer token:`, 'info'); + printMessage(`${state.getBearerToken()}`); } } else { - process.exitCode = 1; + printMessage(JSON.stringify(info, null, 2), 'data'); } }); return program; diff --git a/src/cli/journey/journey-delete.ts b/src/cli/journey/journey-delete.ts index 832c8372e..8eef082cd 100644 --- a/src/cli/journey/journey-delete.ts +++ b/src/cli/journey/journey-delete.ts @@ -40,8 +40,19 @@ export default function setup() { options, command ); + if (!options.journeyId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // delete by id - if (options.journeyId && (await getTokens())) { + if (options.journeyId) { verboseMessage( `Deleting journey ${ options.journeyId @@ -51,22 +62,12 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Deleting all journeys...'); const outcome = await deleteJourneys(options); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/journey/journey-disable.ts b/src/cli/journey/journey-disable.ts index e8202da4b..ab2cb22cc 100644 --- a/src/cli/journey/journey-disable.ts +++ b/src/cli/journey/journey-disable.ts @@ -30,19 +30,24 @@ export default function setup() { options, command ); + if (!options.journeyId) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // disable - if (options.journeyId && (await getTokens())) { + if (options.journeyId) { const outcome = await disableJourney(options.journeyId); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/journey/journey-enable.ts b/src/cli/journey/journey-enable.ts index f1aef769a..5c6bec570 100644 --- a/src/cli/journey/journey-enable.ts +++ b/src/cli/journey/journey-enable.ts @@ -30,19 +30,24 @@ export default function setup() { options, command ); + if (!options.journeyId) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // enable - if (options.journeyId && (await getTokens())) { + if (options.journeyId) { const outcome = await enableJourney(options.journeyId); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/journey/journey-export.ts b/src/cli/journey/journey-export.ts index 04ec0095c..344e94889 100644 --- a/src/cli/journey/journey-export.ts +++ b/src/cli/journey/journey-export.ts @@ -82,8 +82,20 @@ export default function setup() { options, command ); + + if (!options.journeyId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // export - if (options.journeyId && (await getTokens())) { + if (options.journeyId) { verboseMessage('Exporting journey...'); const outcome = await exportJourneyToFile( options.journeyId, @@ -98,7 +110,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Exporting all journeys to a single file...'); const outcome = await exportJourneysToFile( options.file, @@ -112,7 +124,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Exporting all journeys to separate files...'); const outcome = await exportJourneysToFiles(options.metadata, { useStringArrays: options.useStringArrays, @@ -121,17 +133,7 @@ export default function setup() { }); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/journey/journey-import.ts b/src/cli/journey/journey-import.ts index 015138c0a..ed349e3f8 100644 --- a/src/cli/journey/journey-import.ts +++ b/src/cli/journey/journey-import.ts @@ -62,8 +62,24 @@ export default function setup() { options, command ); + if ( + !options.journeyId && + !options.all && + !options.file && + !options.allSeparate + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // import - if (options.journeyId && (await getTokens())) { + if (options.journeyId) { printMessage(`Importing journey ${options.journeyId}...`); const outcome = await importJourneyFromFile( options.journeyId, @@ -76,7 +92,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if (options.all && options.file && (await getTokens())) { + else if (options.all && options.file) { printMessage( `Importing all journeys from a single file (${options.file})...` ); @@ -87,7 +103,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if (options.allSeparate && !options.file && (await getTokens())) { + else if (options.allSeparate && !options.file) { printMessage( 'Importing all journeys from separate files in current directory...' ); @@ -98,7 +114,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // import first journey in file - else if (options.file && (await getTokens())) { + else if (options.file) { printMessage('Importing first journey in file...'); const outcome = await importFirstJourneyFromFile(options.file, { reUuid: options.reUuid, @@ -106,14 +122,7 @@ export default function setup() { }); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/journey/journey-list.ts b/src/cli/journey/journey-list.ts index 982f93621..4e4d52df2 100644 --- a/src/cli/journey/journey-list.ts +++ b/src/cli/journey/journey-list.ts @@ -25,13 +25,11 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage(`Listing journeys in realm "${state.getRealm()}"...`); - const outcome = await listJourneys(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Listing journeys in realm "${state.getRealm()}"...`); + const outcome = await listJourneys(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/journey/journey-prune.ts b/src/cli/journey/journey-prune.ts index 5def4a994..e89b0a400 100644 --- a/src/cli/journey/journey-prune.ts +++ b/src/cli/journey/journey-prune.ts @@ -25,27 +25,25 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage( - `Pruning orphaned configuration artifacts in realm "${state.getRealm()}"...` - ); - try { - const orphanedNodes = await findOrphanedNodes(); - if (orphanedNodes.length > 0) { - const ok = await yesno({ - question: 'Prune (permanently delete) orphaned nodes? (y|n):', - }); - if (ok) { - await removeOrphanedNodes(orphanedNodes); - } - } else { - printMessage('No orphaned nodes found.'); + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage( + `Pruning orphaned configuration artifacts in realm "${state.getRealm()}"...` + ); + try { + const orphanedNodes = await findOrphanedNodes(); + if (orphanedNodes.length > 0) { + const ok = await yesno({ + question: 'Prune (permanently delete) orphaned nodes? (y|n):', + }); + if (ok) { + await removeOrphanedNodes(orphanedNodes); } - } catch (error) { - printError(error); - process.exitCode = 1; + } else { + printMessage('No orphaned nodes found.'); } - } else { + } catch (error) { + printError(error); process.exitCode = 1; } } diff --git a/src/cli/log/log-fetch.ts b/src/cli/log/log-fetch.ts index 528fc61c5..ac174ed10 100644 --- a/src/cli/log/log-fetch.ts +++ b/src/cli/log/log-fetch.ts @@ -212,8 +212,8 @@ export default function setup() { // no log api credentials else { printMessage('No log api credentials found!'); - program.help(); process.exitCode = 1; + program.help(); } }); diff --git a/src/cli/log/log-key-delete.ts b/src/cli/log/log-key-delete.ts index 096a990c0..7ec95f3e6 100644 --- a/src/cli/log/log-key-delete.ts +++ b/src/cli/log/log-key-delete.ts @@ -39,30 +39,32 @@ export default function setup() { options, command ); + if (!options.keyId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSucessful = await getTokens( + true, + true, + deploymentTypes + ); + if (!getTokensIsSucessful) process.exit(1); + // delete by id - if (options.keyId && (await getTokens(true, true, deploymentTypes))) { + if (options.keyId) { verboseMessage(`Deleting key ${options.keyId}`); deleteLogApiKey(options.keyId); } // --all -a - else if ( - options.all && - (await getTokens(true, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage('Deleting keys...'); deleteLogApiKeys(); } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/log/log-key-describe.ts b/src/cli/log/log-key-describe.ts index 36c704420..3fb0a50a8 100644 --- a/src/cli/log/log-key-describe.ts +++ b/src/cli/log/log-key-describe.ts @@ -34,7 +34,13 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/log/log-key-list.ts b/src/cli/log/log-key-list.ts index 0911888d8..77efe09cf 100644 --- a/src/cli/log/log-key-list.ts +++ b/src/cli/log/log-key-list.ts @@ -33,13 +33,15 @@ export default function setup() { options, command ); - if (await getTokens(true, true, deploymentTypes)) { - verboseMessage(`Listing log API keys...`); - const outcome = await listLogApiKeys(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + true, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Listing log API keys...`); + const outcome = await listLogApiKeys(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/log/log-list.ts b/src/cli/log/log-list.ts index f81eea004..7e40e32cd 100644 --- a/src/cli/log/log-list.ts +++ b/src/cli/log/log-list.ts @@ -104,8 +104,8 @@ export default function setup() { // no log api credentials else { printMessage('No log api credentials found!'); - program.help(); process.exitCode = 1; + program.help(); } }); diff --git a/src/cli/log/log-tail.ts b/src/cli/log/log-tail.ts index e5159e35f..e72811d59 100644 --- a/src/cli/log/log-tail.ts +++ b/src/cli/log/log-tail.ts @@ -113,8 +113,8 @@ export default function setup() { // no log api credentials else { printMessage('No log api credentials found!'); - program.help(); process.exitCode = 1; + program.help(); } }); diff --git a/src/cli/mapping/mapping-delete.ts b/src/cli/mapping/mapping-delete.ts index a4940a516..93ccc6991 100644 --- a/src/cli/mapping/mapping-delete.ts +++ b/src/cli/mapping/mapping-delete.ts @@ -49,20 +49,30 @@ export default function setup() { options, command ); + if (!options.mappingId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + // delete by id/name - if ( - options.mappingId && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.mappingId) { verboseMessage(`Deleting mapping ${options.mappingId}...`); const outcome = await deleteMapping(options.mappingId); if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage(`Deleting all mappings...`); const outcome = await deleteMappings( options.connectorId, @@ -70,17 +80,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/mapping/mapping-export.ts b/src/cli/mapping/mapping-export.ts index d1c163e1f..cffd1f060 100644 --- a/src/cli/mapping/mapping-export.ts +++ b/src/cli/mapping/mapping-export.ts @@ -75,11 +75,23 @@ export default function setup() { options, command ); + if (!options.mappingId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combinations of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + // export by id/name - if ( - options.mappingId && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.mappingId) { verboseMessage(`Exporting mapping ${options.mappingId}...`); const outcome = await exportMappingToFile( options.mappingId, @@ -93,10 +105,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage(`Exporting all mappings to a single file...`); const outcome = await exportMappingsToFile( options.file, @@ -111,10 +120,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate) { verboseMessage('Exporting all mappings to separate files...'); const outcome = await exportMappingsToFiles(options.metadata, { connectorId: options.connectorId, @@ -124,17 +130,7 @@ export default function setup() { }); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/mapping/mapping-import.ts b/src/cli/mapping/mapping-import.ts index a18c6bf08..818c1f1ae 100644 --- a/src/cli/mapping/mapping-import.ts +++ b/src/cli/mapping/mapping-import.ts @@ -55,11 +55,28 @@ export default function setup() { options, command ); - // import by id/name if ( - options.mappingId && - (await getTokens(false, true, deploymentTypes)) + !options.mappingId && + !options.file && + !options.all && + !options.allSeparate ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + // import by id/name + if (options.mappingId) { verboseMessage(`Importing mapping ${options.mappingId}...`); const outcome = await importMappingFromFile( options.mappingId, @@ -71,11 +88,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all && options.file) { verboseMessage( `Importing all mappings from a single file (${options.file})...` ); @@ -85,10 +98,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate) { verboseMessage('Importing all mappings from separate files...'); const outcome = await importMappingsFromFiles({ deps: options.deps, @@ -96,27 +106,14 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // import first mapping in file - else if ( - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.file) { verboseMessage('Importing first mapping in file...'); const outcome = await importFirstMappingFromFile(options.file, { deps: options.deps, }); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/mapping/mapping-list.ts b/src/cli/mapping/mapping-list.ts index 0cb6c486d..c1303eefe 100644 --- a/src/cli/mapping/mapping-list.ts +++ b/src/cli/mapping/mapping-list.ts @@ -33,13 +33,15 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage(`Listing all mappings`); - const outcome = await listMappings(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Listing all mappings`); + const outcome = await listMappings(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/mapping/mapping-rename.ts b/src/cli/mapping/mapping-rename.ts index 43ef95737..02058beb6 100644 --- a/src/cli/mapping/mapping-rename.ts +++ b/src/cli/mapping/mapping-rename.ts @@ -50,11 +50,23 @@ export default function setup() { options, command ); + if (!options.mappingId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + // rename by id/name - if ( - options.mappingId && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.mappingId) { verboseMessage('Renaming mapping...'); const outcome = await renameMapping( options.mappingId, @@ -63,22 +75,12 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage('Renaming all mappings...'); const outcome = await renameMappings(options.legacy); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/node/node-delete.ts b/src/cli/node/node-delete.ts index b0101afec..72c03fbd1 100644 --- a/src/cli/node/node-delete.ts +++ b/src/cli/node/node-delete.ts @@ -34,7 +34,18 @@ export default function setup() { options, command ); - if ((options.nodeId || options.nodeName) && (await getTokens())) { + if (!options.nodeId && !options.nodeName && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + if (options.nodeId || options.nodeName) { verboseMessage( `Deleting custom node ${options.nodeName ? options.nodeName : options.nodeId}...` ); @@ -43,17 +54,10 @@ export default function setup() { options.nodeName ); if (!outcome) process.exitCode = 1; - } else if (options.all && (await getTokens())) { + } else if (options.all) { verboseMessage(`Deleting all custom nodes...`); const outcome = await deleteCustomNodes(); if (!outcome) process.exitCode = 1; - } else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; } }); diff --git a/src/cli/node/node-describe.ts b/src/cli/node/node-describe.ts index 0474e36eb..d9fbb25bb 100644 --- a/src/cli/node/node-describe.ts +++ b/src/cli/node/node-describe.ts @@ -2,7 +2,7 @@ import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; import { describeCustomNode } from '../../ops/NodeOps'; -import { printMessage, verboseMessage } from '../../utils/Console'; +import { verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -26,24 +26,17 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage( - `Describing custom node ${options.nodeName ? options.nodeName : options.nodeId}...` - ); - const outcome = await describeCustomNode( - options.nodeId, - options.nodeName, - options.json - ); - if (!outcome) process.exitCode = 1; - } else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage( + `Describing custom node ${options.nodeName ? options.nodeName : options.nodeId}...` + ); + const outcome = await describeCustomNode( + options.nodeId, + options.nodeName, + options.json + ); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/node/node-export.ts b/src/cli/node/node-export.ts index 41a2c25d5..40944d555 100644 --- a/src/cli/node/node-export.ts +++ b/src/cli/node/node-export.ts @@ -66,8 +66,25 @@ export default function setup() { options, command ); + if ( + !options.file && + !options.all && + !options.allSeparate && + !options.nodeId && + !options.nodeName + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // export by id or name - if ((options.nodeId || options.nodeName) && (await getTokens())) { + if (options.nodeId || options.nodeName) { verboseMessage( `Exporting custom node ${options.nodeId || options.nodeName}...` ); @@ -84,7 +101,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage(`Exporting all custom nodes to a single file...`); const outcome = await exportCustomNodesToFile( options.file, @@ -96,7 +113,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Exporting all custom nodes to separate files...'); const outcome = await exportCustomNodesToFiles( options.metadata, @@ -107,16 +124,6 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } }); - return program; } diff --git a/src/cli/node/node-import.ts b/src/cli/node/node-import.ts index ab372eea7..196e5c773 100644 --- a/src/cli/node/node-import.ts +++ b/src/cli/node/node-import.ts @@ -54,12 +54,25 @@ export default function setup() { options, command ); - // import by id or name if ( - (options.nodeId || options.nodeName) && - options.file && - (await getTokens()) + !options.nodeId && + !options.nodeName && + !options.all && + !options.file && + !options.allSeparate ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + // import by id or name + if ((options.nodeId || options.nodeName) && options.file) { verboseMessage( `Importing custom node ${options.nodeId || options.nodeName}...` ); @@ -75,7 +88,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if (options.all && options.file && (await getTokens())) { + else if (options.all && options.file) { verboseMessage( `Importing all custom nodes from a single file (${options.file})...` ); @@ -86,7 +99,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Importing all custom nodes from separate files...'); const outcome = await importCustomNodesFromFiles({ reUuid: options.reUuid, @@ -95,7 +108,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // import first node in file - else if (options.file && (await getTokens())) { + else if (options.file) { verboseMessage('Importing first custom node in file...'); const outcome = await importFirstCustomNodeFromFile(options.file, { reUuid: options.reUuid, @@ -103,15 +116,6 @@ export default function setup() { }); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } }); return program; } diff --git a/src/cli/node/node-list.ts b/src/cli/node/node-list.ts index 0bc7c6b5a..65f820cba 100644 --- a/src/cli/node/node-list.ts +++ b/src/cli/node/node-list.ts @@ -24,13 +24,11 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage(`Listing all custom nodes`); - const outcome = await listCustomNodes(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Listing all custom nodes`); + const outcome = await listCustomNodes(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/oauth/oauth-client-delete.ts b/src/cli/oauth/oauth-client-delete.ts index 39defb09d..88ab38db7 100644 --- a/src/cli/oauth/oauth-client-delete.ts +++ b/src/cli/oauth/oauth-client-delete.ts @@ -35,11 +35,12 @@ export default function setup() { options, command ); - if (options.appId && (await getTokens())) { + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + if (options.appId && getTokensIsSuccessful) { const outcome = deleteOauth2ClientById(options.appId); if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; } } // end command logic inside action handler diff --git a/src/cli/oauth/oauth-client-export.ts b/src/cli/oauth/oauth-client-export.ts index 2c83fbdbf..6a09d6e17 100644 --- a/src/cli/oauth/oauth-client-export.ts +++ b/src/cli/oauth/oauth-client-export.ts @@ -6,7 +6,7 @@ import { exportOAuth2ClientsToFiles, exportOAuth2ClientToFile, } from '../../ops/OAuth2ClientOps'; -import { verboseMessage } from '../../utils/Console.js'; +import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -53,8 +53,19 @@ export default function setup() { options, command ); + if (!options.appId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // export - if (options.appId && (await getTokens())) { + if (options.appId) { verboseMessage('Exporting OAuth2 client...'); const outcome = await exportOAuth2ClientToFile( options.appId, @@ -68,7 +79,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // -a/--all - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Exporting all OAuth2 clients to file...'); const outcome = await exportOAuth2ClientsToFile( options.file, @@ -81,7 +92,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // -A/--all-separate - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Exporting all clients to separate files...'); const outcome = await exportOAuth2ClientsToFiles(options.metadata, { useStringArrays: true, @@ -89,16 +100,7 @@ export default function setup() { }); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - verboseMessage( - 'Unrecognized combination of options or no options...' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/oauth/oauth-client-import.ts b/src/cli/oauth/oauth-client-import.ts index bf4867b08..45040b310 100644 --- a/src/cli/oauth/oauth-client-import.ts +++ b/src/cli/oauth/oauth-client-import.ts @@ -48,8 +48,24 @@ export default function setup() { options, command ); + if ( + !options.appId && + !options.all && + !options.allSeparate && + !options.file + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // import by id - if (options.file && options.appId && (await getTokens())) { + if (options.file && options.appId) { verboseMessage(`Importing OAuth2 client "${options.appId}"...`); const outcome = await importOAuth2ClientFromFile( options.appId, @@ -61,7 +77,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if (options.all && options.file && (await getTokens())) { + else if (options.all && options.file) { verboseMessage( `Importing all OAuth2 clients from a single file (${options.file})...` ); @@ -71,7 +87,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if (options.allSeparate && !options.file && (await getTokens())) { + else if (options.allSeparate && !options.file) { verboseMessage( 'Importing all OAuth2 clients from separate files in current directory...' ); @@ -81,7 +97,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // import first provider from file - else if (options.file && (await getTokens())) { + else if (options.file) { verboseMessage( `Importing first OAuth2 client from file "${options.file}"...` ); @@ -90,14 +106,7 @@ export default function setup() { }); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/oauth/oauth-client-list.ts b/src/cli/oauth/oauth-client-list.ts index a9ba75adc..81623ad40 100644 --- a/src/cli/oauth/oauth-client-list.ts +++ b/src/cli/oauth/oauth-client-list.ts @@ -24,13 +24,11 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage(`Listing OAuth2 clients...`); - const outcome = await listOAuth2Clients(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Listing OAuth2 clients...`); + const outcome = await listOAuth2Clients(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/promote/promote.ts b/src/cli/promote/promote.ts index 1c7dd09e2..86d85ffd1 100644 --- a/src/cli/promote/promote.ts +++ b/src/cli/promote/promote.ts @@ -99,11 +99,14 @@ export default function setup() { options, command ); - if ( - (await getTokens(false, true, deploymentTypes)) && - options.masterDir && - options.frodoExportDir - ) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + if (options.masterDir && options.frodoExportDir) { verboseMessage('Comparing export...'); verboseMessage('comparing'); const outcome = await compareExportToDirectory( diff --git a/src/cli/realm/realm-add-custom-domain.ts b/src/cli/realm/realm-add-custom-domain.ts index 443891671..22445d652 100644 --- a/src/cli/realm/realm-add-custom-domain.ts +++ b/src/cli/realm/realm-add-custom-domain.ts @@ -28,16 +28,14 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage( - `Adding custom DNS domain ${ - options.domain - } to realm ${state.getRealm()}...` - ); - await addCustomDomain(state.getRealm(), options.domain); - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage( + `Adding custom DNS domain ${ + options.domain + } to realm ${state.getRealm()}...` + ); + await addCustomDomain(state.getRealm(), options.domain); } // end command logic inside action handler ); diff --git a/src/cli/realm/realm-describe.ts b/src/cli/realm/realm-describe.ts index 655c5dcf2..e95079cb2 100644 --- a/src/cli/realm/realm-describe.ts +++ b/src/cli/realm/realm-describe.ts @@ -19,12 +19,10 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage(`Retrieving details of realm ${state.getRealm()}...`); - describeRealm(frodo.utils.getRealmName(state.getRealm())); - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Retrieving details of realm ${state.getRealm()}...`); + describeRealm(frodo.utils.getRealmName(state.getRealm())); } // end command logic inside action handler ); diff --git a/src/cli/realm/realm-export.ts b/src/cli/realm/realm-export.ts index cef020a80..4d8075063 100644 --- a/src/cli/realm/realm-export.ts +++ b/src/cli/realm/realm-export.ts @@ -57,8 +57,24 @@ export default function setup() { options, command ); + if ( + !options.realmId && + !options.realmName && + !options.all && + !options.allSeparate + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // export by id - if (options.realmId && (await getTokens())) { + if (options.realmId) { verboseMessage('Exporting realm...'); const outcome = await exportRealmById( options.realmId, @@ -68,7 +84,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // export by name - else if (options.realmName && (await getTokens())) { + else if (options.realmName) { verboseMessage('Exporting realm...'); const outcome = await exportRealmByName( options.realmName, @@ -78,7 +94,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // -a / --all - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Exporting all realms to a single file...'); const outcome = await exportRealmsToFile( options.file, @@ -87,22 +103,12 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // -A / --all-separate - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Exporting all realms to separate files...'); const outcome = await exportRealmsToFiles(options.metadata); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/realm/realm-import.ts b/src/cli/realm/realm-import.ts index f75e8080e..511106410 100644 --- a/src/cli/realm/realm-import.ts +++ b/src/cli/realm/realm-import.ts @@ -54,60 +54,70 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - // import by id - if (options.realmId && options.file) { - verboseMessage(`Importing realm ${options.realmId}...`); - const outcome = await importRealmFromFile( - options.realmId, - options.realmName, - options.file - ); - if (!outcome) process.exitCode = 1; - } - // import by name - else if (options.realmName && options.file) { - verboseMessage(`Importing realm ${options.realmName}...`); - const outcome = await importRealmFromFile( - options.realmId, - options.realmName, - options.file - ); - if (!outcome) process.exitCode = 1; - } - // --all / -a - else if (options.all && options.file) { - verboseMessage( - `Importing all realms from a single file (${options.file})...` - ); - const outcome = await importRealmsFromFile(options.file); - if (!outcome) process.exitCode = 1; - } - // --all-separate / -A - else if (options.allSeparate) { - verboseMessage('Importing all realms from separate files...'); - const outcome = await importRealmsFromFiles(); - if (!outcome) process.exitCode = 1; - } - // import first realm in file - else if (options.file) { - verboseMessage(`Importing first realm in file...`); - const outcome = await importRealmFromFile( - options.realmId, - options.realmName, - options.file - ); - if (!outcome) process.exitCode = 1; - } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } + if ( + !options.realmId && + !options.realmName && + !options.all && + !options.allSeparate && + !options.file + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + // import by id + if (options.realmId && options.file) { + verboseMessage(`Importing realm ${options.realmId}...`); + const outcome = await importRealmFromFile( + options.realmId, + options.realmName, + options.file + ); + if (!outcome) process.exitCode = 1; + } + // import by name + else if (options.realmName && options.file) { + verboseMessage(`Importing realm ${options.realmName}...`); + const outcome = await importRealmFromFile( + options.realmId, + options.realmName, + options.file + ); + if (!outcome) process.exitCode = 1; + } + // --all / -a + else if (options.all && options.file) { + verboseMessage( + `Importing all realms from a single file (${options.file})...` + ); + const outcome = await importRealmsFromFile(options.file); + if (!outcome) process.exitCode = 1; + } + // --all-separate / -A + else if (options.allSeparate) { + verboseMessage('Importing all realms from separate files...'); + const outcome = await importRealmsFromFiles(); + if (!outcome) process.exitCode = 1; + } + // import first realm in file + else if (options.file) { + verboseMessage(`Importing first realm in file...`); + const outcome = await importRealmFromFile( + options.realmId, + options.realmName, + options.file + ); + if (!outcome) process.exitCode = 1; } } // end command logic inside action handler diff --git a/src/cli/realm/realm-list.ts b/src/cli/realm/realm-list.ts index e6cf34091..8a8bc90f1 100644 --- a/src/cli/realm/realm-list.ts +++ b/src/cli/realm/realm-list.ts @@ -24,12 +24,10 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage('Listing all realms...'); - await listRealms(options.long); - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Listing all realms...'); + await listRealms(options.long); } // end command logic inside action handler ); diff --git a/src/cli/realm/realm-remove-custom-domain.ts b/src/cli/realm/realm-remove-custom-domain.ts index f4275b193..d7b742926 100644 --- a/src/cli/realm/realm-remove-custom-domain.ts +++ b/src/cli/realm/realm-remove-custom-domain.ts @@ -29,16 +29,14 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage( - `Removing custom DNS domain ${ - options.domain - } from realm ${state.getRealm()}...` - ); - await removeCustomDomain(state.getRealm(), options.domain); - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage( + `Removing custom DNS domain ${ + options.domain + } from realm ${state.getRealm()}...` + ); + await removeCustomDomain(state.getRealm(), options.domain); } // end command logic inside action handler ); diff --git a/src/cli/role/role-delete.ts b/src/cli/role/role-delete.ts index a248d4033..51b03e638 100644 --- a/src/cli/role/role-delete.ts +++ b/src/cli/role/role-delete.ts @@ -41,7 +41,13 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/role/role-describe.ts b/src/cli/role/role-describe.ts index 643a71e40..1197d6ce1 100644 --- a/src/cli/role/role-describe.ts +++ b/src/cli/role/role-describe.ts @@ -30,7 +30,13 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/role/role-export.ts b/src/cli/role/role-export.ts index f82248535..f73ff1d1e 100644 --- a/src/cli/role/role-export.ts +++ b/src/cli/role/role-export.ts @@ -65,11 +65,29 @@ export default function setup() { options, command ); - // export by id or name if ( - (options.roleId || options.roleName) && - (await getTokens(false, true, deploymentTypes)) + !options.roleId && + !options.roleName && + !options.file && + !options.allSeparate && + !options.all ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + // export by id or name + if (options.roleId || options.roleName) { verboseMessage( `Exporting internal role ${options.roleId || options.roleName}...` ); @@ -82,10 +100,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage(`Exporting all internal roles to a single file...`); const outcome = await exportInternalRolesToFile( options.file, @@ -94,25 +109,12 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate) { verboseMessage('Exporting all internal roles to separate files...'); const outcome = await exportInternalRolesToFiles(options.metadata); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/role/role-import.ts b/src/cli/role/role-import.ts index 23dede098..b000853dc 100644 --- a/src/cli/role/role-import.ts +++ b/src/cli/role/role-import.ts @@ -59,12 +59,29 @@ export default function setup() { options, command ); - // import by id or name if ( - (options.roleId || options.roleName) && - options.file && - (await getTokens(false, true, deploymentTypes)) + !options.roleId && + !options.roleName && + !options.file && + !options.all && + !options.allSeparate ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + // import by id or name + if ((options.roleId || options.roleName) && options.file) { verboseMessage( `Importing internal role ${options.roleId || options.roleName}...` ); @@ -76,11 +93,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all && options.file) { verboseMessage( `Importing all internal roles from a single file (${options.file})...` ); @@ -88,34 +101,18 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate) { verboseMessage('Importing all internal roles from separate files...'); const outcome = await importInternalRolesFromFiles(); if (!outcome) process.exitCode = 1; } // import first role in file - else if ( - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.file) { verboseMessage('Importing first internal role in file...'); const outcome = await importFirstInternalRoleFromFile(options.file); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; } diff --git a/src/cli/role/role-list.ts b/src/cli/role/role-list.ts index 15b2205fa..448cde4ee 100644 --- a/src/cli/role/role-list.ts +++ b/src/cli/role/role-list.ts @@ -33,13 +33,15 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage(`Listing all roles`); - const outcome = await listRoles(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Listing all roles`); + const outcome = await listRoles(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/saml/saml-cot-export.ts b/src/cli/saml/saml-cot-export.ts index 422ff16c1..c61d30a9e 100644 --- a/src/cli/saml/saml-cot-export.ts +++ b/src/cli/saml/saml-cot-export.ts @@ -56,8 +56,19 @@ export default function setup() { options, command ); + if (!options.cotId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // export by id/name - if (options.cotId && (await getTokens())) { + if (options.cotId) { verboseMessage( `Exporting circle of trust "${ options.cotId @@ -71,7 +82,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Exporting all circles of trust to a single file...'); const outcome = await exportCirclesOfTrustToFile( options.file, @@ -80,22 +91,12 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Exporting all circles of trust to separate files...'); const outcome = await exportCirclesOfTrustToFiles(options.metadata); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/saml/saml-cot-import.ts b/src/cli/saml/saml-cot-import.ts index af6a6ee58..303bb0ca0 100644 --- a/src/cli/saml/saml-cot-import.ts +++ b/src/cli/saml/saml-cot-import.ts @@ -51,8 +51,24 @@ export default function setup() { options, command ); + if ( + !options.cotId && + !options.all && + !options.allSeparate && + !options.file + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // import by id - if (options.file && options.cotId && (await getTokens())) { + if (options.file && options.cotId) { verboseMessage( `Importing circle of trust "${ options.cotId @@ -65,7 +81,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if (options.all && options.file && (await getTokens())) { + else if (options.all && options.file) { verboseMessage( `Importing all circles of trust from a single file (${options.file})...` ); @@ -73,7 +89,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if (options.allSeparate && !options.file && (await getTokens())) { + else if (options.allSeparate && !options.file) { verboseMessage( 'Importing all circles of trust from separate files (*.saml.json) in current directory...' ); @@ -81,7 +97,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // import first from file - else if (options.file && (await getTokens())) { + else if (options.file) { verboseMessage( `Importing first circle of trust from file "${ options.file @@ -90,17 +106,7 @@ export default function setup() { const outcome = await importFirstCircleOfTrustFromFile(options.file); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end program logic inside action handler ); return program; diff --git a/src/cli/saml/saml-cot-list.ts b/src/cli/saml/saml-cot-list.ts index 05d768092..813481078 100644 --- a/src/cli/saml/saml-cot-list.ts +++ b/src/cli/saml/saml-cot-list.ts @@ -25,15 +25,13 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage( - `Listing SAML circles of trust in realm "${state.getRealm()}"...` - ); - const outcome = await listCirclesOfTrust(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage( + `Listing SAML circles of trust in realm "${state.getRealm()}"...` + ); + const outcome = await listCirclesOfTrust(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/saml/saml-delete.ts b/src/cli/saml/saml-delete.ts index 60e5607d7..f5c372bcd 100644 --- a/src/cli/saml/saml-delete.ts +++ b/src/cli/saml/saml-delete.ts @@ -33,27 +33,28 @@ export default function setup() { options, command ); + if (!options.entityId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // -i / --entity-id - if (options.entityId && (await getTokens())) { + if (options.entityId) { verboseMessage(`Deleting entity provider '${options.entityId}'...`); await deleteSaml2Provider(options.entityId); } // -a / --all - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage(`Deleting all entity providers...`); await deleteSaml2Providers(); } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/saml/saml-describe.ts b/src/cli/saml/saml-describe.ts index 55d3f0e6d..1f557ea0b 100644 --- a/src/cli/saml/saml-describe.ts +++ b/src/cli/saml/saml-describe.ts @@ -23,17 +23,15 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage( - `Describing SAML entity provider ${ - options.entityId - } in realm "${state.getRealm()}"...` - ); - const outcome = await describeSaml2Provider(options.entityId); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage( + `Describing SAML entity provider ${ + options.entityId + } in realm "${state.getRealm()}"...` + ); + const outcome = await describeSaml2Provider(options.entityId); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/saml/saml-export.ts b/src/cli/saml/saml-export.ts index e2234896e..827cd6264 100644 --- a/src/cli/saml/saml-export.ts +++ b/src/cli/saml/saml-export.ts @@ -59,8 +59,19 @@ export default function setup() { options, command ); + if (!options.entityId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // export by id/name - if (options.entityId && (await getTokens())) { + if (options.entityId) { verboseMessage( `Exporting provider "${ options.entityId @@ -77,7 +88,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Exporting all providers to a single file...'); const outcome = await exportSaml2ProvidersToFile( options.file, @@ -89,24 +100,14 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Exporting all providers to separate files...'); const outcome = await exportSaml2ProvidersToFiles(options.metadata, { deps: options.deps, }); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/saml/saml-import.ts b/src/cli/saml/saml-import.ts index 70f7640a9..1b7474bfd 100644 --- a/src/cli/saml/saml-import.ts +++ b/src/cli/saml/saml-import.ts @@ -54,8 +54,24 @@ export default function setup() { options, command ); + if ( + !options.entityId && + !options.all && + !options.allSeparate && + !options.file + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // import by id - if (options.file && options.entityId && (await getTokens())) { + if (options.file && options.entityId) { verboseMessage( `Importing provider "${ options.entityId @@ -71,7 +87,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if (options.all && options.file && (await getTokens())) { + else if (options.all && options.file) { verboseMessage( `Importing all providers from a single file (${options.file})...` ); @@ -81,7 +97,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if (options.allSeparate && !options.file && (await getTokens())) { + else if (options.allSeparate && !options.file) { verboseMessage( 'Importing all providers from separate files (*.saml.json) in current directory...' ); @@ -91,7 +107,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // import first provider from file - else if (options.file && (await getTokens())) { + else if (options.file) { verboseMessage( `Importing first provider from file "${ options.file @@ -102,14 +118,7 @@ export default function setup() { }); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage('Unrecognized combination of options or no options...'); - program.help(); - process.exitCode = 1; - } } - // end program logic inside action handler ); return program; diff --git a/src/cli/saml/saml-list.ts b/src/cli/saml/saml-list.ts index 84118109d..a8d2942fb 100644 --- a/src/cli/saml/saml-list.ts +++ b/src/cli/saml/saml-list.ts @@ -25,15 +25,13 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage( - `Listing SAML entity providers in realm "${state.getRealm()}"...` - ); - const outcome = await listSaml2Providers(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage( + `Listing SAML entity providers in realm "${state.getRealm()}"...` + ); + const outcome = await listSaml2Providers(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/saml/saml-metadata-export.ts b/src/cli/saml/saml-metadata-export.ts index f4f467c23..42b9359cf 100644 --- a/src/cli/saml/saml-metadata-export.ts +++ b/src/cli/saml/saml-metadata-export.ts @@ -40,8 +40,19 @@ export default function setup() { options, command ); + if (!options.entityId) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // export by id/name - if (options.entityId && (await getTokens())) { + if (options.entityId) { printMessage( `Exporting metadata for provider "${ options.entityId @@ -54,21 +65,11 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // // --all-separate -A - // else if (options.allSeparate && (await getTokens())) { + // else if (options.allSeparate) { // printMessage('Exporting all providers to separate files...'); // exportProvidersToFiles(); // } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/script/script-delete.ts b/src/cli/script/script-delete.ts index 814880b47..f4fe4d540 100644 --- a/src/cli/script/script-delete.ts +++ b/src/cli/script/script-delete.ts @@ -44,7 +44,18 @@ export default function setup() { options, command ); - if (options.scriptId && (await getTokens())) { + if (!options.scriptId && !options.scriptName && !options.all) { + printMessage( + 'Unrecognized combination or options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + if (options.scriptId) { verboseMessage( `Deleting script ${ options.scriptId @@ -52,7 +63,7 @@ export default function setup() { ); const outcome = await deleteScriptId(options.scriptId); if (!outcome) process.exitCode = 1; - } else if (options.scriptName && (await getTokens())) { + } else if (options.scriptName) { verboseMessage( `Deleting script ${ options.scriptName @@ -60,22 +71,12 @@ export default function setup() { ); const outcome = await deleteScriptName(options.scriptName); if (!outcome) process.exitCode = 1; - } else if (options.all && (await getTokens())) { + } else if (options.all) { verboseMessage('Deleting all non-default scripts...'); const outcome = await deleteAllScripts(); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/script/script-describe.ts b/src/cli/script/script-describe.ts index ac5b47799..875202faa 100644 --- a/src/cli/script/script-describe.ts +++ b/src/cli/script/script-describe.ts @@ -36,7 +36,18 @@ export default function setup() { options, command ); - if ((options.scriptName || options.scriptId) && (await getTokens())) { + if (!options.scriptName && !options.scriptId) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + + if (options.scriptName || options.scriptId) { verboseMessage( `Describing script ${options.scriptName ? options.scriptName : options.scriptId}...` ); @@ -49,17 +60,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/script/script-export.ts b/src/cli/script/script-export.ts index 84d80c5fc..a233d44f8 100644 --- a/src/cli/script/script-export.ts +++ b/src/cli/script/script-export.ts @@ -88,8 +88,24 @@ export default function setup() { options, command ); + if ( + !options.scriptId && + !options.scriptName && + !options.all && + !options.allSeparate + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // export by id - if (options.scriptId && (await getTokens())) { + if (options.scriptId) { verboseMessage('Exporting script...'); const outcome = await exportScriptToFile( options.scriptId, @@ -106,10 +122,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // export by name - else if ( - (options.scriptName || options.script) && - (await getTokens()) - ) { + else if (options.scriptName || options.script) { verboseMessage('Exporting script...'); const outcome = await exportScriptByNameToFile( options.scriptName || options.script, @@ -126,7 +139,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // -a / --all - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Exporting all scripts to a single file...'); const outcome = await exportScriptsToFile( options.file, @@ -141,7 +154,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // -A / --all-separate - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Exporting all scripts to separate files...'); const outcome = await exportScriptsToFiles( options.extract, @@ -155,18 +168,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } - - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/script/script-import.ts b/src/cli/script/script-import.ts index 89b95a124..06e510f30 100644 --- a/src/cli/script/script-import.ts +++ b/src/cli/script/script-import.ts @@ -75,8 +75,18 @@ export default function setup() { options, command ); + if (!options.file && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no option...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); - if (options.file && (await getTokens())) { + if (options.file) { verboseMessage( `Importing script(s) into realm "${state.getRealm()}"...` ); @@ -91,7 +101,7 @@ export default function setup() { } ); if (!outcome) process.exitCode = 1; - } else if (options.allSeparate && (await getTokens())) { + } else if (options.allSeparate) { verboseMessage( `Importing all script files into realm "${state.getRealm()}"...` ); @@ -109,18 +119,7 @@ export default function setup() { process.exitCode = 1; } } - - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/script/script-list.ts b/src/cli/script/script-list.ts index bbe41c76d..3d41d3cd8 100644 --- a/src/cli/script/script-list.ts +++ b/src/cli/script/script-list.ts @@ -40,17 +40,15 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage(`Listing scripts in realm "${state.getRealm()}"...`); - const outcome = await listScripts( - options.long, - options.usage, - options.file - ); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Listing scripts in realm "${state.getRealm()}"...`); + const outcome = await listScripts( + options.long, + options.usage, + options.file + ); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/secretstore/secretstore-delete.ts b/src/cli/secretstore/secretstore-delete.ts index cc1fa9ac5..4961f62d8 100644 --- a/src/cli/secretstore/secretstore-delete.ts +++ b/src/cli/secretstore/secretstore-delete.ts @@ -49,36 +49,37 @@ export default function setup() { options, command ); - if ( - options.secretstoreId && - (await getTokens(false, true, deploymentTypes)) - ) { + if (!options.secretstoreId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSucessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSucessful) process.exit(1); + let outcome: boolean; + + if (options.secretstoreId) { verboseMessage(`Deleting secret store ${options.secretstoreId}...`); - const outcome = await deleteSecretStore( + outcome = await deleteSecretStore( options.secretstoreId, options.secretstoreType, options.global ); - if (!outcome) process.exitCode = 1; - } else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + } else if (options.all) { verboseMessage( `Deleting all${options.global ? ' global' : ''} secret stores...` ); - const outcome = await deleteSecretStores(options.global); - if (!outcome) process.exitCode = 1; - } else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.outputHelp(); - process.exitCode = 1; + outcome = await deleteSecretStores(options.global); } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; } diff --git a/src/cli/secretstore/secretstore-describe.ts b/src/cli/secretstore/secretstore-describe.ts index 53fb05db8..15b79af5f 100644 --- a/src/cli/secretstore/secretstore-describe.ts +++ b/src/cli/secretstore/secretstore-describe.ts @@ -46,31 +46,32 @@ export default function setup() { options, command ); - if ( - options.secretstoreId && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) - ) { - verboseMessage(`Describing secret store ${options.secretstoreId}`); - const outcome = await describeSecretStore( - options.secretstoreId, - options.secretstoreType, - options.global - ); - if (!outcome) process.exitCode = 1; - } else { + if (!options.secretstoreId) { printMessage( 'Unrecognized combination of options or no options...', 'error' ); - program.outputHelp(); process.exitCode = 1; + program.help(); + } + const getTokensIsSucessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : deploymentTypes + ); + if (!getTokensIsSucessful) process.exit(1); + let outcome: boolean; + + if (options.secretstoreId) { + verboseMessage(`Describing secret store ${options.secretstoreId}`); + outcome = await describeSecretStore( + options.secretstoreId, + options.secretstoreType, + options.global + ); } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; } diff --git a/src/cli/secretstore/secretstore-export.ts b/src/cli/secretstore/secretstore-export.ts index 0b17db268..626842a22 100644 --- a/src/cli/secretstore/secretstore-export.ts +++ b/src/cli/secretstore/secretstore-export.ts @@ -72,70 +72,56 @@ export default function setup() { options, command ); - if ( - options.secretstoreId && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) - ) { + + if (!options.secretstoreId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSucessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : deploymentTypes + ); + if (!getTokensIsSucessful) process.exit(1); + let outcome: boolean; + + if (options.secretstoreId) { verboseMessage(`Exporting secret store ${options.secretstoreId}...`); - const outcome = await exportSecretStoreToFile( + outcome = await exportSecretStoreToFile( options.secretstoreId, options.secretstoreType, options.file, options.global, options.metadata ); - if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) - ) { + else if (options.all) { verboseMessage( `Exporting all${options.global ? ' global' : ''} secret stores to a single file...` ); - const outcome = await exportSecretStoresToFile( + outcome = await exportSecretStoresToFile( options.file, options.global, options.metadata ); - if (!outcome) process.exitCode = 1; } // --all-separate -A - else if ( - options.allSeparate && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) - ) { + else if (options.allSeparate) { verboseMessage( `Exporting all${options.global ? ' global' : ''} secret stores to separate files...` ); - const outcome = await exportSecretStoresToFiles( + outcome = await exportSecretStoresToFiles( options.global, options.metadata ); - if (!outcome) process.exitCode = 1; - } else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.outputHelp(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; } diff --git a/src/cli/secretstore/secretstore-import.ts b/src/cli/secretstore/secretstore-import.ts index 1b82a1785..9716e7bc8 100644 --- a/src/cli/secretstore/secretstore-import.ts +++ b/src/cli/secretstore/secretstore-import.ts @@ -67,83 +67,64 @@ export default function setup() { options, command ); + if ( - options.secretstoreId && - options.file && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) + !options.secretstoreId && + !options.all && + !options.allSeparate && + !options.file ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSucessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : deploymentTypes + ); + if (!getTokensIsSucessful) process.exit(1); + let outcome: boolean; + + if (options.secretstoreId && options.file) { verboseMessage(`Importing secret store ${options.secretstoreId}...`); - const outcome = await importSecretStoreFromFile( + outcome = await importSecretStoreFromFile( options.secretstoreId, options.secretstoreType, options.file, options.global ); - if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - options.file && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) - ) { + else if (options.all && options.file) { verboseMessage( `Importing all${options.global ? ' global' : ''} secret stores from a single file (${options.file})...` ); - const outcome = await importSecretStoresFromFile( + outcome = await importSecretStoresFromFile( options.file, options.global ); - if (!outcome) process.exitCode = 1; } // --all-separate -A - else if ( - options.allSeparate && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) - ) { + else if (options.allSeparate) { verboseMessage( `Importing all${options.global ? ' global' : ''} secret stores from separate files...` ); - const outcome = await importSecretStoresFromFiles(options.global); - if (!outcome) process.exitCode = 1; + outcome = await importSecretStoresFromFiles(options.global); } // import first secret store from file - else if ( - options.file && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) - ) { + else if (options.file) { verboseMessage('Importing first secret store in file...'); - const outcome = await importFirstSecretStoreFromFile( + outcome = await importFirstSecretStoreFromFile( options.file, options.global ); - if (!outcome) process.exitCode = 1; - } else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.outputHelp(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; } diff --git a/src/cli/secretstore/secretstore-list.ts b/src/cli/secretstore/secretstore-list.ts index 31f4577e9..759bc220b 100644 --- a/src/cli/secretstore/secretstore-list.ts +++ b/src/cli/secretstore/secretstore-list.ts @@ -40,21 +40,18 @@ export default function setup() { options, command ); - if ( - await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - ) - ) { - verboseMessage( - `Listing all${options.global ? ' global' : ''} secret stores` - ); - const outcome = await listSecretStores(options.long, options.global); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + verboseMessage( + `Listing all${options.global ? ' global' : ''} secret stores` + ); + const outcome = await listSecretStores(options.long, options.global); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/secretstore/secretstore-mapping-alias-activate.ts b/src/cli/secretstore/secretstore-mapping-alias-activate.ts index 121b31d1b..cad50b6df 100644 --- a/src/cli/secretstore/secretstore-mapping-alias-activate.ts +++ b/src/cli/secretstore/secretstore-mapping-alias-activate.ts @@ -55,6 +55,26 @@ export default function setup() { options, command ); + + if ( + !options.secretstoreType && + !options.secretstoreId && + !options.secretId && + !options.alias + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSucessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : deploymentTypes + ); + if (!getTokensIsSucessful) process.exit(1); if ( options.secretstoreType && !canSecretStoreHaveMappings(options.secretstoreType) @@ -64,16 +84,7 @@ export default function setup() { 'error' ); process.exitCode = 1; - } else if ( - options.secretstoreId && - options.secretId && - options.alias && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) - ) { + } else if (options.secretstoreId && options.secretId && options.alias) { verboseMessage( `Activating the mapping alias ${options.alias} in the mapping ${options.secretId} in the secret store ${options.secretstoreId}'` ); @@ -85,16 +96,8 @@ export default function setup() { options.global ); if (!outcome) process.exitCode = 1; - } else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.outputHelp(); - process.exitCode = 1; } } - // end command logic inside action handler ); return program; } diff --git a/src/cli/secretstore/secretstore-mapping-alias-create.ts b/src/cli/secretstore/secretstore-mapping-alias-create.ts index 2a99d9f0a..59b63c6c9 100644 --- a/src/cli/secretstore/secretstore-mapping-alias-create.ts +++ b/src/cli/secretstore/secretstore-mapping-alias-create.ts @@ -61,47 +61,44 @@ export default function setup() { options, command ); - if ( - options.secretstoreType && - !canSecretStoreHaveMappings(options.secretstoreType) - ) { + + if (!options.secretstoreId || !options.secretId || !options.alias) { printMessage( - `'${options.secretstoreType}' does not have mappings.`, + 'Unrecognized combination of options or no options...', 'error' ); process.exitCode = 1; - } else if ( - options.secretstoreId && - options.secretId && - options.alias && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) + program.help(); + } + const getTokensIsSucessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : deploymentTypes + ); + if (!getTokensIsSucessful) process.exit(1); + if ( + options.secretstoreType && + !canSecretStoreHaveMappings(options.secretstoreType) ) { - verboseMessage( - `Creating the mapping alias ${options.alias} in the mapping ${options.secretId} in the secret store ${options.secretstoreId}'` - ); - const outcome = await createSecretStoreMappingAlias( - options.secretstoreId, - options.secretstoreType, - options.secretId, - options.alias, - options.activate, - options.global - ); - if (!outcome) process.exitCode = 1; - } else { printMessage( - 'Unrecognized combination of options or no options...', + `'${options.secretstoreType}' does not have mappings.`, 'error' ); - program.outputHelp(); - process.exitCode = 1; + process.exit(1); } + verboseMessage( + `Creating the mapping alias ${options.alias} in the mapping ${options.secretId} in the secret store ${options.secretstoreId}'` + ); + const outcome = await createSecretStoreMappingAlias( + options.secretstoreId, + options.secretstoreType, + options.secretId, + options.alias, + options.activate, + options.global + ); + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; } diff --git a/src/cli/secretstore/secretstore-mapping-alias-delete.ts b/src/cli/secretstore/secretstore-mapping-alias-delete.ts index e57988d6d..a0e21e505 100644 --- a/src/cli/secretstore/secretstore-mapping-alias-delete.ts +++ b/src/cli/secretstore/secretstore-mapping-alias-delete.ts @@ -64,6 +64,19 @@ export default function setup() { options, command ); + if ( + !options.secretstoreId && + !options.secretId && + !options.alias && + !options.all + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } if ( options.secretstoreType && !canSecretStoreHaveMappings(options.secretstoreType) @@ -72,58 +85,39 @@ export default function setup() { `'${options.secretstoreType}' does not have mappings.`, 'error' ); - process.exitCode = 1; - } else if ( - options.secretstoreId && - options.secretId && - options.alias && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) - ) { + process.exit(1); + } + const getTokensIsSucessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : deploymentTypes + ); + if (!getTokensIsSucessful) process.exit(1); + let outcome: boolean; + if (options.secretstoreId && options.secretId && options.alias) { verboseMessage( `Deleting alias ${options.alias} from secret store mapping ${options.secretId} from secret store ${options.secretstoreId}...` ); - const outcome = await deleteSecretStoreMappingAlias( + outcome = await deleteSecretStoreMappingAlias( options.secretstoreId, options.secretstoreType, options.secretId, options.alias, options.global ); - if (!outcome) process.exitCode = 1; - } else if ( - options.secretstoreId && - options.secretId && - options.all && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) - ) { + } else if (options.secretstoreId && options.secretId && options.all) { verboseMessage( `Deleting all aliases except active one from secret store mapping ${options.secretId} from secret store ${options.secretstoreId}...` ); - const outcome = await deleteSecretStoreMappingAliases( + outcome = await deleteSecretStoreMappingAliases( options.secretstoreId, options.secretstoreType, options.secretId, options.global ); - if (!outcome) process.exitCode = 1; - } else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.outputHelp(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; } diff --git a/src/cli/secretstore/secretstore-mapping-alias-list.ts b/src/cli/secretstore/secretstore-mapping-alias-list.ts index f7047eaee..2895a1554 100644 --- a/src/cli/secretstore/secretstore-mapping-alias-list.ts +++ b/src/cli/secretstore/secretstore-mapping-alias-list.ts @@ -60,45 +60,42 @@ export default function setup() { options, command ); - if ( - options.secretstoreType && - !canSecretStoreHaveMappings(options.secretstoreType) - ) { + if (!options.secretstoreId || !options.secretId) { printMessage( - `'${options.secretstoreType}' does not have mappings.`, + 'Unrecognized combination of options or no options...', 'error' ); process.exitCode = 1; - } else if ( - options.secretstoreId && - options.secretId && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) + program.help(); + } + if ( + options.secretstoreType && + !canSecretStoreHaveMappings(options.secretstoreType) ) { - verboseMessage( - `Listing all secret store mappings for the secret store '${options.secretstoreId}'` - ); - const outcome = await listSecretStoreMappingAliases( - options.secretstoreId, - options.secretstoreType, - options.secretId, - options.long, - options.global - ); - if (!outcome) process.exitCode = 1; - } else { printMessage( - 'Unrecognized combination of options or no options...', + `'${options.secretstoreType}' does not have mappings.`, 'error' ); - program.outputHelp(); - process.exitCode = 1; + process.exit(1); } + const getTokensIsSucessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : deploymentTypes + ); + if (!getTokensIsSucessful) process.exit(1); + verboseMessage( + `Listing all secret store mappings for the secret store '${options.secretstoreId}'` + ); + const outcome = await listSecretStoreMappingAliases( + options.secretstoreId, + options.secretstoreType, + options.secretId, + options.long, + options.global + ); + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; } diff --git a/src/cli/secretstore/secretstore-mapping-create.ts b/src/cli/secretstore/secretstore-mapping-create.ts index 6fc007e1d..00fb2317c 100644 --- a/src/cli/secretstore/secretstore-mapping-create.ts +++ b/src/cli/secretstore/secretstore-mapping-create.ts @@ -63,46 +63,42 @@ export default function setup() { options, command ); - if ( - options.secretstoreType && - !canSecretStoreHaveMappings(options.secretstoreType) - ) { + if (!options.secretstoreId || !options.secretId || !options.aliases) { printMessage( - `'${options.secretstoreType}' does not have mappings.`, + 'Unrecognized combination of options or no options...', 'error' ); process.exitCode = 1; - } else if ( - options.secretstoreId && - options.secretId && - options.aliases && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) + program.help(); + } + if ( + options.secretstoreType && + !canSecretStoreHaveMappings(options.secretstoreType) ) { - verboseMessage( - `Creating the mapping ${options.secretId} in the secret store ${options.secretstoreId}'` - ); - const outcome = await createSecretStoreMapping( - options.secretstoreId, - options.secretstoreType, - options.secretId, - options.aliases, - options.global - ); - if (!outcome) process.exitCode = 1; - } else { printMessage( - 'Unrecognized combination of options or no options...', + `'${options.secretstoreType}' does not have mappings.`, 'error' ); - program.outputHelp(); - process.exitCode = 1; + process.exit(1); } + const getTokensIsSucessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : deploymentTypes + ); + if (!getTokensIsSucessful) process.exit(1); + verboseMessage( + `Creating the mapping ${options.secretId} in the secret store ${options.secretstoreId}'` + ); + const outcome = await createSecretStoreMapping( + options.secretstoreId, + options.secretstoreType, + options.secretId, + options.aliases, + options.global + ); + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; diff --git a/src/cli/secretstore/secretstore-mapping-delete.ts b/src/cli/secretstore/secretstore-mapping-delete.ts index b223e7d3a..2ce8c76bf 100644 --- a/src/cli/secretstore/secretstore-mapping-delete.ts +++ b/src/cli/secretstore/secretstore-mapping-delete.ts @@ -61,6 +61,14 @@ export default function setup() { options, command ); + if (!options.secretstoreId && !options.secretId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } if ( options.secretstoreType && !canSecretStoreHaveMappings(options.secretstoreType) @@ -69,54 +77,37 @@ export default function setup() { `'${options.secretstoreType}' does not have mappings.`, 'error' ); - process.exitCode = 1; - } else if ( - options.secretstoreId && - options.secretId && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) - ) { + process.exit(1); + } + const getTokensIsSucessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : deploymentTypes + ); + if (!getTokensIsSucessful) process.exit(1); + let outcome: boolean; + if (options.secretstoreId && options.secretId) { verboseMessage( `Deleting secret store mapping ${options.secretId} from secret store ${options.secretstoreId}...` ); - const outcome = await deleteSecretStoreMapping( + outcome = await deleteSecretStoreMapping( options.secretstoreId, options.secretstoreType, options.secretId, options.global ); - if (!outcome) process.exitCode = 1; - } else if ( - options.secretstoreId && - options.all && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) - ) { + } else if (options.secretstoreId && options.all) { verboseMessage( `Deleting secret store mappings from secret store ${options.secretstoreId}...` ); - const outcome = await deleteSecretStoreMappings( + outcome = await deleteSecretStoreMappings( options.secretstoreId, options.secretstoreType, options.global ); - if (!outcome) process.exitCode = 1; - } else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.outputHelp(); - process.exitCode = 1; } + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; } diff --git a/src/cli/secretstore/secretstore-mapping-list.ts b/src/cli/secretstore/secretstore-mapping-list.ts index 5b3f60b5c..99ff01ce1 100644 --- a/src/cli/secretstore/secretstore-mapping-list.ts +++ b/src/cli/secretstore/secretstore-mapping-list.ts @@ -54,43 +54,42 @@ export default function setup() { options, command ); - if ( - options.secretstoreType && - !canSecretStoreHaveMappings(options.secretstoreType) - ) { + if (!options.secretstoreType && !options.secretstoreId) { printMessage( - `'${options.secretstoreType}' does not have mappings.`, + 'Unrecognized combination of options or no options...', 'error' ); process.exitCode = 1; - } else if ( - options.secretstoreId && - (await getTokens( - false, - true, - options.global ? globalDeploymentTypes : deploymentTypes - )) + program.help(); + } + if ( + options.secretstoreType && + !canSecretStoreHaveMappings(options.secretstoreType) ) { - verboseMessage( - `Listing all secret store mappings for the secret store '${options.secretstoreId}'` - ); - const outcome = await listSecretStoreMappings( - options.secretstoreId, - options.secretstoreType, - options.long, - options.global - ); - if (!outcome) process.exitCode = 1; - } else { printMessage( - 'Unrecognized combination of options or no options...', + `'${options.secretstoreType}' does not have mappings.`, 'error' ); - program.outputHelp(); - process.exitCode = 1; + process.exit(1); } + const getTokensIsSucessful = await getTokens( + false, + true, + options.global ? globalDeploymentTypes : deploymentTypes + ); + if (!getTokensIsSucessful) process.exit(1); + + verboseMessage( + `Listing all secret store mappings for the secret store '${options.secretstoreId}'` + ); + const outcome = await listSecretStoreMappings( + options.secretstoreId, + options.secretstoreType, + options.long, + options.global + ); + if (!outcome) process.exitCode = 1; } - // end command logic inside action handler ); return program; } diff --git a/src/cli/server/server-delete.ts b/src/cli/server/server-delete.ts index eece527ef..389e043d9 100644 --- a/src/cli/server/server-delete.ts +++ b/src/cli/server/server-delete.ts @@ -37,7 +37,13 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/server/server-describe.ts b/src/cli/server/server-describe.ts index 0fb139613..566c2c234 100644 --- a/src/cli/server/server-describe.ts +++ b/src/cli/server/server-describe.ts @@ -35,7 +35,13 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (options) { // code goes here } else { process.exitCode = 1; diff --git a/src/cli/server/server-export.ts b/src/cli/server/server-export.ts index 583ab4b8d..b1ae6ed47 100644 --- a/src/cli/server/server-export.ts +++ b/src/cli/server/server-export.ts @@ -73,11 +73,28 @@ export default function setup() { options, command ); - // export by id or url if ( - (options.serverId || options.serverUrl) && - (await getTokens(false, true, deploymentTypes)) + !options.serverId && + !options.serverUrl && + !options.all && + !options.allSeparate ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + // export by id or url + if (options.serverId || options.serverUrl) { verboseMessage( `Exporting server ${options.serverId || options.serverUrl}...` ); @@ -94,10 +111,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage(`Exporting all servers to a single file...`); const outcome = await exportServersToFile( options.file, @@ -110,10 +124,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate) { verboseMessage('Exporting all servers to separate files...'); const outcome = await exportServersToFiles( options.extract, @@ -124,17 +135,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/server/server-import.ts b/src/cli/server/server-import.ts index 4c0c76504..7669b6b32 100644 --- a/src/cli/server/server-import.ts +++ b/src/cli/server/server-import.ts @@ -62,12 +62,28 @@ export default function setup() { options, command ); - // import by id or url if ( - (options.serverId || options.serverUrl) && - options.file && - (await getTokens(false, true, deploymentTypes)) + !options.serverId && + !options.serverUrl && + !options.all && + !options.allSeparate && + !options.file ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + // import by id or url + if ((options.serverId || options.serverUrl) && options.file) { verboseMessage( `Importing server ${options.serverId || options.serverUrl}...` ); @@ -82,11 +98,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all && options.file) { verboseMessage( `Importing all servers from a single file (${options.file})...` ); @@ -96,10 +108,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate) { verboseMessage('Importing all servers from separate files...'); const outcome = await importServersFromFiles({ includeDefault: options.default, @@ -107,27 +116,14 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // import first server in file - else if ( - options.file && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.file) { verboseMessage('Importing first server in file...'); const outcome = await importFirstServerFromFile(options.file, { includeDefault: options.default, }); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/server/server-list.ts b/src/cli/server/server-list.ts index 72e94977b..42e108dff 100644 --- a/src/cli/server/server-list.ts +++ b/src/cli/server/server-list.ts @@ -29,13 +29,15 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage(`Listing all servers`); - const outcome = await listServers(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Listing all servers`); + const outcome = await listServers(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/src/cli/service/service-delete.ts b/src/cli/service/service-delete.ts index 92a7867e5..a9cbe82bc 100644 --- a/src/cli/service/service-delete.ts +++ b/src/cli/service/service-delete.ts @@ -2,6 +2,7 @@ import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; import { deleteService, deleteServices } from '../../ops/ServiceOps.js'; +import { printMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; export default function setup() { @@ -42,16 +43,23 @@ export default function setup() { ); const globalConfig = options.global ?? false; + if (!options.id && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); - if (options.id && (await getTokens())) { + if (options.id) { const outcome = await deleteService(options.id, globalConfig); if (!outcome) process.exitCode = 1; - } else if (options.all && (await getTokens())) { + } else if (options.all) { const outcome = await deleteServices(globalConfig); if (!outcome) process.exitCode = 1; - } else { - program.help(); - process.exitCode = 1; } } ); diff --git a/src/cli/service/service-export.ts b/src/cli/service/service-export.ts index 6f4022bbf..e6ceafd40 100644 --- a/src/cli/service/service-export.ts +++ b/src/cli/service/service-export.ts @@ -69,8 +69,19 @@ export default function setup() { const globalConfig = options.global ?? false; + if (!options.serviceId && !options.all && !options.allSeparate) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // export by name - if (options.serviceId && (await getTokens())) { + if (options.serviceId) { verboseMessage('Exporting service...'); const outcome = await exportServiceToFile( options.serviceId, @@ -81,7 +92,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // -a / --all - else if (options.all && (await getTokens())) { + else if (options.all) { verboseMessage('Exporting all services to a single file...'); const outcome = await exportServicesToFile( options.file, @@ -91,7 +102,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // -A / --all-separate - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Exporting all services to separate files...'); const outcome = await exportServicesToFiles( globalConfig, @@ -99,17 +110,7 @@ export default function setup() { ); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/service/service-import.ts b/src/cli/service/service-import.ts index 2b6b22529..624b16ae1 100644 --- a/src/cli/service/service-import.ts +++ b/src/cli/service/service-import.ts @@ -91,8 +91,24 @@ export default function setup() { ? false : (options.currentRealm ?? false); + if ( + !options.serviceId && + !options.file && + !options.all && + !options.allSeparate + ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + // import by id - if (options.serviceId && options.file && (await getTokens())) { + if (options.serviceId && options.file) { verboseMessage('Importing service...'); const outcome = await importServiceFromFile( options.serviceId, @@ -106,7 +122,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // -a / --all - else if (options.all && options.file && (await getTokens())) { + else if (options.all && options.file) { verboseMessage('Importing all services from a single file...'); const outcome = await importServicesFromFile(options.file, { clean, @@ -116,7 +132,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // -A / --all-separate - else if (options.allSeparate && (await getTokens())) { + else if (options.allSeparate) { verboseMessage('Importing all services from separate files...'); const outcome = await importServicesFromFiles({ clean, @@ -126,7 +142,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // import file - else if (options.file && (await getTokens())) { + else if (options.file) { verboseMessage('Importing service...'); const outcome = await importFirstServiceFromFile(options.file, { clean, @@ -135,17 +151,7 @@ export default function setup() { }); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/service/service-list.ts b/src/cli/service/service-list.ts index c303700f1..9bfb423da 100644 --- a/src/cli/service/service-list.ts +++ b/src/cli/service/service-list.ts @@ -23,13 +23,11 @@ export default function setup() { options, command ); - if (await getTokens()) { - verboseMessage(`Listing all AM services for realm: ${realm}`); - const outcome = await listServices(options.long, options.global); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens(); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Listing all AM services for realm: ${realm}`); + const outcome = await listServices(options.long, options.global); + if (!outcome) process.exitCode = 1; }); return program; diff --git a/src/cli/theme/theme-delete.ts b/src/cli/theme/theme-delete.ts index 3558a4b62..d184ef7ce 100644 --- a/src/cli/theme/theme-delete.ts +++ b/src/cli/theme/theme-delete.ts @@ -52,11 +52,23 @@ export default function setup() { options, command ); + if (!options.themeName && !options.themeId && !options.all) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + // delete by name - if ( - options.themeName && - (await getTokens(false, true, deploymentTypes)) - ) { + if (options.themeName) { verboseMessage( `Deleting theme with name "${ options.themeName @@ -66,10 +78,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // delete by id - else if ( - options.themeId && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.themeId) { verboseMessage( `Deleting theme with id "${ options.themeId @@ -79,27 +88,14 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage( `Deleting all themes from realm "${state.getRealm()}"...` ); const outcome = await deleteThemes(); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/theme/theme-export.ts b/src/cli/theme/theme-export.ts index b8077b171..7ce1628fc 100644 --- a/src/cli/theme/theme-export.ts +++ b/src/cli/theme/theme-export.ts @@ -71,11 +71,28 @@ export default function setup() { options, command ); - // export by name if ( - options.themeName && - (await getTokens(false, true, deploymentTypes)) + !options.themeName && + !options.themeId && + !options.all && + !options.allSeparate ) { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + process.exitCode = 1; + program.help(); + } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + + // export by name + if (options.themeName) { verboseMessage( `Exporting theme "${ options.themeName @@ -89,10 +106,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // export by id - else if ( - options.themeId && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.themeId) { verboseMessage( `Exporting theme "${ options.themeId @@ -106,10 +120,7 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all -a - else if ( - options.all && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.all) { verboseMessage('Exporting all themes to a single file...'); const outcome = await exportThemesToFile( options.file, @@ -118,25 +129,12 @@ export default function setup() { if (!outcome) process.exitCode = 1; } // --all-separate -A - else if ( - options.allSeparate && - (await getTokens(false, true, deploymentTypes)) - ) { + else if (options.allSeparate) { verboseMessage('Exporting all themes to separate files...'); const outcome = await exportThemesToFiles(options.metadata); if (!outcome) process.exitCode = 1; } - // unrecognized combination of options or no options - else { - printMessage( - 'Unrecognized combination of options or no options...', - 'error' - ); - program.help(); - process.exitCode = 1; - } } - // end command logic inside action handler ); return program; diff --git a/src/cli/theme/theme-list.ts b/src/cli/theme/theme-list.ts index 978fc2124..738cd7b61 100644 --- a/src/cli/theme/theme-list.ts +++ b/src/cli/theme/theme-list.ts @@ -33,13 +33,15 @@ export default function setup() { options, command ); - if (await getTokens(false, true, deploymentTypes)) { - verboseMessage(`Listing themes in realm "${state.getRealm()}"...`); - const outcome = await listThemes(options.long); - if (!outcome) process.exitCode = 1; - } else { - process.exitCode = 1; - } + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage(`Listing themes in realm "${state.getRealm()}"...`); + const outcome = await listThemes(options.long); + if (!outcome) process.exitCode = 1; } // end command logic inside action handler ); diff --git a/test/e2e/__snapshots__/idp-delete.e2e.test.js.snap b/test/e2e/__snapshots__/idp-delete.e2e.test.js.snap index da4abf1d0..02729e9b7 100644 --- a/test/e2e/__snapshots__/idp-delete.e2e.test.js.snap +++ b/test/e2e/__snapshots__/idp-delete.e2e.test.js.snap @@ -1,27 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`"frodo idp delete -i insta" "frodo idp delete -i insta": should delete idp config with Id insta 1`] = ` -"Usage: frodo idp delete [options] [host] [realm] [username] [password] - -Delete (social) identity providers. - -Arguments: - host AM base URL, e.g.: https://cdk.iam.example.com/am. To - use a connection profile, just specify a unique - substring or alias. - realm Realm. Specify realm as '/' for the root realm or - 'realm' or '/parent/child' otherwise. (default: "alpha" - for Identity Cloud tenants, "/" otherwise.) - username Username to login with. Must be an admin user with - appropriate rights to manage authentication - journeys/trees. - password Password. - -Options: - -i, --idp-id Id/name of a provider. - -h, --help Help - -hh, --help-more Help with all options. - -hhh, --help-all Help with all options, environment variables, and usage - examples. -" -`; +exports[`"frodo idp delete -i insta" "frodo idp delete -i insta": should delete idp config with Id insta 1`] = `""`; diff --git a/test/e2e/__snapshots__/secretstore-delete.e2e.test.js.snap b/test/e2e/__snapshots__/secretstore-delete.e2e.test.js.snap index 23b79b7bd..343148784 100644 --- a/test/e2e/__snapshots__/secretstore-delete.e2e.test.js.snap +++ b/test/e2e/__snapshots__/secretstore-delete.e2e.test.js.snap @@ -4,7 +4,6 @@ exports[`frodo secretstore delete "frodo secretstore delete --all": should fail "Error getting tokens Service account login error Unsupported deployment type: 'cloud' not in classic -Unrecognized combination of options or no options... " `; @@ -49,7 +48,6 @@ exports[`frodo secretstore delete "frodo secretstore delete -i ESV": should fail "Error getting tokens Service account login error Unsupported deployment type: 'cloud' not in classic -Unrecognized combination of options or no options... " `; diff --git a/test/e2e/__snapshots__/secretstore-mapping-alias-activate.e2e.test.js.snap b/test/e2e/__snapshots__/secretstore-mapping-alias-activate.e2e.test.js.snap index ea93058b4..65ede33b7 100644 --- a/test/e2e/__snapshots__/secretstore-mapping-alias-activate.e2e.test.js.snap +++ b/test/e2e/__snapshots__/secretstore-mapping-alias-activate.e2e.test.js.snap @@ -8,7 +8,111 @@ exports[`frodo secretstore mapping alias activate "frodo secretstore mapping ali `; exports[`frodo secretstore mapping alias activate "frodo secretstore mapping alias activate -gi EnvironmentAndSystemPropertySecretStore -t EnvironmentAndSystemPropertySecretStore -s am.services.httpclient.mtls.clientcert.testClientCert.secret -a alias -m classic": should fail since EnvironmentAndSystemPropertySecretStore has no mappings 1`] = ` -"'EnvironmentAndSystemPropertySecretStore' does not have mappings. +"Errored âžž GET http://openam-frodo-dev.classic.com:8080/am/json/serverinfo/* _PollyError: [Polly] [adapter:node-http] Recording for the following request is not found and \`recordIfMissing\` is \`false\`. +{ + "url": "http://openam-frodo-dev.classic.com:8080/am/json/serverinfo/*", + "method": "GET", + "headers": { + "accept": "application/json, text/plain, */*", + "content-type": "application/json", + "user-agent": "@rockcarver/frodo-lib/4.0.0-37", + "x-forgerock-transactionid": "frodo-9d8b506c-fabd-45ac-9005-1dbc3f1db2b8", + "accept-api-version": "resource=1.1", + "accept-encoding": "gzip, compress, deflate, br", + "host": "openam-frodo-dev.classic.com:8080" + }, + "body": "", + "recordingName": "secretstore/mapping-alias-activate/0_gi_t_s_a_m/am", + "id": "ccd7a5defd0fdeaa986a2b54642d911a", + "order": 0, + "identifiers": { + "method": "GET", + "url": "/am/json/serverinfo/*" + }, + "config": { + "mode": "replay", + "adapters": [ + "node-http" + ], + "logLevel": "warn", + "flushRequestsOnStop": true, + "recordIfMissing": false, + "recordFailedRequests": true, + "expiresIn": null, + "expiryStrategy": "warn", + "matchRequestsBy": { + "method": true, + "headers": false, + "body": true, + "order": false, + "url": { + "protocol": false, + "username": false, + "password": false, + "hostname": false, + "port": false, + "pathname": true, + "query": true, + "hash": true + } + } + } +} + at assert (/snapshot/dist/app.cjs:143614:11) + at FrodoNodeHttpAdapter.assert (/snapshot/dist/app.cjs:157395:5) + at FrodoNodeHttpAdapter.replay (/snapshot/dist/app.cjs:157384:10) + at async FrodoNodeHttpAdapter.handleRequest (/snapshot/dist/app.cjs:157268:7) +Error getting tokens + [Polly] [adapter:node-http] Recording for the following request is not found and \`recordIfMissing\` is \`false\`. +{ + "url": "http://openam-frodo-dev.classic.com:8080/am/json/serverinfo/*", + "method": "GET", + "headers": { + "accept": "application/json, text/plain, */*", + "content-type": "application/json", + "user-agent": "@rockcarver/frodo-lib/4.0.0-37", + "x-forgerock-transactionid": "frodo-9d8b506c-fabd-45ac-9005-1dbc3f1db2b8", + "accept-api-version": "resource=1.1", + "accept-encoding": "gzip, compress, deflate, br", + "host": "openam-frodo-dev.classic.com:8080" + }, + "body": "", + "recordingName": "secretstore/mapping-alias-activate/0_gi_t_s_a_m/am", + "id": "ccd7a5defd0fdeaa986a2b54642d911a", + "order": 0, + "identifiers": { + "method": "GET", + "url": "/am/json/serverinfo/*" + }, + "config": { + "mode": "replay", + "adapters": [ + "node-http" + ], + "logLevel": "warn", + "flushRequestsOnStop": true, + "recordIfMissing": false, + "recordFailedRequests": true, + "expiresIn": null, + "expiryStrategy": "warn", + "matchRequestsBy": { + "method": true, + "headers": false, + "body": true, + "order": false, + "url": { + "protocol": false, + "username": false, + "password": false, + "hostname": false, + "port": false, + "pathname": true, + "query": true, + "hash": true + } + } + } +} " `; diff --git a/test/e2e/__snapshots__/secretstore-mapping-alias-create.e2e.test.js.snap b/test/e2e/__snapshots__/secretstore-mapping-alias-create.e2e.test.js.snap index dfb6882a2..f9e915bb9 100644 --- a/test/e2e/__snapshots__/secretstore-mapping-alias-create.e2e.test.js.snap +++ b/test/e2e/__snapshots__/secretstore-mapping-alias-create.e2e.test.js.snap @@ -15,7 +15,111 @@ exports[`frodo secretstore mapping alias create "frodo secretstore mapping alias `; exports[`frodo secretstore mapping alias create "frodo secretstore mapping alias create -gi EnvironmentAndSystemPropertySecretStore -t EnvironmentAndSystemPropertySecretStore -s am.services.httpclient.mtls.clientcert.testClientCert.secret -a alias -m classic": should fail since EnvironmentAndSystemPropertySecretStore has no mappings 1`] = ` -"'EnvironmentAndSystemPropertySecretStore' does not have mappings. +"Errored âžž GET http://openam-frodo-dev.classic.com:8080/am/json/serverinfo/* _PollyError: [Polly] [adapter:node-http] Recording for the following request is not found and \`recordIfMissing\` is \`false\`. +{ + "url": "http://openam-frodo-dev.classic.com:8080/am/json/serverinfo/*", + "method": "GET", + "headers": { + "accept": "application/json, text/plain, */*", + "content-type": "application/json", + "user-agent": "@rockcarver/frodo-lib/4.0.0-37", + "x-forgerock-transactionid": "frodo-914e8167-6ef6-4763-b832-bb3ab1cc4f6c", + "accept-api-version": "resource=1.1", + "accept-encoding": "gzip, compress, deflate, br", + "host": "openam-frodo-dev.classic.com:8080" + }, + "body": "", + "recordingName": "secretstore/mapping-alias-create/0_gi_t_s_a_m/am", + "id": "ccd7a5defd0fdeaa986a2b54642d911a", + "order": 0, + "identifiers": { + "method": "GET", + "url": "/am/json/serverinfo/*" + }, + "config": { + "mode": "replay", + "adapters": [ + "node-http" + ], + "logLevel": "warn", + "flushRequestsOnStop": true, + "recordIfMissing": false, + "recordFailedRequests": true, + "expiresIn": null, + "expiryStrategy": "warn", + "matchRequestsBy": { + "method": true, + "headers": false, + "body": true, + "order": false, + "url": { + "protocol": false, + "username": false, + "password": false, + "hostname": false, + "port": false, + "pathname": true, + "query": true, + "hash": true + } + } + } +} + at assert (/snapshot/dist/app.cjs:143614:11) + at FrodoNodeHttpAdapter.assert (/snapshot/dist/app.cjs:157395:5) + at FrodoNodeHttpAdapter.replay (/snapshot/dist/app.cjs:157384:10) + at async FrodoNodeHttpAdapter.handleRequest (/snapshot/dist/app.cjs:157268:7) +Error getting tokens + [Polly] [adapter:node-http] Recording for the following request is not found and \`recordIfMissing\` is \`false\`. +{ + "url": "http://openam-frodo-dev.classic.com:8080/am/json/serverinfo/*", + "method": "GET", + "headers": { + "accept": "application/json, text/plain, */*", + "content-type": "application/json", + "user-agent": "@rockcarver/frodo-lib/4.0.0-37", + "x-forgerock-transactionid": "frodo-914e8167-6ef6-4763-b832-bb3ab1cc4f6c", + "accept-api-version": "resource=1.1", + "accept-encoding": "gzip, compress, deflate, br", + "host": "openam-frodo-dev.classic.com:8080" + }, + "body": "", + "recordingName": "secretstore/mapping-alias-create/0_gi_t_s_a_m/am", + "id": "ccd7a5defd0fdeaa986a2b54642d911a", + "order": 0, + "identifiers": { + "method": "GET", + "url": "/am/json/serverinfo/*" + }, + "config": { + "mode": "replay", + "adapters": [ + "node-http" + ], + "logLevel": "warn", + "flushRequestsOnStop": true, + "recordIfMissing": false, + "recordFailedRequests": true, + "expiresIn": null, + "expiryStrategy": "warn", + "matchRequestsBy": { + "method": true, + "headers": false, + "body": true, + "order": false, + "url": { + "protocol": false, + "username": false, + "password": false, + "hostname": false, + "port": false, + "pathname": true, + "query": true, + "hash": true + } + } + } +} " `; diff --git a/test/e2e/idp-delete.e2e.test.js b/test/e2e/idp-delete.e2e.test.js index 6c15e678f..b763af981 100644 --- a/test/e2e/idp-delete.e2e.test.js +++ b/test/e2e/idp-delete.e2e.test.js @@ -47,7 +47,7 @@ */ /* -FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idp delete -i insta openam +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idp delete -i insta */ import cp from 'child_process'; import { promisify } from 'util'; diff --git a/test/e2e/mocks/idp_2110767280/delete_1740784714/0_i_2777908795/am_1076162899/recording.har b/test/e2e/mocks/idp_2110767280/delete_1740784714/0_i_2777908795/am_1076162899/recording.har new file mode 100644 index 000000000..7ccd9277f --- /dev/null +++ b/test/e2e/mocks/idp_2110767280/delete_1740784714/0_i_2777908795/am_1076162899/recording.har @@ -0,0 +1,616 @@ +{ + "log": { + "_recordingName": "idp/delete/0_i/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-36" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 615, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 615, + "text": "{\"_id\":\"*\",\"_rev\":\"1955877839\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1955877839\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "615" + }, + { + "name": "date", + "value": "Wed, 22 Apr 2026 15:10:22 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 787, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T15:10:22.302Z", + "time": 129, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 129 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-36" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1916, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 275, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 275, + "text": "{\"_id\":\"version\",\"_rev\":\"1171477248\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 304c60a9fe7797e1045c631600098d4465b73e4d (2026-April-15 10:21)\",\"revision\":\"304c60a9fe7797e1045c631600098d4465b73e4d\",\"date\":\"2026-April-15 10:21\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1171477248\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "275" + }, + { + "name": "date", + "value": "Wed, 22 Apr 2026 15:10:22 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 787, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T15:10:22.580Z", + "time": 164, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 164 + } + }, + { + "_id": "fd73e4ce797b9b32578e46481feba4a3", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 2, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-36" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 2025, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{}" + }, + "queryString": [ + { + "name": "_action", + "value": "nextdescendents" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/realms/root/realms/alpha/realm-config/services/SocialIdentityProviders?_action=nextdescendents" + }, + "response": { + "bodySize": 3957, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 3957, + "text": "{\"result\":[{\"pkceMethod\":\"S256\",\"clientId\":\"client123\",\"jwtEncryptionMethod\":\"NONE\",\"jwtEncryptionAlgorithm\":\"NONE\",\"authorizationEndpoint\":\"https://api.instagram.com/oauth/authorize/\",\"issuerComparisonCheckType\":\"EXACT\",\"scopeDelimiter\":\",\",\"scopes\":[\"user_profile\"],\"introspectEndpoint\":\"https://graph.instagram.com/debug_token\",\"enabled\":false,\"authenticationIdKey\":\"id\",\"uiConfig\":{\"buttonCustomStyle\":\"background-color: #3f729b; border-color: #3f729b;color: white;\",\"buttonCustomStyleHover\":\"background-color: #305777; border-color: #305777;color: white;\",\"buttonImage\":\"\",\"buttonClass\":\"fa-instagram\",\"buttonDisplayName\":\"Instagram\"},\"privateKeyJwtExpTime\":600,\"revocationCheckOptions\":[],\"transform\":\"1244e639-4a31-401d-ab61-d75133d8dc9e\",\"userInfoEndpoint\":\"https://graph.instagram.com/me?fields=id,username\",\"jwtSigningAlgorithm\":\"NONE\",\"redirectURI\":\"http://test.com\",\"responseMode\":\"DEFAULT\",\"useCustomTrustStore\":false,\"clientAuthenticationMethod\":\"CLIENT_SECRET_POST\",\"tokenEndpoint\":\"https://api.instagram.com/oauth/access_token\",\"_id\":\"insta\",\"_type\":{\"_id\":\"instagramConfig\",\"name\":\"Client configuration for Instagram.\",\"collection\":true}},{\"clientId\":\"bdae6d141d4dcf95a630\",\"pkceMethod\":\"S256\",\"jwtEncryptionMethod\":\"NONE\",\"authorizationEndpoint\":\"https://github.com/login/oauth/authorize\",\"jwtEncryptionAlgorithm\":\"NONE\",\"issuerComparisonCheckType\":\"EXACT\",\"scopeDelimiter\":\" \",\"scopes\":[\"user\"],\"enabled\":true,\"authenticationIdKey\":\"id\",\"uiConfig\":{\"buttonCustomStyle\":\"background-color: #fff; color: #757575; border-color: #ddd;\",\"buttonCustomStyleHover\":\"color: #6d6d6d; background-color: #eee; border-color: #ccc;\",\"buttonDisplayName\":\"GitHub\",\"buttonImage\":\"https://cdn-icons-png.flaticon.com/512/25/25231.png\",\"iconBackground\":\"#4184f3\",\"iconFontColor\":\"white\"},\"privateKeyJwtExpTime\":600,\"revocationCheckOptions\":[],\"transform\":\"23143919-6b78-40c3-b25e-beca19b229e0\",\"userInfoEndpoint\":\"https://ig.mytestrun.com/user\",\"jwtSigningAlgorithm\":\"NONE\",\"redirectURI\":\"https://idc.scheuber.io/login\",\"clientAuthenticationMethod\":\"CLIENT_SECRET_POST\",\"responseMode\":\"DEFAULT\",\"useCustomTrustStore\":false,\"tokenEndpoint\":\"https://ig.mytestrun.com/login/oauth/access_token\",\"_id\":\"github\",\"_type\":{\"_id\":\"oauth2Config\",\"name\":\"Client configuration for providers that implement the OAuth2 specification.\",\"collection\":true}},{\"clientId\":\"aa9a179e-cdba-4db8-8477-3d1069d5ec04\",\"pkceMethod\":\"S256\",\"wellKnownEndpoint\":\"https://adfs.mytestrun.com/adfs/.well-known/openid-configuration\",\"jwtEncryptionMethod\":\"NONE\",\"authorizationEndpoint\":\"https://adfs.mytestrun.com/adfs/oauth2/authorize\",\"jwtEncryptionAlgorithm\":\"NONE\",\"issuerComparisonCheckType\":\"EXACT\",\"encryptJwtRequestParameter\":false,\"expClaimRequiredInRequestObject\":false,\"scopeDelimiter\":\" \",\"scopes\":[\"openid\",\"profile\",\"email\"],\"issuer\":\"https://adfs.mytestrun.com/adfs\",\"userInfoResponseType\":\"JSON\",\"acrValues\":[],\"jwksUriEndpoint\":\"https://adfs.mytestrun.com/adfs/discovery/keys\",\"encryptedIdTokens\":false,\"enabled\":true,\"jwtRequestParameterOption\":\"NONE\",\"authenticationIdKey\":\"sub\",\"uiConfig\":{\"buttonClass\":\"\",\"buttonCustomStyle\":\"background-color: #fff; border-color: #8b8b8b; color: #8b8b8b;\",\"buttonCustomStyleHover\":\"background-color: #fff; border-color: #8b8b8b; color: #8b8b8b;\",\"buttonDisplayName\":\"Microsoft ADFS\",\"buttonImage\":\"/login/images/microsoft-logo.png\",\"iconBackground\":\"#0078d7\",\"iconClass\":\"fa-windows\",\"iconFontColor\":\"white\"},\"privateKeyJwtExpTime\":600,\"revocationCheckOptions\":[],\"enableNativeNonce\":true,\"transform\":\"dbe0bf9a-72aa-49d5-8483-9db147985a47\",\"jwtSigningAlgorithm\":\"RS256\",\"redirectURI\":\"https://idc.scheuber.io/login\",\"clientAuthenticationMethod\":\"CLIENT_SECRET_POST\",\"responseMode\":\"DEFAULT\",\"useCustomTrustStore\":false,\"tokenEndpoint\":\"https://adfs.mytestrun.com/adfs/oauth2/token\",\"_id\":\"adfs\",\"_type\":{\"_id\":\"oidcConfig\",\"name\":\"Client configuration for providers that implement the OpenID Connect specification.\",\"collection\":true}}]}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "3957" + }, + { + "name": "date", + "value": "Wed, 22 Apr 2026 15:10:23 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 732, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T15:10:22.908Z", + "time": 159, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 159 + } + }, + { + "_id": "977c2c3b34a6e3d9c7c65def945c49ed", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-36" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 2006, + "httpVersion": "HTTP/1.1", + "method": "DELETE", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/realms/root/realms/alpha/realm-config/services/SocialIdentityProviders/instagramConfig/insta" + }, + "response": { + "bodySize": 1164, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1164, + "text": "{\"_id\":\"insta\",\"_rev\":\"-152165177\",\"pkceMethod\":\"S256\",\"clientId\":\"client123\",\"jwtEncryptionMethod\":\"NONE\",\"jwtEncryptionAlgorithm\":\"NONE\",\"authorizationEndpoint\":\"https://api.instagram.com/oauth/authorize/\",\"issuerComparisonCheckType\":\"EXACT\",\"scopeDelimiter\":\",\",\"scopes\":[\"user_profile\"],\"introspectEndpoint\":\"https://graph.instagram.com/debug_token\",\"enabled\":false,\"authenticationIdKey\":\"id\",\"uiConfig\":{\"buttonCustomStyle\":\"background-color: #3f729b; border-color: #3f729b;color: white;\",\"buttonCustomStyleHover\":\"background-color: #305777; border-color: #305777;color: white;\",\"buttonImage\":\"\",\"buttonClass\":\"fa-instagram\",\"buttonDisplayName\":\"Instagram\"},\"privateKeyJwtExpTime\":600,\"revocationCheckOptions\":[],\"transform\":\"1244e639-4a31-401d-ab61-d75133d8dc9e\",\"userInfoEndpoint\":\"https://graph.instagram.com/me?fields=id,username\",\"jwtSigningAlgorithm\":\"NONE\",\"redirectURI\":\"http://test.com\",\"responseMode\":\"DEFAULT\",\"useCustomTrustStore\":false,\"clientAuthenticationMethod\":\"CLIENT_SECRET_POST\",\"tokenEndpoint\":\"https://api.instagram.com/oauth/access_token\",\"_type\":{\"_id\":\"instagramConfig\",\"name\":\"Client configuration for Instagram.\",\"collection\":true}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-152165177\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1164" + }, + { + "name": "date", + "value": "Wed, 22 Apr 2026 15:10:23 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 752, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T15:10:23.072Z", + "time": 341, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 341 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/idp_2110767280/delete_1740784714/0_i_2777908795/environment_1072573434/recording.har b/test/e2e/mocks/idp_2110767280/delete_1740784714/0_i_2777908795/environment_1072573434/recording.har new file mode 100644 index 000000000..37bf30849 --- /dev/null +++ b/test/e2e/mocks/idp_2110767280/delete_1740784714/0_i_2777908795/environment_1072573434/recording.har @@ -0,0 +1,125 @@ +{ + "log": { + "_recordingName": "idp/delete/0_i/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-36" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1867, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1975, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1975, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:autoaccess:*\",\"description\":\"All Auto Access APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:ws:admin\",\"description\":\"All PingFederate APIs\"},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1975" + }, + { + "name": "etag", + "value": "W/\"7b7-9oeZSONSS8Sn+SSr15TXAygvvcE\"" + }, + { + "name": "date", + "value": "Wed, 22 Apr 2026 15:10:22 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "f7e32eaf-80be-4d4c-9788-ea7757121e7a" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 413, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T15:10:22.750Z", + "time": 71, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 71 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/idp_2110767280/delete_1740784714/0_i_2777908795/oauth2_393036114/recording.har b/test/e2e/mocks/idp_2110767280/delete_1740784714/0_i_2777908795/oauth2_393036114/recording.har new file mode 100644 index 000000000..f3897c2a6 --- /dev/null +++ b/test/e2e/mocks/idp_2110767280/delete_1740784714/0_i_2777908795/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "idp/delete/0_i/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1329, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-36" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1329" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 443, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:autoaccess:* fr:idc:content-security-policy:* fr:idc:esv:* fr:idc:certificate:* fr:idm:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1787, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1787, + "text": "{\"access_token\":\"\",\"scope\":\"fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:autoaccess:* fr:idc:content-security-policy:* fr:idc:esv:* fr:idc:certificate:* fr:idm:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1787" + }, + { + "name": "date", + "value": "Wed, 22 Apr 2026 15:10:22 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 561, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T15:10:22.447Z", + "time": 124, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 124 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/idp_2110767280/delete_1740784714/0_i_2777908795/openidm_3290118515/recording.har b/test/e2e/mocks/idp_2110767280/delete_1740784714/0_i_2777908795/openidm_3290118515/recording.har new file mode 100644 index 000000000..c2803843c --- /dev/null +++ b/test/e2e/mocks/idp_2110767280/delete_1740784714/0_i_2777908795/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "idp/delete/0_i/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-36" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1928, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/ad62492c-d064-4952-95ed-0a74ed5b2fd1?_fields=%2A" + }, + "response": { + "bodySize": 1476, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1476, + "text": "{\"_id\":\"ad62492c-d064-4952-95ed-0a74ed5b2fd1\",\"_rev\":\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\",\"accountStatus\":\"active\",\"name\":\"Frodo TriVir\",\"description\":\"Frodo service account for use by TriVir\",\"scopes\":[\"fr:am:*\",\"fr:autoaccess:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:certificate:read\",\"fr:idc:content-security-policy:read\",\"fr:idc:cookie-domain:*\",\"fr:idc:cookie-domain:read\",\"fr:idc:custom-domain:read\",\"fr:idc:custom-domain:*\",\"fr:idc:esv:*\",\"fr:idc:promotion:*\",\"fr:idc:promotion:read\",\"fr:idc:release:*\",\"fr:idc:release:read\",\"fr:idc:sso-cookie:*\",\"fr:idc:sso-cookie:read\",\"fr:idm:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"rNWWJ9vZGkyMSXhaZVBEufp3oODou19gVDLje2_AMcw2Id4bILpBJ2Ob2LF4y2yV6l4m_OXVApvj5dInLqbsn_ZQoEmqc6AP6XFqAog4w-xRy5XFHBf1cKws3a5ANcZXlw-NTnuDFvzXkQXYeGH1WSqBIeVXlpjPe0C-7vtbN4oIZyy6QaFjqv7BEjmZ1F1YoHQryPzJl58rnomcQFqIk42-UMGfQt0w63ON1mtHyQOMWUduTFIU67_jGW7YKIrYs4JO9yizKR-4Uab9M1hKkYZRUmWCgL53YJtMjg-uVRWixKhJJy3fSCBDa_SXcz-c1glbg9fGQh908WRoN3tT4B0CaeDHexLId80Vuaq3VkplH6FZHzW9-KL8Td_0kOrKKbnLgtwRvr3Fxf95hLRVm1v4QCRujlRx5wtgkCWWHl9LET1d_MeLVYrfjz4p_Ha8ui8eWNPQLIPPcP3rbHX1py9zHHREt2Jp7ezA-lFnHbCAaoO4IksT5cIjmx1p1I_JhrVECXTn3J-s0ow3w9YIksXPovT2m-ytDWcqRJ-37OCr9xcO9CK2q9HAOjoqIpkJ0TfHrXw-YpqV9QR-sF79h-qwivBY2yrAUkfKoJwbBgjX60EDUpjEj5g157Jj576GVZtdRZgHRwzdcIFP2KyBrD3AfStpybVu2L2ZoOgebs0\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 22 Apr 2026 15:10:22 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1476" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T15:10:22.579Z", + "time": 83, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 83 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-36" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1928, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/ad62492c-d064-4952-95ed-0a74ed5b2fd1?_fields=%2A" + }, + "response": { + "bodySize": 1476, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1476, + "text": "{\"_id\":\"ad62492c-d064-4952-95ed-0a74ed5b2fd1\",\"_rev\":\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\",\"accountStatus\":\"active\",\"name\":\"Frodo TriVir\",\"description\":\"Frodo service account for use by TriVir\",\"scopes\":[\"fr:am:*\",\"fr:autoaccess:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:certificate:read\",\"fr:idc:content-security-policy:read\",\"fr:idc:cookie-domain:*\",\"fr:idc:cookie-domain:read\",\"fr:idc:custom-domain:read\",\"fr:idc:custom-domain:*\",\"fr:idc:esv:*\",\"fr:idc:promotion:*\",\"fr:idc:promotion:read\",\"fr:idc:release:*\",\"fr:idc:release:read\",\"fr:idc:sso-cookie:*\",\"fr:idc:sso-cookie:read\",\"fr:idm:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"rNWWJ9vZGkyMSXhaZVBEufp3oODou19gVDLje2_AMcw2Id4bILpBJ2Ob2LF4y2yV6l4m_OXVApvj5dInLqbsn_ZQoEmqc6AP6XFqAog4w-xRy5XFHBf1cKws3a5ANcZXlw-NTnuDFvzXkQXYeGH1WSqBIeVXlpjPe0C-7vtbN4oIZyy6QaFjqv7BEjmZ1F1YoHQryPzJl58rnomcQFqIk42-UMGfQt0w63ON1mtHyQOMWUduTFIU67_jGW7YKIrYs4JO9yizKR-4Uab9M1hKkYZRUmWCgL53YJtMjg-uVRWixKhJJy3fSCBDa_SXcz-c1glbg9fGQh908WRoN3tT4B0CaeDHexLId80Vuaq3VkplH6FZHzW9-KL8Td_0kOrKKbnLgtwRvr3Fxf95hLRVm1v4QCRujlRx5wtgkCWWHl9LET1d_MeLVYrfjz4p_Ha8ui8eWNPQLIPPcP3rbHX1py9zHHREt2Jp7ezA-lFnHbCAaoO4IksT5cIjmx1p1I_JhrVECXTn3J-s0ow3w9YIksXPovT2m-ytDWcqRJ-37OCr9xcO9CK2q9HAOjoqIpkJ0TfHrXw-YpqV9QR-sF79h-qwivBY2yrAUkfKoJwbBgjX60EDUpjEj5g157Jj576GVZtdRZgHRwzdcIFP2KyBrD3AfStpybVu2L2ZoOgebs0\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 22 Apr 2026 15:10:22 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1476" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-16b897e1-7ff0-4569-9f3c-e3c73f9b31ba" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T15:10:22.827Z", + "time": 74, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 74 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/node_2982235661/export_4211608755/0_all-separate_extract_directory_use-string-arrays_1044561342/am_1076162899/recording.har b/test/e2e/mocks/node_2982235661/export_4211608755/0_all-separate_extract_directory_use-string-arrays_1044561342/am_1076162899/recording.har new file mode 100644 index 000000000..abb48aed0 --- /dev/null +++ b/test/e2e/mocks/node_2982235661/export_4211608755/0_all-separate_extract_directory_use-string-arrays_1044561342/am_1076162899/recording.har @@ -0,0 +1,452 @@ +{ + "log": { + "_recordingName": "node/export/0_all-separate_extract_directory/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1512a39c-dd62-40c1-bdf8-c26c78065768" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 585, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 585, + "text": "{\"_id\":\"*\",\"_rev\":\"-494299414\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-494299414\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "585" + }, + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:14:36 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1512a39c-dd62-40c1-bdf8-c26c78065768" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 677, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:14:36.412Z", + "time": 107, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 107 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1512a39c-dd62-40c1-bdf8-c26c78065768" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1913, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 281, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 281, + "text": "{\"_id\":\"version\",\"_rev\":\"1652964296\",\"version\":\"8.1.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 8.1.0-SNAPSHOT Build 0f3c85c8bbc4e5c93454ee525528ade846b19bcb (2025-December-04 22:27)\",\"revision\":\"0f3c85c8bbc4e5c93454ee525528ade846b19bcb\",\"date\":\"2025-December-04 22:27\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1652964296\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "281" + }, + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:14:36 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1512a39c-dd62-40c1-bdf8-c26c78065768" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 677, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:14:36.654Z", + "time": 110, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 110 + } + }, + { + "_id": "e6efe3392d787815b92258f4573fd0b4", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1512a39c-dd62-40c1-bdf8-c26c78065768" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1949, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "true" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/node-designer/node-type?_queryFilter=true" + }, + "response": { + "bodySize": 33589, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 33589, + "text": "{\"result\":[{\"_id\":\"ef81b1a52c914710b3388caebfe7233a-1\",\"_rev\":\"-1360543129\",\"serviceName\":\"ef81b1a52c914710b3388caebfe7233a\",\"displayName\":\"Display Callback\",\"description\":\"Displays custom callback to the page\",\"outcomes\":[\"outcome\"],\"outputs\":[],\"inputs\":[],\"script\":\"var SCRIPT_OUTCOMES = {\\n OUTCOME: 'outcome'\\n};\\n\\nvar CALLBACKS = {\\n\\tBOOLEAN_ATTRIBUTE_INPUT_CALLBACK: \\\"BOOLEAN_ATTRIBUTE_INPUT_CALLBACK\\\",\\n\\tCHOICE_CALLBACK: \\\"CHOICE_CALLBACK\\\",\\n\\tCONFIRMATION_CALLBACK: \\\"CONFIRMATION_CALLBACK\\\",\\n\\tCONSENT_MAPPING_CALLBACK: \\\"CONSENT_MAPPING_CALLBACK\\\",\\n\\tDEVICE_PROFILE_CALLBACK: \\\"DEVICE_PROFILE_CALLBACK\\\",\\n\\tHIDDEN_VALUE_CALLBACK: \\\"HIDDEN_VALUE_CALLBACK\\\",\\n\\tHTTP_CALLBACK: \\\"HTTP_CALLBACK\\\",\\n\\tIDP_CALLBACK: \\\"IDP_CALLBACK\\\",\\n\\tKBA_CREATE_CALLBACK: \\\"KBA_CREATE_CALLBACK\\\",\\n\\tLANGUAGE_CALLBACK: \\\"LANGUAGE_CALLBACK\\\",\\n\\tMETADATA_CALLBACK: \\\"METADATA_CALLBACK\\\",\\n\\tNAME_CALLBACK: \\\"NAME_CALLBACK\\\",\\n\\tNUMBER_ATTRIBUTE_INPUT_CALLBACK: \\\"NUMBER_ATTRIBUTE_INPUT_CALLBACK\\\",\\n\\tPASSWORD_CALLBACK: \\\"PASSWORD_CALLBACK\\\",\\n\\tPOLLING_WAIT_CALLBACK: \\\"POLLING_WAIT_CALLBACK\\\",\\n REDIRECT_CALLBACK: \\\"REDIRECT_CALLBACK\\\",\\n\\tSCRIPT_TEXT_OUTPUT_CALLBACK: \\\"SCRIPT_TEXT_OUTPUT_CALLBACK\\\",\\n\\tSELECT_IDP_CALLBACK: \\\"SELECT_IDP_CALLBACK\\\",\\n\\tSTRING_ATTRIBUTE_INPUT_CALLBACK: \\\"STRING_ATTRIBUTE_INPUT_CALLBACK\\\",\\n\\tSUSPENDED_TEXT_OUTPUT_CALLBACK: \\\"SUSPENDED_TEXT_OUTPUT_CALLBACK\\\",\\n\\tTERMS_AND_CONDITIONS_CALLBACK: \\\"TERMS_AND_CONDITIONS_CALLBACK\\\",\\n\\tTEXT_INPUT_CALLBACK: \\\"TEXT_INPUT_CALLBACK\\\",\\n\\tTEXT_OUTPUT_CALLBACK: \\\"TEXT_OUTPUT_CALLBACK\\\",\\n\\tVALIDATED_PASSWORD_CALLBACK: \\\"VALIDATED_PASSWORD_CALLBACK\\\",\\n\\tVALIDATED_USERNAME_CALLBACK: \\\"VALIDATED_USERNAME_CALLBACK\\\",\\n\\tX509_CERTIFICATE_CALLBACK: \\\"X509_CERTIFICATE_CALLBACK\\\"\\n}\\n\\nfunction isStringPresent(value) {\\n return value;\\n}\\n\\nfunction getString(value) {\\n return value || '';\\n}\\n\\nfunction isArrayPresent(value) {\\n return value;\\n}\\n\\nfunction getArray(value) {\\n return value ? JSON.parse(value) : [];\\n}\\n\\nfunction isObjectPresent(value) {\\n return value;\\n}\\n\\nfunction getObject(value) {\\n return value ? JSON.parse(value) : {};\\n}\\n\\nfunction isIntPresent(value) {\\n return value;\\n}\\n\\nfunction getInt(value) {\\n return value ? parseInt(value) : 0;\\n}\\n\\nfunction isDoublePresent(value) {\\n return value;\\n}\\n\\nfunction getDouble(value) {\\n return value ? parseFloat(value) : 0.0;\\n}\\n\\nfunction isBooleanPresent(value) {\\n return value;\\n}\\n\\nfunction getBoolean(value) {\\n return value ? value.toLowerCase() === 'true' : false;\\n}\\n\\nfunction setProperty(value) {\\n if (properties.sharedProperty) nodeState.putShared(properties.sharedProperty, value);\\n if (properties.transientProperty) nodeState.putTransient(properties.transientProperty, value);\\n if (properties.objectSharedProperty) {\\n var attributes = {};\\n attributes[properties.objectSharedProperty] = value;\\n nodeState.mergeShared({\\n objectAttributes: attributes\\n });\\n }\\n if (properties.objectTransientProperty) {\\n var attributes = {};\\n attributes[properties.objectTransientProperty] = value;\\n nodeState.mergeTransient({\\n objectAttributes: attributes\\n });\\n }\\n}\\n\\nfunction booleanAttributeInputCallback() {\\n var name = getString(properties.options.name);\\n var prompt = getString(properties.options.prompt);\\n var value = getBoolean(properties.options.value);\\n var required = getBoolean(properties.options.required);\\n var policies = getObject(properties.options.policies);\\n var validateOnly = getBoolean(properties.options.validateOnly);\\n var failedPolicies = getArray(properties.options.failedPolicies);\\n if (isBooleanPresent(properties.options.validateOnly) || isObjectPresent(properties.options.policies)) {\\n if (isArrayPresent(failedPolicies)) {\\n callbacksBuilder.booleanAttributeInputCallback(name, prompt, value, required, policies, validateOnly, failedPolicies);\\n } else {\\n callbacksBuilder.booleanAttributeInputCallback(name, prompt, value, required, policies, validateOnly);\\n }\\n } else if (isArrayPresent(failedPolicies)) {\\n callbacksBuilder.booleanAttributeInputCallback(name, prompt, value, required, failedPolicies);\\n } else {\\n callbacksBuilder.booleanAttributeInputCallback(name, prompt, value, required);\\n }\\n}\\n\\nfunction choiceCallback() {\\n var prompt = getString(properties.options.prompt);\\n var choices = getArray(properties.options.choices);\\n var defaultChoice = getInt(properties.options.defaultChoice);\\n var multipleSelectionsAllowed = getBoolean(properties.options.multipleSelectionsAllowed);\\n callbacksBuilder.choiceCallback(prompt, choices, defaultChoice, multipleSelectionsAllowed);\\n}\\n\\nfunction confirmationCallback() {\\n var prompt = getString(properties.options.prompt);\\n var messageType = getInt(properties.options.messageType);\\n var options = getArray(properties.options.options);\\n var optionType = getInt(properties.options.optionType);\\n var defaultOption = getInt(properties.options.defaultOption);\\n if (isStringPresent(properties.options.prompt)) {\\n if (isIntPresent(properties.options.optionType)) {\\n callbacksBuilder.confirmationCallback(prompt, messageType, optionType, defaultOption);\\n } else {\\n callbacksBuilder.confirmationCallback(prompt, messageType, options, defaultOption);\\n }\\n } else {\\n if (isIntPresent(properties.options.optionType)) {\\n callbacksBuilder.confirmationCallback(messageType, optionType, defaultOption);\\n } else {\\n callbacksBuilder.confirmationCallback(messageType, options, defaultOption);\\n }\\n }\\n}\\n\\nfunction consentMappingCallback() {\\n var config = getObject(properties.options.config);\\n var message = getString(properties.options.message);\\n var isRequired = getBoolean(properties.options.isRequired);\\n var name = getString(properties.options.name);\\n var displayName = getString(properties.options.displayName);\\n var icon = getString(properties.options.icon);\\n var accessLevel = getString(properties.options.accessLevel);\\n var titles = getArray(properties.options.titles);\\n if (isObjectPresent(properties.options.prompt)) {\\n callbacksBuilder.consentMappingCallback(config, message, isRequired);\\n } else {\\n callbacksBuilder.consentMappingCallback(name, displayName, icon, accessLevel, titles, message, isRequired);\\n }\\n}\\n\\nfunction deviceProfileCallback() {\\n var metadata = getBoolean(properties.options.metadata);\\n var location = getBoolean(properties.options.location);\\n var message = getString(properties.options.message);\\n callbacksBuilder.deviceProfileCallback(metadata, location, message);\\n}\\n\\nfunction hiddenValueCallback() {\\n var id = getString(properties.options.id);\\n var value = getString(properties.options.value);\\n callbacksBuilder.hiddenValueCallback(id, value);\\n}\\n\\nfunction httpCallback() {\\n var authorizationHeader = getString(properties.options.authorizationHeader);\\n var negotiationHeader = getString(properties.options.negotiationHeader);\\n var authRHeader = getString(properties.options.authRHeader);\\n var negoName = getString(properties.options.negoName);\\n var negoValue = getString(properties.options.negoValue);\\n if (isStringPresent(properties.options.authorizationHeader) || isStringPresent(properties.options.negotiationHeader)) {\\n var errorCode = getString(properties.options.errorCode);\\n callbacksBuilder.httpCallback(authorizationHeader, negotiationHeader, errorCode);\\n } else {\\n var errorCode = getInt(properties.options.errorCode);\\n callbacksBuilder.httpCallback(authRHeader, negoName, negoValue, errorCode);\\n }\\n}\\n\\nfunction idPCallback() {\\n var provider = getString(properties.options.provider);\\n var clientId = getString(properties.options.clientId);\\n var redirectUri = getString(properties.options.redirectUri);\\n var scope = getArray(properties.options.scope);\\n var nonce = getString(properties.options.nonce);\\n var request = getString(properties.options.request);\\n var requestUri = getString(properties.options.requestUri);\\n var acrValues = getArray(properties.options.acrValues);\\n var requestNativeAppForUserInfo = getBoolean(properties.options.requestNativeAppForUserInfo);\\n var token = getString(properties.options.token);\\n var tokenType = getString(properties.options.tokenType);\\n if (isStringPresent(properties.options.token) || isStringPresent(properties.options.tokenType)) {\\n callbacksBuilder.idPCallback(provider, clientId, redirectUri, scope, nonce, request, requestUri, acrValues, requestNativeAppForUserInfo, token, tokenType);\\n } else {\\n callbacksBuilder.idPCallback(provider, clientId, redirectUri, scope, nonce, request, requestUri, acrValues, requestNativeAppForUserInfo);\\n }\\n}\\n\\nfunction kbaCreateCallback() {\\n var prompt = getString(properties.options.prompt);\\n var predefinedQuestions = getArray(properties.options.predefinedQuestions);\\n var allowUserDefinedQuestions = getBoolean(properties.options.allowUserDefinedQuestions);\\n callbacksBuilder.kbaCreateCallback(prompt, predefinedQuestions, allowUserDefinedQuestions);\\n}\\n\\nfunction languageCallback() {\\n var language = getString(properties.options.language);\\n var country = getString(properties.options.country);\\n callbacksBuilder.languageCallback(language, country);\\n}\\n\\nfunction metadataCallback() {\\n var outputValue = getObject(properties.options.outputValue);\\n callbacksBuilder.metadataCallback(outputValue);\\n}\\n\\nfunction nameCallback() {\\n var prompt = getString(properties.options.prompt);\\n var defaultName = getString(properties.options.defaultName);\\n if (isStringPresent(properties.options.defaultName)) {\\n callbacksBuilder.nameCallback(prompt, defaultName);\\n } else {\\n callbacksBuilder.nameCallback(prompt);\\n }\\n}\\n\\nfunction numberAttributeInputCallback() {\\n var name = getString(properties.options.name);\\n var prompt = getString(properties.options.prompt);\\n var value = getDouble(properties.options.value);\\n var required = getBoolean(properties.options.required);\\n var policies = getObject(properties.options.policies);\\n var validateOnly = getBoolean(properties.options.validateOnly);\\n var failedPolicies = getArray(properties.options.failedPolicies);\\n if (isBooleanPresent(properties.options.validateOnly) || isObjectPresent(properties.options.policies)) {\\n if (isArrayPresent(failedPolicies)) {\\n callbacksBuilder.numberAttributeInputCallback(name, prompt, value, required, policies, validateOnly, failedPolicies);\\n } else {\\n callbacksBuilder.numberAttributeInputCallback(name, prompt, value, required, policies, validateOnly);\\n }\\n } else if (isArrayPresent(failedPolicies)) {\\n callbacksBuilder.numberAttributeInputCallback(name, prompt, value, required, failedPolicies);\\n } else {\\n callbacksBuilder.numberAttributeInputCallback(name, prompt, value, required);\\n }\\n}\\n\\nfunction passwordCallback() {\\n var prompt = getString(properties.options.prompt);\\n var echoOn = getBoolean(properties.options.echoOn);\\n callbacksBuilder.passwordCallback(prompt, echoOn);\\n}\\n\\nfunction pollingWaitCallback() {\\n var waitTime = getString(properties.options.waitTime);\\n var message = getString(properties.options.message);\\n callbacksBuilder.pollingWaitCallback(waitTime, message);\\n}\\n\\nfunction redirectCallback() {\\n throw new Error('Not Implemented');\\n}\\n\\nfunction scriptTextOutputCallback() {\\n var message = getString(properties.options.message);\\n callbacksBuilder.scriptTextOutputCallback(message);\\n}\\n\\nfunction selectIdPCallback() {\\n var providers = getObject(properties.options.providers);\\n callbacksBuilder.selectIdPCallback(providers);\\n}\\n\\nfunction stringAttributeInputCallback() {\\n var name = getString(properties.options.name);\\n var prompt = getString(properties.options.prompt);\\n var value = getString(properties.options.value);\\n var required = getBoolean(properties.options.required);\\n var policies = getObject(properties.options.policies);\\n var validateOnly = getBoolean(properties.options.validateOnly);\\n var failedPolicies = getArray(properties.options.failedPolicies);\\n if (isBooleanPresent(properties.options.validateOnly) || isObjectPresent(properties.options.policies)) {\\n if (isArrayPresent(failedPolicies)) {\\n callbacksBuilder.stringAttributeInputCallback(name, prompt, value, required, policies, validateOnly, failedPolicies);\\n } else {\\n callbacksBuilder.stringAttributeInputCallback(name, prompt, value, required, policies, validateOnly);\\n }\\n } else if (isArrayPresent(failedPolicies)) {\\n callbacksBuilder.stringAttributeInputCallback(name, prompt, value, required, failedPolicies);\\n } else {\\n callbacksBuilder.stringAttributeInputCallback(name, prompt, value, required);\\n }\\n}\\n\\nfunction suspendedTextOutputCallback() {\\n var messageType = getInt(properties.options.messageType);\\n var message = getString(properties.options.message);\\n callbacksBuilder.suspendedTextOutputCallback(messageType, message);\\n}\\n\\nfunction termsAndConditionsCallback() {\\n var version = getString(properties.options.version);\\n var terms = getString(properties.options.terms);\\n var createDate = getString(properties.options.createDate);\\n callbacksBuilder.termsAndConditionsCallback(version, terms, createDate);\\n}\\n\\nfunction textInputCallback() {\\n var prompt = getString(properties.options.prompt);\\n var defaultText = getString(properties.options.defaultText);\\n if (isStringPresent(properties.options.defaultText)) {\\n callbacksBuilder.textInputCallback(prompt, defaultText);\\n } else {\\n callbacksBuilder.textInputCallback(prompt);\\n }\\n}\\n\\nfunction textOutputCallback() {\\n var messageType = getString(properties.options.messageType);\\n var message = getString(properties.options.message);\\n callbacksBuilder.textOutputCallback(messageType, message);\\n}\\n\\nfunction validatedPasswordCallback() {\\n var prompt = getString(properties.options.prompt);\\n var echoOn = getBoolean(properties.options.echoOn);\\n var policies = getObject(properties.options.policies);\\n var validateOnly = getBoolean(properties.options.validateOnly);\\n var failedPolicies = getArray(properties.options.failedPolicies);\\n if (isArrayPresent(properties.options.failedPolicies)) {\\n callbacksBuilder.validatedPasswordCallback(prompt, echoOn, policies, validateOnly, failedPolicies);\\n } else {\\n callbacksBuilder.validatedPasswordCallback(prompt, echoOn, policies, validateOnly);\\n }\\n}\\n\\nfunction validatedUsernameCallback() {\\n var prompt = getString(properties.options.prompt);\\n var policies = getObject(properties.options.policies);\\n var validateOnly = getBoolean(properties.options.validateOnly);\\n var failedPolicies = getArray(properties.options.failedPolicies);\\n if (isArrayPresent(properties.options.failedPolicies)) {\\n callbacksBuilder.validatedUsernameCallback(prompt, policies, validateOnly, failedPolicies);\\n } else {\\n callbacksBuilder.validatedUsernameCallback(prompt, policies, validateOnly);\\n }\\n}\\n\\nfunction x509CertificateCallback() {\\n throw new Error('Not Implemented');\\n}\\n\\nfunction getBooleanAttributeInputCallback() {\\n setProperty(callbacks.getBooleanAttributeInputCallbacks().get(0));\\n}\\n\\nfunction getChoiceCallback() {\\n var multipleSelectionsAllowed = getBoolean(properties.options.multipleSelectionsAllowed);\\n var selections = callbacks.getChoiceCallbacks().get(0);\\n setProperty(multipleSelectionsAllowed ? selections : selections[0]);\\n}\\n\\nfunction getConfirmationCallback() {\\n setProperty(callbacks.getConfirmationCallbacks().get(0));\\n}\\n\\nfunction getConsentMappingCallback() {\\n setProperty(callbacks.getConsentMappingCallbacks().get(0));\\n}\\n\\nfunction getDeviceProfileCallback() {\\n setProperty(callbacks.getDeviceProfileCallbacks().get(0));\\n}\\n\\nfunction getHiddenValueCallback() {\\n var id = getString(properties.options.id);\\n setProperty(callbacks.getHiddenValueCallbacks().get(id));\\n}\\n\\nfunction getHttpCallback() {\\n setProperty(callbacks.getHttpCallbacks().get(0));\\n}\\n\\nfunction getIdPCallback() {\\n setProperty(callbacks.getIdpCallbacks().get(0));\\n}\\n\\nfunction getKbaCreateCallback() {\\n setProperty(callbacks.getKbaCreateCallbacks().get(0));\\n}\\n\\nfunction getLanguageCallback() {\\n setProperty(callbacks.getLanguageCallbacks().get(0));\\n}\\n\\nfunction getNameCallback() {\\n setProperty(callbacks.getNameCallbacks().get(0));\\n}\\n\\nfunction getNumberAttributeInputCallback() {\\n setProperty(callbacks.getNumberAttributeInputCallbacks().get(0));\\n}\\n\\nfunction getPasswordCallback() {\\n setProperty(callbacks.getPasswordCallbacks().get(0));\\n}\\n\\nfunction getSelectIdPCallback() {\\n setProperty(callbacks.getSelectIdPCallbacks().get(0));\\n}\\n\\nfunction getStringAttributeInputCallback() {\\n setProperty(callbacks.getStringAttributeInputCallbacks().get(0));\\n}\\n\\nfunction getTermsAndConditionsCallback() {\\n setProperty(callbacks.getTermsAndConditionsCallbacks().get(0));\\n}\\n\\nfunction getTextInputCallback() {\\n setProperty(callbacks.getTextInputCallbacks().get(0));\\n}\\n\\nfunction getValidatedPasswordCallback() {\\n setProperty(callbacks.getValidatedPasswordCallbacks().get(0));\\n}\\n\\nfunction getValidatedUsernameCallback() {\\n setProperty(callbacks.getValidatedUsernameCallbacks().get(0));\\n}\\n\\nfunction getX509CertificateCallback() {\\n setProperty(callbacks.getX509CertificateCallbacks().get(0));\\n}\\n\\nfunction main() {\\n if (!callbacks.isEmpty()) {\\n switch (properties.callback) {\\n case CALLBACKS.BOOLEAN_ATTRIBUTE_INPUT_CALLBACK: getBooleanAttributeInputCallback(); break;\\n case CALLBACKS.CHOICE_CALLBACK: getChoiceCallback(); break;\\n case CALLBACKS.CONFIRMATION_CALLBACK: getConfirmationCallback(); break;\\n case CALLBACKS.CONSENT_MAPPING_CALLBACK: getConsentMappingCallback(); break;\\n case CALLBACKS.DEVICE_PROFILE_CALLBACK: getDeviceProfileCallback(); break;\\n case CALLBACKS.HIDDEN_VALUE_CALLBACK: getHiddenValueCallback(); break;\\n case CALLBACKS.HTTP_CALLBACK: getHttpCallback(); break;\\n case CALLBACKS.IDP_CALLBACK: getIdPCallback(); break;\\n case CALLBACKS.KBA_CREATE_CALLBACK: getKbaCreateCallback(); break;\\n case CALLBACKS.LANGUAGE_CALLBACK: getLanguageCallback(); break;\\n case CALLBACKS.NAME_CALLBACK: getNameCallback(); break;\\n case CALLBACKS.NUMBER_ATTRIBUTE_INPUT_CALLBACK: getNumberAttributeInputCallback(); break;\\n case CALLBACKS.PASSWORD_CALLBACK: getPasswordCallback(); break;\\n case CALLBACKS.SELECT_IDP_CALLBACK: getSelectIdPCallback(); break;\\n case CALLBACKS.STRING_ATTRIBUTE_INPUT_CALLBACK: getStringAttributeInputCallback(); break;\\n case CALLBACKS.TERMS_AND_CONDITIONS_CALLBACK: getTermsAndConditionsCallback(); break;\\n case CALLBACKS.TEXT_INPUT_CALLBACK: getTextInputCallback(); break;\\n case CALLBACKS.VALIDATED_PASSWORD_CALLBACK: getValidatedPasswordCallback(); break;\\n case CALLBACKS.VALIDATED_USERNAME_CALLBACK: getValidatedUsernameCallback(); break;\\n case CALLBACKS.X509_CERTIFICATE_CALLBACK: getX509CertificateCallback(); break;\\n default: break;\\n }\\n action.goTo(SCRIPT_OUTCOMES.OUTCOME);\\n return;\\n }\\n\\n switch (properties.callback) {\\n case CALLBACKS.BOOLEAN_ATTRIBUTE_INPUT_CALLBACK: booleanAttributeInputCallback(); break;\\n case CALLBACKS.CHOICE_CALLBACK: choiceCallback(); break;\\n case CALLBACKS.CONFIRMATION_CALLBACK: confirmationCallback(); break;\\n case CALLBACKS.CONSENT_MAPPING_CALLBACK: consentMappingCallback(); break;\\n case CALLBACKS.DEVICE_PROFILE_CALLBACK: deviceProfileCallback(); break;\\n case CALLBACKS.HIDDEN_VALUE_CALLBACK: hiddenValueCallback(); break;\\n case CALLBACKS.HTTP_CALLBACK: httpCallback(); break;\\n case CALLBACKS.IDP_CALLBACK: idPCallback(); break;\\n case CALLBACKS.KBA_CREATE_CALLBACK: kbaCreateCallback(); break;\\n case CALLBACKS.LANGUAGE_CALLBACK: languageCallback(); break;\\n case CALLBACKS.METADATA_CALLBACK: metadataCallback(); break;\\n case CALLBACKS.NAME_CALLBACK: nameCallback(); break;\\n case CALLBACKS.NUMBER_ATTRIBUTE_INPUT_CALLBACK: numberAttributeInputCallback(); break;\\n case CALLBACKS.PASSWORD_CALLBACK: passwordCallback(); break;\\n case CALLBACKS.POLLING_WAIT_CALLBACK: pollingWaitCallback(); break;\\n case CALLBACKS.REDIRECT_CALLBACK: redirectCallback(); break;\\n case CALLBACKS.SCRIPT_TEXT_OUTPUT_CALLBACK: scriptTextOutputCallback(); break;\\n case CALLBACKS.SELECT_IDP_CALLBACK: selectIdPCallback(); break;\\n case CALLBACKS.STRING_ATTRIBUTE_INPUT_CALLBACK: stringAttributeInputCallback(); break;\\n case CALLBACKS.SUSPENDED_TEXT_OUTPUT_CALLBACK: suspendedTextOutputCallback(); break;\\n case CALLBACKS.TERMS_AND_CONDITIONS_CALLBACK: termsAndConditionsCallback(); break;\\n case CALLBACKS.TEXT_INPUT_CALLBACK: textInputCallback(); break;\\n case CALLBACKS.TEXT_OUTPUT_CALLBACK: textOutputCallback(); break;\\n case CALLBACKS.VALIDATED_PASSWORD_CALLBACK: validatedPasswordCallback(); break;\\n case CALLBACKS.VALIDATED_USERNAME_CALLBACK: validatedUsernameCallback(); break;\\n case CALLBACKS.X509_CERTIFICATE_CALLBACK: x509CertificateCallback(); break;\\n default: throw new Error('Unknown Callback'); // Should never reach this case\\n }\\n}\\n\\nmain();\\n\",\"errorOutcome\":false,\"tags\":[\"callback\",\"utilities\"],\"properties\":{\"callback\":{\"title\":\"Callback\",\"description\":\"The callback to display\",\"type\":\"STRING\",\"required\":true,\"options\":{\"METADATA_CALLBACK\":\"metadataCallback\",\"TERMS_AND_CONDITIONS_CALLBACK\":\"termsAndConditionsCallback\",\"NUMBER_ATTRIBUTE_INPUT_CALLBACK\":\"numberAttributeInputCallback\",\"TEXT_OUTPUT_CALLBACK\":\"textOutputCallback\",\"SCRIPT_TEXT_OUTPUT_CALLBACK\":\"scriptTextOutputCallback\",\"CONSENT_MAPPING_CALLBACK\":\"consentMappingCallback\",\"STRING_ATTRIBUTE_INPUT_CALLBACK\":\"stringAttributeInputCallback\",\"IDP_CALLBACK\":\"idPCallback\",\"VALIDATED_PASSWORD_CALLBACK\":\"validatedPasswordCallback\",\"SELECT_IDP_CALLBACK\":\"selectIdPCallback\",\"POLLING_WAIT_CALLBACK\":\"pollingWaitCallback\",\"NAME_CALLBACK\":\"nameCallback\",\"SUSPENDED_TEXT_OUTPUT_CALLBACK\":\"suspendedTextOutputCallback\",\"REDIRECT_CALLBACK\":\"redirectCallback\",\"X509_CERTIFICATE_CALLBACK\":\"x509CertificateCallback\",\"PASSWORD_CALLBACK\":\"passwordCallback\",\"TEXT_INPUT_CALLBACK\":\"textInputCallback\",\"BOOLEAN_ATTRIBUTE_INPUT_CALLBACK\":\"booleanAttributeInputCallback\",\"CONFIRMATION_CALLBACK\":\"confirmationCallback\",\"CHOICE_CALLBACK\":\"choiceCallback\",\"DEVICE_PROFILE_CALLBACK\":\"deviceProfileCallback\",\"HIDDEN_VALUE_CALLBACK\":\"hiddenValueCallback\",\"HTTP_CALLBACK\":\"httpCallback\",\"VALIDATED_USERNAME_CALLBACK\":\"validatedUsernameCallback\",\"KBA_CREATE_CALLBACK\":\"kbaCreateCallback\",\"LANGUAGE_CALLBACK\":\"languageCallback\"},\"multivalued\":false},\"objectSharedProperty\":{\"title\":\"Object Attributes Shared Property\",\"description\":\"The objectAttributes property on the shared state to put the callback input into (if applicable)\",\"type\":\"STRING\",\"required\":false,\"multivalued\":false},\"objectTransientProperty\":{\"title\":\"Object Attributes Transient Property\",\"description\":\"The objectAttributes property on the transient state to put the callback input into (if applicable)\",\"type\":\"STRING\",\"required\":false,\"multivalued\":false},\"options\":{\"title\":\"Options\",\"description\":\"The options containing the parameters for the callback (see documentation for possible parameters: https://docs.pingidentity.com/pingoneaic/latest/am-scripting/scripting-api-node.html#scripting-api-node-callbacks). \\n\\nFor example, for textOutputCallback, the options could be: { messageType: 0, message: \\\"Hello World!\\\" }. \\n\\nNote that for required parameters that are not specified in the options will use default values based on the type of the parameter (\\\"\\\" for Strings, [] for Arrays, {} for Objects, 0 for Ints, 0.0 for Doubles, and false for Booleans).\",\"type\":\"OBJECT\",\"required\":true,\"multivalued\":false},\"sharedProperty\":{\"title\":\"Shared State Property\",\"description\":\"The shared state property to put the callback input into (if applicable)\",\"type\":\"STRING\",\"required\":false,\"multivalued\":false},\"transientProperty\":{\"title\":\"Transient State Property\",\"description\":\"The transient state property to put the callback input into (if applicable)\",\"type\":\"STRING\",\"required\":false,\"multivalued\":false}}},{\"_id\":\"e5ad0110c8ee4dafaae983003cd05d4a-1\",\"_rev\":\"1242245001\",\"serviceName\":\"e5ad0110c8ee4dafaae983003cd05d4a\",\"displayName\":\"Generate JWT\",\"description\":\"Generate a signed JWT using the HMAC SHA-256 algorithm.\",\"outcomes\":[\"True\",\"False\"],\"outputs\":[],\"inputs\":[],\"script\":\"var aud = properties.audience;\\nvar iss = properties.issuer;\\nvar validity = properties.validity;\\nvar esv = properties.signingkey;\\n\\nvar signingkey = systemEnv.getProperty(esv);\\n\\nvar username = nodeState.get(\\\"username\\\");\\n\\nvar data = {\\n jwtType:\\\"SIGNED\\\",\\n jwsAlgorithm: \\\"HS256\\\",\\n issuer: iss,\\n subject: username,\\n audience: aud,\\n type: \\\"JWT\\\",\\n validityMinutes: validity,\\n signingKey: signingkey\\n};\\n\\nvar jwt = jwtAssertion.generateJwt(data);\\n\\nif (jwt !== null && jwt.length > 0) {\\n nodeState.putShared(\\\"assertionJwt\\\" , jwt);\\n action.goTo(\\\"True\\\");\\n} else {\\n action.goTo(\\\"False\\\");\\n}\",\"errorOutcome\":true,\"tags\":[\"Utilities\",\"utilities\"],\"properties\":{\"audience\":{\"title\":\"Audience\",\"description\":\"The audience (aud) claim\",\"type\":\"STRING\",\"required\":true,\"multivalued\":false},\"issuer\":{\"title\":\"Issuer\",\"description\":\"The issuer (iss) claim\",\"type\":\"STRING\",\"required\":true,\"multivalued\":false},\"signingkey\":{\"title\":\"HMAC Signing Key\",\"description\":\"The secret label for the HMAC signing key\",\"type\":\"STRING\",\"required\":true,\"defaultValue\":\"esv.signing.key\",\"multivalued\":false},\"validity\":{\"title\":\"Validity (minutes)\",\"description\":\"\",\"type\":\"NUMBER\",\"required\":true,\"defaultValue\":5,\"multivalued\":false}}},{\"_id\":\"session-1\",\"_rev\":\"717898089\",\"serviceName\":\"session\",\"displayName\":\"Has Session AM\",\"description\":\"Checks if the user has a current session.\",\"outcomes\":[\"True\",\"False\"],\"outputs\":[],\"inputs\":[],\"script\":\"var SCRIPT_OUTCOMES = {\\n TRUE: 'True',\\n FALSE: 'False'\\n}\\n\\nfunction main() {\\n action.goTo(typeof existingSession === \\\"undefined\\\" ? SCRIPT_OUTCOMES.FALSE : SCRIPT_OUTCOMES.TRUE);\\n}\\n\\nmain();\\n\",\"errorOutcome\":false,\"tags\":[\"utilities\"],\"properties\":{}},{\"_id\":\"8ab9f1aad4b4460a9c45d15fb148e221-1\",\"_rev\":\"-609282293\",\"serviceName\":\"8ab9f1aad4b4460a9c45d15fb148e221\",\"displayName\":\"Display State\",\"description\":\"Debug node that displays the shared and transient state of the journey for debugging purposes.\",\"outcomes\":[\"outcome\"],\"outputs\":[],\"inputs\":[],\"script\":\"var SCRIPT_OUTCOMES = {\\n OUTCOME: \\\"outcome\\\"\\n};\\n\\nfunction main() {\\n if (!callbacks.isEmpty()) {\\n action.goTo(SCRIPT_OUTCOMES.OUTCOME);\\n return;\\n }\\n var keySet = nodeState.keys(); // Java Set\\n var keys = Array.from(keySet); // Make it into JavaScript array\\n debugState = {};\\n for (var i in keys) {\\n var k = new String(keys[i]);\\n var item = nodeState.get(k);\\n if (typeof item === \\\"object\\\") {\\n debugState[k] = nodeState.getObject(k);\\n } else {\\n debugState[k] = nodeState.get(k);\\n }\\n }\\n if (properties.displayFormat === \\\"JSON\\\") {\\n callbacksBuilder.textOutputCallback(0, `
${JSON.stringify(debugState, null, 2)}
`);\\n return;\\n }\\n callbacksBuilder.textOutputCallback(0, `${Array.from(Object.keys(debugState).map(k => ``))}
KeyValue
${k}
${debugState[k]}
`);\\n}\\n\\nmain();\\n\",\"errorOutcome\":false,\"tags\":[\"debug\",\"testing\"],\"properties\":{\"displayFormat\":{\"title\":\"Display Format\",\"description\":\"The format in which to display the states.\",\"type\":\"STRING\",\"required\":true,\"defaultValue\":\"TABLE\",\"options\":{\"TABLE\":\"HTML Table\",\"JSON\":\"Raw JSON\"},\"multivalued\":false}}},{\"_id\":\"c15e2efb3deb4d4ea338c74a6440b69f-1\",\"_rev\":\"-803916807\",\"serviceName\":\"c15e2efb3deb4d4ea338c74a6440b69f\",\"displayName\":\"Vector ALU\",\"description\":\"Simple ALU that performs basic binary vector math operations. Outputs the result onto the shared state with key \\\"c\\\".\",\"outcomes\":[\"Success\"],\"outputs\":[\"c\"],\"inputs\":[],\"script\":\"var SCRIPT_OUTCOMES = {\\n SUCCESS: 'Success'\\n};\\n\\nvar OPERATORS = {\\n ADD: \\\"ADD\\\",\\n SUBTRACT: \\\"SUBTRACT\\\",\\n DOT: \\\"DOT\\\",\\n CROSS: \\\"CROSS\\\"\\n}\\n\\nfunction add(a, b) {\\n return a.map((v, i) => v + b[i]);\\n}\\n\\nfunction subtract(a, b) {\\n return a.map((v, i) => v - b[i]);\\n}\\n\\nfunction dot(a, b) {\\n return a.reduce((sum, v, i) => sum + v * b[i], 0);\\n}\\n\\nfunction cross(a, b) {\\n return [\\n a[1] * b[2] - a[2] * b[1],\\n a[2] * b[0] - a[0] * b[2],\\n a[0] * b[1] - a[1] * b[0]\\n ];\\n}\\n\\nfunction main() {\\n if (properties.a.length !== properties.b.length) throw new Error(\\\"Vectors not the same dimension.\\\");\\n switch (properties.operator) {\\n case OPERATORS.ADD:\\n nodeState.putShared(\\\"c\\\", add(properties.a, properties.b));\\n break;\\n case OPERATORS.SUBTRACT:\\n nodeState.putShared(\\\"c\\\", subtract(properties.a, properties.b));\\n break;\\n case OPERATORS.DOT:\\n nodeState.putShared(\\\"c\\\", dot(properties.a, properties.b));\\n break;\\n case OPERATORS.CROSS:\\n if (properties.a.length !== 3) throw new Error(\\\"Vectors not dimension 3 for cross product\\\");\\n nodeState.putShared(\\\"c\\\", cross(properties.a, properties.b));\\n break;\\n default: throw new Error(\\\"Unknown operator.\\\");\\n }\\n action.goTo(SCRIPT_OUTCOMES.SUCCESS);\\n}\\n\\nmain();\\n\",\"errorOutcome\":true,\"tags\":[\"math\",\"vector\",\"utilities\"],\"properties\":{\"a\":{\"title\":\"A\",\"description\":\"Left vector operand\",\"type\":\"NUMBER\",\"required\":true,\"defaultValue\":[1,2,3],\"multivalued\":true},\"b\":{\"title\":\"B\",\"description\":\"Right vector operand\",\"type\":\"NUMBER\",\"required\":true,\"defaultValue\":[4,5,6],\"multivalued\":true},\"operator\":{\"title\":\"Operator\",\"description\":\"The binary operation to perform on the vectors.\",\"type\":\"STRING\",\"required\":true,\"defaultValue\":\"DOT\",\"options\":{\"ADD\":\"+\",\"CROSS\":\"X\",\"DOT\":\".\",\"SUBTRACT\":\"-\"},\"multivalued\":false}}},{\"_id\":\"c605506774a848f7877b4d17a453bd39-1\",\"_rev\":\"1974329536\",\"serviceName\":\"c605506774a848f7877b4d17a453bd39\",\"displayName\":\"Has Session\",\"description\":\"Checks if the user has a current session.\",\"outcomes\":[\"True\",\"False\"],\"outputs\":[],\"inputs\":[],\"script\":\"var SCRIPT_OUTCOMES = {\\n TRUE: 'True',\\n FALSE: 'False'\\n}\\n\\nfunction main() {\\n action.goTo(typeof existingSession === \\\"undefined\\\" ? SCRIPT_OUTCOMES.FALSE : SCRIPT_OUTCOMES.TRUE);\\n}\\n\\nmain();\\n\",\"errorOutcome\":false,\"tags\":[\"utilities\"],\"properties\":{}},{\"_id\":\"c6063fb2f5dc42dd9772bedc93898bd8-1\",\"_rev\":\"1371687245\",\"serviceName\":\"c6063fb2f5dc42dd9772bedc93898bd8\",\"displayName\":\"ALU\",\"description\":\"Simple ALU that performs basic binary math operations. Expects an \\\"x\\\" and \\\"y\\\" value on the shared state, and will produce a new \\\"z\\\" value on the shared state as output.\",\"outcomes\":[\"Success\"],\"outputs\":[\"z\"],\"inputs\":[\"x\",\"y\"],\"script\":\"var SCRIPT_OUTCOMES = {\\n SUCCESS: 'Success'\\n};\\n\\nvar OPERATORS = {\\n ADD: \\\"ADD\\\",\\n SUBTRACT: \\\"SUBTRACT\\\",\\n MULTIPLY: \\\"MULTIPLY\\\",\\n DIVIDE: \\\"DIVIDE\\\"\\n}\\n\\nfunction main() {\\n var a = Number(properties.a);\\n var b = Number(properties.b);\\n switch (properties.operator) {\\n case OPERATORS.ADD:\\n nodeState.putShared(\\\"z\\\", a + b);\\n break;\\n case OPERATORS.SUBTRACT:\\n nodeState.putShared(\\\"z\\\", a - b);\\n break;\\n case OPERATORS.MULTIPLY:\\n nodeState.putShared(\\\"z\\\", a * b);\\n break;\\n case OPERATORS.DIVIDE:\\n if (b == 0) throw new Error(\\\"Cannot divide by 0\\\");\\n nodeState.putShared(\\\"z\\\", a / b);\\n break;\\n default: throw new Error(\\\"Unknown operator.\\\");\\n }\\n action.goTo(SCRIPT_OUTCOMES.SUCCESS);\\n}\\n\\nmain();\\n\",\"errorOutcome\":true,\"tags\":[\"math\",\"utilities\"],\"properties\":{\"operator\":{\"title\":\"Operator\",\"description\":\"The operation to perform.\",\"type\":\"STRING\",\"required\":true,\"defaultValue\":\"ADD\",\"options\":{\"ADD\":\"+\",\"MULTIPLY\":\"*\",\"SUBTRACT\":\"-\",\"DIVIDE\":\"/\"},\"multivalued\":false}}}],\"resultCount\":7,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"EXACT\",\"totalPagedResults\":7,\"remainingPagedResults\":-1}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0, resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:14:36 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1512a39c-dd62-40c1-bdf8-c26c78065768" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + }, + { + "name": "transfer-encoding", + "value": "chunked" + } + ], + "headersSize": 690, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:14:36.840Z", + "time": 80, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 80 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/node_2982235661/export_4211608755/0_all-separate_extract_directory_use-string-arrays_1044561342/oauth2_393036114/recording.har b/test/e2e/mocks/node_2982235661/export_4211608755/0_all-separate_extract_directory_use-string-arrays_1044561342/oauth2_393036114/recording.har new file mode 100644 index 000000000..bd5263638 --- /dev/null +++ b/test/e2e/mocks/node_2982235661/export_4211608755/0_all-separate_extract_directory_use-string-arrays_1044561342/oauth2_393036114/recording.har @@ -0,0 +1,142 @@ +{ + "log": { + "_recordingName": "node/export/0_all-separate_extract_directory/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1329, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1512a39c-dd62-40c1-bdf8-c26c78065768" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1329" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:autoaccess:* fr:idc:esv:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1787, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1787, + "text": "{\"access_token\":\"\",\"scope\":\"fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:autoaccess:* fr:idc:esv:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1787" + }, + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:14:36 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1512a39c-dd62-40c1-bdf8-c26c78065768" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 451, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:14:36.541Z", + "time": 100, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 100 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/node_2982235661/export_4211608755/0_all-separate_extract_directory_use-string-arrays_1044561342/openidm_3290118515/recording.har b/test/e2e/mocks/node_2982235661/export_4211608755/0_all-separate_extract_directory_use-string-arrays_1044561342/openidm_3290118515/recording.har new file mode 100644 index 000000000..052bb8c0e --- /dev/null +++ b/test/e2e/mocks/node_2982235661/export_4211608755/0_all-separate_extract_directory_use-string-arrays_1044561342/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "node/export/0_all-separate_extract_directory/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1512a39c-dd62-40c1-bdf8-c26c78065768" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1925, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/ad62492c-d064-4952-95ed-0a74ed5b2fd1?_fields=%2A" + }, + "response": { + "bodySize": 1476, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1476, + "text": "{\"_id\":\"ad62492c-d064-4952-95ed-0a74ed5b2fd1\",\"_rev\":\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\",\"accountStatus\":\"active\",\"name\":\"Frodo TriVir\",\"description\":\"Frodo service account for use by TriVir\",\"scopes\":[\"fr:am:*\",\"fr:autoaccess:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:certificate:read\",\"fr:idc:content-security-policy:read\",\"fr:idc:cookie-domain:*\",\"fr:idc:cookie-domain:read\",\"fr:idc:custom-domain:read\",\"fr:idc:custom-domain:*\",\"fr:idc:esv:*\",\"fr:idc:promotion:*\",\"fr:idc:promotion:read\",\"fr:idc:release:*\",\"fr:idc:release:read\",\"fr:idc:sso-cookie:*\",\"fr:idc:sso-cookie:read\",\"fr:idm:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"rNWWJ9vZGkyMSXhaZVBEufp3oODou19gVDLje2_AMcw2Id4bILpBJ2Ob2LF4y2yV6l4m_OXVApvj5dInLqbsn_ZQoEmqc6AP6XFqAog4w-xRy5XFHBf1cKws3a5ANcZXlw-NTnuDFvzXkQXYeGH1WSqBIeVXlpjPe0C-7vtbN4oIZyy6QaFjqv7BEjmZ1F1YoHQryPzJl58rnomcQFqIk42-UMGfQt0w63ON1mtHyQOMWUduTFIU67_jGW7YKIrYs4JO9yizKR-4Uab9M1hKkYZRUmWCgL53YJtMjg-uVRWixKhJJy3fSCBDa_SXcz-c1glbg9fGQh908WRoN3tT4B0CaeDHexLId80Vuaq3VkplH6FZHzW9-KL8Td_0kOrKKbnLgtwRvr3Fxf95hLRVm1v4QCRujlRx5wtgkCWWHl9LET1d_MeLVYrfjz4p_Ha8ui8eWNPQLIPPcP3rbHX1py9zHHREt2Jp7ezA-lFnHbCAaoO4IksT5cIjmx1p1I_JhrVECXTn3J-s0ow3w9YIksXPovT2m-ytDWcqRJ-37OCr9xcO9CK2q9HAOjoqIpkJ0TfHrXw-YpqV9QR-sF79h-qwivBY2yrAUkfKoJwbBgjX60EDUpjEj5g157Jj576GVZtdRZgHRwzdcIFP2KyBrD3AfStpybVu2L2ZoOgebs0\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:14:36 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1476" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1512a39c-dd62-40c1-bdf8-c26c78065768" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:14:36.651Z", + "time": 61, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 61 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1512a39c-dd62-40c1-bdf8-c26c78065768" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1925, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/ad62492c-d064-4952-95ed-0a74ed5b2fd1?_fields=%2A" + }, + "response": { + "bodySize": 1476, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1476, + "text": "{\"_id\":\"ad62492c-d064-4952-95ed-0a74ed5b2fd1\",\"_rev\":\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\",\"accountStatus\":\"active\",\"name\":\"Frodo TriVir\",\"description\":\"Frodo service account for use by TriVir\",\"scopes\":[\"fr:am:*\",\"fr:autoaccess:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:certificate:read\",\"fr:idc:content-security-policy:read\",\"fr:idc:cookie-domain:*\",\"fr:idc:cookie-domain:read\",\"fr:idc:custom-domain:read\",\"fr:idc:custom-domain:*\",\"fr:idc:esv:*\",\"fr:idc:promotion:*\",\"fr:idc:promotion:read\",\"fr:idc:release:*\",\"fr:idc:release:read\",\"fr:idc:sso-cookie:*\",\"fr:idc:sso-cookie:read\",\"fr:idm:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"rNWWJ9vZGkyMSXhaZVBEufp3oODou19gVDLje2_AMcw2Id4bILpBJ2Ob2LF4y2yV6l4m_OXVApvj5dInLqbsn_ZQoEmqc6AP6XFqAog4w-xRy5XFHBf1cKws3a5ANcZXlw-NTnuDFvzXkQXYeGH1WSqBIeVXlpjPe0C-7vtbN4oIZyy6QaFjqv7BEjmZ1F1YoHQryPzJl58rnomcQFqIk42-UMGfQt0w63ON1mtHyQOMWUduTFIU67_jGW7YKIrYs4JO9yizKR-4Uab9M1hKkYZRUmWCgL53YJtMjg-uVRWixKhJJy3fSCBDa_SXcz-c1glbg9fGQh908WRoN3tT4B0CaeDHexLId80Vuaq3VkplH6FZHzW9-KL8Td_0kOrKKbnLgtwRvr3Fxf95hLRVm1v4QCRujlRx5wtgkCWWHl9LET1d_MeLVYrfjz4p_Ha8ui8eWNPQLIPPcP3rbHX1py9zHHREt2Jp7ezA-lFnHbCAaoO4IksT5cIjmx1p1I_JhrVECXTn3J-s0ow3w9YIksXPovT2m-ytDWcqRJ-37OCr9xcO9CK2q9HAOjoqIpkJ0TfHrXw-YpqV9QR-sF79h-qwivBY2yrAUkfKoJwbBgjX60EDUpjEj5g157Jj576GVZtdRZgHRwzdcIFP2KyBrD3AfStpybVu2L2ZoOgebs0\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:14:36 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1476" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1512a39c-dd62-40c1-bdf8-c26c78065768" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:14:36.773Z", + "time": 57, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 57 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/node_2982235661/export_4211608755/0_node-id_193359214/am_1076162899/recording.har b/test/e2e/mocks/node_2982235661/export_4211608755/0_node-id_193359214/am_1076162899/recording.har new file mode 100644 index 000000000..b0b438de9 --- /dev/null +++ b/test/e2e/mocks/node_2982235661/export_4211608755/0_node-id_193359214/am_1076162899/recording.har @@ -0,0 +1,451 @@ +{ + "log": { + "_recordingName": "node/export/0_node-id/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-71e27973-7bd2-4511-9e76-d8c807f262f3" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 585, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 585, + "text": "{\"_id\":\"*\",\"_rev\":\"-494299414\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-494299414\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "585" + }, + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:12:58 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-71e27973-7bd2-4511-9e76-d8c807f262f3" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 677, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:12:58.343Z", + "time": 103, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 103 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-71e27973-7bd2-4511-9e76-d8c807f262f3" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1913, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 281, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 281, + "text": "{\"_id\":\"version\",\"_rev\":\"1652964296\",\"version\":\"8.1.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 8.1.0-SNAPSHOT Build 0f3c85c8bbc4e5c93454ee525528ade846b19bcb (2025-December-04 22:27)\",\"revision\":\"0f3c85c8bbc4e5c93454ee525528ade846b19bcb\",\"date\":\"2025-December-04 22:27\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1652964296\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "281" + }, + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:12:58 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-71e27973-7bd2-4511-9e76-d8c807f262f3" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 677, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:12:58.571Z", + "time": 111, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 111 + } + }, + { + "_id": "b40be2f5ec8b014b01fc6a2ec9b6bb29", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-71e27973-7bd2-4511-9e76-d8c807f262f3" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1966, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/node-designer/node-type/c605506774a848f7877b4d17a453bd39-1" + }, + "response": { + "bodySize": 531, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 531, + "text": "{\"_id\":\"c605506774a848f7877b4d17a453bd39-1\",\"_rev\":\"1974329536\",\"serviceName\":\"c605506774a848f7877b4d17a453bd39\",\"displayName\":\"Has Session\",\"description\":\"Checks if the user has a current session.\",\"outcomes\":[\"True\",\"False\"],\"outputs\":[],\"inputs\":[],\"script\":\"var SCRIPT_OUTCOMES = {\\n TRUE: 'True',\\n FALSE: 'False'\\n}\\n\\nfunction main() {\\n action.goTo(typeof existingSession === \\\"undefined\\\" ? SCRIPT_OUTCOMES.FALSE : SCRIPT_OUTCOMES.TRUE);\\n}\\n\\nmain();\\n\",\"errorOutcome\":false,\"tags\":[\"utilities\"],\"properties\":{}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1974329536\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "531" + }, + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:12:58 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-71e27973-7bd2-4511-9e76-d8c807f262f3" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 676, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:12:58.757Z", + "time": 69, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 69 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/node_2982235661/export_4211608755/0_node-id_193359214/oauth2_393036114/recording.har b/test/e2e/mocks/node_2982235661/export_4211608755/0_node-id_193359214/oauth2_393036114/recording.har new file mode 100644 index 000000000..30386a67d --- /dev/null +++ b/test/e2e/mocks/node_2982235661/export_4211608755/0_node-id_193359214/oauth2_393036114/recording.har @@ -0,0 +1,142 @@ +{ + "log": { + "_recordingName": "node/export/0_node-id/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1329, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-71e27973-7bd2-4511-9e76-d8c807f262f3" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1329" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:autoaccess:* fr:idc:esv:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1787, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1787, + "text": "{\"access_token\":\"\",\"scope\":\"fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:autoaccess:* fr:idc:esv:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1787" + }, + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:12:58 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-71e27973-7bd2-4511-9e76-d8c807f262f3" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 451, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:12:58.465Z", + "time": 91, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 91 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/node_2982235661/export_4211608755/0_node-id_193359214/openidm_3290118515/recording.har b/test/e2e/mocks/node_2982235661/export_4211608755/0_node-id_193359214/openidm_3290118515/recording.har new file mode 100644 index 000000000..58eda732b --- /dev/null +++ b/test/e2e/mocks/node_2982235661/export_4211608755/0_node-id_193359214/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "node/export/0_node-id/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-71e27973-7bd2-4511-9e76-d8c807f262f3" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1925, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/ad62492c-d064-4952-95ed-0a74ed5b2fd1?_fields=%2A" + }, + "response": { + "bodySize": 1476, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1476, + "text": "{\"_id\":\"ad62492c-d064-4952-95ed-0a74ed5b2fd1\",\"_rev\":\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\",\"accountStatus\":\"active\",\"name\":\"Frodo TriVir\",\"description\":\"Frodo service account for use by TriVir\",\"scopes\":[\"fr:am:*\",\"fr:autoaccess:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:certificate:read\",\"fr:idc:content-security-policy:read\",\"fr:idc:cookie-domain:*\",\"fr:idc:cookie-domain:read\",\"fr:idc:custom-domain:read\",\"fr:idc:custom-domain:*\",\"fr:idc:esv:*\",\"fr:idc:promotion:*\",\"fr:idc:promotion:read\",\"fr:idc:release:*\",\"fr:idc:release:read\",\"fr:idc:sso-cookie:*\",\"fr:idc:sso-cookie:read\",\"fr:idm:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"rNWWJ9vZGkyMSXhaZVBEufp3oODou19gVDLje2_AMcw2Id4bILpBJ2Ob2LF4y2yV6l4m_OXVApvj5dInLqbsn_ZQoEmqc6AP6XFqAog4w-xRy5XFHBf1cKws3a5ANcZXlw-NTnuDFvzXkQXYeGH1WSqBIeVXlpjPe0C-7vtbN4oIZyy6QaFjqv7BEjmZ1F1YoHQryPzJl58rnomcQFqIk42-UMGfQt0w63ON1mtHyQOMWUduTFIU67_jGW7YKIrYs4JO9yizKR-4Uab9M1hKkYZRUmWCgL53YJtMjg-uVRWixKhJJy3fSCBDa_SXcz-c1glbg9fGQh908WRoN3tT4B0CaeDHexLId80Vuaq3VkplH6FZHzW9-KL8Td_0kOrKKbnLgtwRvr3Fxf95hLRVm1v4QCRujlRx5wtgkCWWHl9LET1d_MeLVYrfjz4p_Ha8ui8eWNPQLIPPcP3rbHX1py9zHHREt2Jp7ezA-lFnHbCAaoO4IksT5cIjmx1p1I_JhrVECXTn3J-s0ow3w9YIksXPovT2m-ytDWcqRJ-37OCr9xcO9CK2q9HAOjoqIpkJ0TfHrXw-YpqV9QR-sF79h-qwivBY2yrAUkfKoJwbBgjX60EDUpjEj5g157Jj576GVZtdRZgHRwzdcIFP2KyBrD3AfStpybVu2L2ZoOgebs0\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:12:58 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1476" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-71e27973-7bd2-4511-9e76-d8c807f262f3" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:12:58.568Z", + "time": 61, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 61 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-71e27973-7bd2-4511-9e76-d8c807f262f3" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1925, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/ad62492c-d064-4952-95ed-0a74ed5b2fd1?_fields=%2A" + }, + "response": { + "bodySize": 1476, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1476, + "text": "{\"_id\":\"ad62492c-d064-4952-95ed-0a74ed5b2fd1\",\"_rev\":\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\",\"accountStatus\":\"active\",\"name\":\"Frodo TriVir\",\"description\":\"Frodo service account for use by TriVir\",\"scopes\":[\"fr:am:*\",\"fr:autoaccess:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:certificate:read\",\"fr:idc:content-security-policy:read\",\"fr:idc:cookie-domain:*\",\"fr:idc:cookie-domain:read\",\"fr:idc:custom-domain:read\",\"fr:idc:custom-domain:*\",\"fr:idc:esv:*\",\"fr:idc:promotion:*\",\"fr:idc:promotion:read\",\"fr:idc:release:*\",\"fr:idc:release:read\",\"fr:idc:sso-cookie:*\",\"fr:idc:sso-cookie:read\",\"fr:idm:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"rNWWJ9vZGkyMSXhaZVBEufp3oODou19gVDLje2_AMcw2Id4bILpBJ2Ob2LF4y2yV6l4m_OXVApvj5dInLqbsn_ZQoEmqc6AP6XFqAog4w-xRy5XFHBf1cKws3a5ANcZXlw-NTnuDFvzXkQXYeGH1WSqBIeVXlpjPe0C-7vtbN4oIZyy6QaFjqv7BEjmZ1F1YoHQryPzJl58rnomcQFqIk42-UMGfQt0w63ON1mtHyQOMWUduTFIU67_jGW7YKIrYs4JO9yizKR-4Uab9M1hKkYZRUmWCgL53YJtMjg-uVRWixKhJJy3fSCBDa_SXcz-c1glbg9fGQh908WRoN3tT4B0CaeDHexLId80Vuaq3VkplH6FZHzW9-KL8Td_0kOrKKbnLgtwRvr3Fxf95hLRVm1v4QCRujlRx5wtgkCWWHl9LET1d_MeLVYrfjz4p_Ha8ui8eWNPQLIPPcP3rbHX1py9zHHREt2Jp7ezA-lFnHbCAaoO4IksT5cIjmx1p1I_JhrVECXTn3J-s0ow3w9YIksXPovT2m-ytDWcqRJ-37OCr9xcO9CK2q9HAOjoqIpkJ0TfHrXw-YpqV9QR-sF79h-qwivBY2yrAUkfKoJwbBgjX60EDUpjEj5g157Jj576GVZtdRZgHRwzdcIFP2KyBrD3AfStpybVu2L2ZoOgebs0\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:12:58 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1476" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-71e27973-7bd2-4511-9e76-d8c807f262f3" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:12:58.690Z", + "time": 56, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 56 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/node_2982235661/export_4211608755/0_node-name_use-string-arrays_2043637667/am_1076162899/recording.har b/test/e2e/mocks/node_2982235661/export_4211608755/0_node-name_use-string-arrays_2043637667/am_1076162899/recording.har new file mode 100644 index 000000000..e2a630151 --- /dev/null +++ b/test/e2e/mocks/node_2982235661/export_4211608755/0_node-name_use-string-arrays_2043637667/am_1076162899/recording.har @@ -0,0 +1,452 @@ +{ + "log": { + "_recordingName": "node/export/0_node-name/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-4044d694-530a-4c1e-8ef0-d4764a31ce00" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 585, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 585, + "text": "{\"_id\":\"*\",\"_rev\":\"-494299414\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-494299414\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "585" + }, + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:13:31 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-4044d694-530a-4c1e-8ef0-d4764a31ce00" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 677, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:13:31.024Z", + "time": 274, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 274 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-4044d694-530a-4c1e-8ef0-d4764a31ce00" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1913, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 281, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 281, + "text": "{\"_id\":\"version\",\"_rev\":\"1652964296\",\"version\":\"8.1.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 8.1.0-SNAPSHOT Build 0f3c85c8bbc4e5c93454ee525528ade846b19bcb (2025-December-04 22:27)\",\"revision\":\"0f3c85c8bbc4e5c93454ee525528ade846b19bcb\",\"date\":\"2025-December-04 22:27\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1652964296\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "281" + }, + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:13:31 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-4044d694-530a-4c1e-8ef0-d4764a31ce00" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 677, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:13:31.433Z", + "time": 112, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 112 + } + }, + { + "_id": "e6efe3392d787815b92258f4573fd0b4", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-4044d694-530a-4c1e-8ef0-d4764a31ce00" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1949, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "true" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/node-designer/node-type?_queryFilter=true" + }, + "response": { + "bodySize": 33589, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 33589, + "text": "{\"result\":[{\"_id\":\"ef81b1a52c914710b3388caebfe7233a-1\",\"_rev\":\"-1360543129\",\"serviceName\":\"ef81b1a52c914710b3388caebfe7233a\",\"displayName\":\"Display Callback\",\"description\":\"Displays custom callback to the page\",\"outcomes\":[\"outcome\"],\"outputs\":[],\"inputs\":[],\"script\":\"var SCRIPT_OUTCOMES = {\\n OUTCOME: 'outcome'\\n};\\n\\nvar CALLBACKS = {\\n\\tBOOLEAN_ATTRIBUTE_INPUT_CALLBACK: \\\"BOOLEAN_ATTRIBUTE_INPUT_CALLBACK\\\",\\n\\tCHOICE_CALLBACK: \\\"CHOICE_CALLBACK\\\",\\n\\tCONFIRMATION_CALLBACK: \\\"CONFIRMATION_CALLBACK\\\",\\n\\tCONSENT_MAPPING_CALLBACK: \\\"CONSENT_MAPPING_CALLBACK\\\",\\n\\tDEVICE_PROFILE_CALLBACK: \\\"DEVICE_PROFILE_CALLBACK\\\",\\n\\tHIDDEN_VALUE_CALLBACK: \\\"HIDDEN_VALUE_CALLBACK\\\",\\n\\tHTTP_CALLBACK: \\\"HTTP_CALLBACK\\\",\\n\\tIDP_CALLBACK: \\\"IDP_CALLBACK\\\",\\n\\tKBA_CREATE_CALLBACK: \\\"KBA_CREATE_CALLBACK\\\",\\n\\tLANGUAGE_CALLBACK: \\\"LANGUAGE_CALLBACK\\\",\\n\\tMETADATA_CALLBACK: \\\"METADATA_CALLBACK\\\",\\n\\tNAME_CALLBACK: \\\"NAME_CALLBACK\\\",\\n\\tNUMBER_ATTRIBUTE_INPUT_CALLBACK: \\\"NUMBER_ATTRIBUTE_INPUT_CALLBACK\\\",\\n\\tPASSWORD_CALLBACK: \\\"PASSWORD_CALLBACK\\\",\\n\\tPOLLING_WAIT_CALLBACK: \\\"POLLING_WAIT_CALLBACK\\\",\\n REDIRECT_CALLBACK: \\\"REDIRECT_CALLBACK\\\",\\n\\tSCRIPT_TEXT_OUTPUT_CALLBACK: \\\"SCRIPT_TEXT_OUTPUT_CALLBACK\\\",\\n\\tSELECT_IDP_CALLBACK: \\\"SELECT_IDP_CALLBACK\\\",\\n\\tSTRING_ATTRIBUTE_INPUT_CALLBACK: \\\"STRING_ATTRIBUTE_INPUT_CALLBACK\\\",\\n\\tSUSPENDED_TEXT_OUTPUT_CALLBACK: \\\"SUSPENDED_TEXT_OUTPUT_CALLBACK\\\",\\n\\tTERMS_AND_CONDITIONS_CALLBACK: \\\"TERMS_AND_CONDITIONS_CALLBACK\\\",\\n\\tTEXT_INPUT_CALLBACK: \\\"TEXT_INPUT_CALLBACK\\\",\\n\\tTEXT_OUTPUT_CALLBACK: \\\"TEXT_OUTPUT_CALLBACK\\\",\\n\\tVALIDATED_PASSWORD_CALLBACK: \\\"VALIDATED_PASSWORD_CALLBACK\\\",\\n\\tVALIDATED_USERNAME_CALLBACK: \\\"VALIDATED_USERNAME_CALLBACK\\\",\\n\\tX509_CERTIFICATE_CALLBACK: \\\"X509_CERTIFICATE_CALLBACK\\\"\\n}\\n\\nfunction isStringPresent(value) {\\n return value;\\n}\\n\\nfunction getString(value) {\\n return value || '';\\n}\\n\\nfunction isArrayPresent(value) {\\n return value;\\n}\\n\\nfunction getArray(value) {\\n return value ? JSON.parse(value) : [];\\n}\\n\\nfunction isObjectPresent(value) {\\n return value;\\n}\\n\\nfunction getObject(value) {\\n return value ? JSON.parse(value) : {};\\n}\\n\\nfunction isIntPresent(value) {\\n return value;\\n}\\n\\nfunction getInt(value) {\\n return value ? parseInt(value) : 0;\\n}\\n\\nfunction isDoublePresent(value) {\\n return value;\\n}\\n\\nfunction getDouble(value) {\\n return value ? parseFloat(value) : 0.0;\\n}\\n\\nfunction isBooleanPresent(value) {\\n return value;\\n}\\n\\nfunction getBoolean(value) {\\n return value ? value.toLowerCase() === 'true' : false;\\n}\\n\\nfunction setProperty(value) {\\n if (properties.sharedProperty) nodeState.putShared(properties.sharedProperty, value);\\n if (properties.transientProperty) nodeState.putTransient(properties.transientProperty, value);\\n if (properties.objectSharedProperty) {\\n var attributes = {};\\n attributes[properties.objectSharedProperty] = value;\\n nodeState.mergeShared({\\n objectAttributes: attributes\\n });\\n }\\n if (properties.objectTransientProperty) {\\n var attributes = {};\\n attributes[properties.objectTransientProperty] = value;\\n nodeState.mergeTransient({\\n objectAttributes: attributes\\n });\\n }\\n}\\n\\nfunction booleanAttributeInputCallback() {\\n var name = getString(properties.options.name);\\n var prompt = getString(properties.options.prompt);\\n var value = getBoolean(properties.options.value);\\n var required = getBoolean(properties.options.required);\\n var policies = getObject(properties.options.policies);\\n var validateOnly = getBoolean(properties.options.validateOnly);\\n var failedPolicies = getArray(properties.options.failedPolicies);\\n if (isBooleanPresent(properties.options.validateOnly) || isObjectPresent(properties.options.policies)) {\\n if (isArrayPresent(failedPolicies)) {\\n callbacksBuilder.booleanAttributeInputCallback(name, prompt, value, required, policies, validateOnly, failedPolicies);\\n } else {\\n callbacksBuilder.booleanAttributeInputCallback(name, prompt, value, required, policies, validateOnly);\\n }\\n } else if (isArrayPresent(failedPolicies)) {\\n callbacksBuilder.booleanAttributeInputCallback(name, prompt, value, required, failedPolicies);\\n } else {\\n callbacksBuilder.booleanAttributeInputCallback(name, prompt, value, required);\\n }\\n}\\n\\nfunction choiceCallback() {\\n var prompt = getString(properties.options.prompt);\\n var choices = getArray(properties.options.choices);\\n var defaultChoice = getInt(properties.options.defaultChoice);\\n var multipleSelectionsAllowed = getBoolean(properties.options.multipleSelectionsAllowed);\\n callbacksBuilder.choiceCallback(prompt, choices, defaultChoice, multipleSelectionsAllowed);\\n}\\n\\nfunction confirmationCallback() {\\n var prompt = getString(properties.options.prompt);\\n var messageType = getInt(properties.options.messageType);\\n var options = getArray(properties.options.options);\\n var optionType = getInt(properties.options.optionType);\\n var defaultOption = getInt(properties.options.defaultOption);\\n if (isStringPresent(properties.options.prompt)) {\\n if (isIntPresent(properties.options.optionType)) {\\n callbacksBuilder.confirmationCallback(prompt, messageType, optionType, defaultOption);\\n } else {\\n callbacksBuilder.confirmationCallback(prompt, messageType, options, defaultOption);\\n }\\n } else {\\n if (isIntPresent(properties.options.optionType)) {\\n callbacksBuilder.confirmationCallback(messageType, optionType, defaultOption);\\n } else {\\n callbacksBuilder.confirmationCallback(messageType, options, defaultOption);\\n }\\n }\\n}\\n\\nfunction consentMappingCallback() {\\n var config = getObject(properties.options.config);\\n var message = getString(properties.options.message);\\n var isRequired = getBoolean(properties.options.isRequired);\\n var name = getString(properties.options.name);\\n var displayName = getString(properties.options.displayName);\\n var icon = getString(properties.options.icon);\\n var accessLevel = getString(properties.options.accessLevel);\\n var titles = getArray(properties.options.titles);\\n if (isObjectPresent(properties.options.prompt)) {\\n callbacksBuilder.consentMappingCallback(config, message, isRequired);\\n } else {\\n callbacksBuilder.consentMappingCallback(name, displayName, icon, accessLevel, titles, message, isRequired);\\n }\\n}\\n\\nfunction deviceProfileCallback() {\\n var metadata = getBoolean(properties.options.metadata);\\n var location = getBoolean(properties.options.location);\\n var message = getString(properties.options.message);\\n callbacksBuilder.deviceProfileCallback(metadata, location, message);\\n}\\n\\nfunction hiddenValueCallback() {\\n var id = getString(properties.options.id);\\n var value = getString(properties.options.value);\\n callbacksBuilder.hiddenValueCallback(id, value);\\n}\\n\\nfunction httpCallback() {\\n var authorizationHeader = getString(properties.options.authorizationHeader);\\n var negotiationHeader = getString(properties.options.negotiationHeader);\\n var authRHeader = getString(properties.options.authRHeader);\\n var negoName = getString(properties.options.negoName);\\n var negoValue = getString(properties.options.negoValue);\\n if (isStringPresent(properties.options.authorizationHeader) || isStringPresent(properties.options.negotiationHeader)) {\\n var errorCode = getString(properties.options.errorCode);\\n callbacksBuilder.httpCallback(authorizationHeader, negotiationHeader, errorCode);\\n } else {\\n var errorCode = getInt(properties.options.errorCode);\\n callbacksBuilder.httpCallback(authRHeader, negoName, negoValue, errorCode);\\n }\\n}\\n\\nfunction idPCallback() {\\n var provider = getString(properties.options.provider);\\n var clientId = getString(properties.options.clientId);\\n var redirectUri = getString(properties.options.redirectUri);\\n var scope = getArray(properties.options.scope);\\n var nonce = getString(properties.options.nonce);\\n var request = getString(properties.options.request);\\n var requestUri = getString(properties.options.requestUri);\\n var acrValues = getArray(properties.options.acrValues);\\n var requestNativeAppForUserInfo = getBoolean(properties.options.requestNativeAppForUserInfo);\\n var token = getString(properties.options.token);\\n var tokenType = getString(properties.options.tokenType);\\n if (isStringPresent(properties.options.token) || isStringPresent(properties.options.tokenType)) {\\n callbacksBuilder.idPCallback(provider, clientId, redirectUri, scope, nonce, request, requestUri, acrValues, requestNativeAppForUserInfo, token, tokenType);\\n } else {\\n callbacksBuilder.idPCallback(provider, clientId, redirectUri, scope, nonce, request, requestUri, acrValues, requestNativeAppForUserInfo);\\n }\\n}\\n\\nfunction kbaCreateCallback() {\\n var prompt = getString(properties.options.prompt);\\n var predefinedQuestions = getArray(properties.options.predefinedQuestions);\\n var allowUserDefinedQuestions = getBoolean(properties.options.allowUserDefinedQuestions);\\n callbacksBuilder.kbaCreateCallback(prompt, predefinedQuestions, allowUserDefinedQuestions);\\n}\\n\\nfunction languageCallback() {\\n var language = getString(properties.options.language);\\n var country = getString(properties.options.country);\\n callbacksBuilder.languageCallback(language, country);\\n}\\n\\nfunction metadataCallback() {\\n var outputValue = getObject(properties.options.outputValue);\\n callbacksBuilder.metadataCallback(outputValue);\\n}\\n\\nfunction nameCallback() {\\n var prompt = getString(properties.options.prompt);\\n var defaultName = getString(properties.options.defaultName);\\n if (isStringPresent(properties.options.defaultName)) {\\n callbacksBuilder.nameCallback(prompt, defaultName);\\n } else {\\n callbacksBuilder.nameCallback(prompt);\\n }\\n}\\n\\nfunction numberAttributeInputCallback() {\\n var name = getString(properties.options.name);\\n var prompt = getString(properties.options.prompt);\\n var value = getDouble(properties.options.value);\\n var required = getBoolean(properties.options.required);\\n var policies = getObject(properties.options.policies);\\n var validateOnly = getBoolean(properties.options.validateOnly);\\n var failedPolicies = getArray(properties.options.failedPolicies);\\n if (isBooleanPresent(properties.options.validateOnly) || isObjectPresent(properties.options.policies)) {\\n if (isArrayPresent(failedPolicies)) {\\n callbacksBuilder.numberAttributeInputCallback(name, prompt, value, required, policies, validateOnly, failedPolicies);\\n } else {\\n callbacksBuilder.numberAttributeInputCallback(name, prompt, value, required, policies, validateOnly);\\n }\\n } else if (isArrayPresent(failedPolicies)) {\\n callbacksBuilder.numberAttributeInputCallback(name, prompt, value, required, failedPolicies);\\n } else {\\n callbacksBuilder.numberAttributeInputCallback(name, prompt, value, required);\\n }\\n}\\n\\nfunction passwordCallback() {\\n var prompt = getString(properties.options.prompt);\\n var echoOn = getBoolean(properties.options.echoOn);\\n callbacksBuilder.passwordCallback(prompt, echoOn);\\n}\\n\\nfunction pollingWaitCallback() {\\n var waitTime = getString(properties.options.waitTime);\\n var message = getString(properties.options.message);\\n callbacksBuilder.pollingWaitCallback(waitTime, message);\\n}\\n\\nfunction redirectCallback() {\\n throw new Error('Not Implemented');\\n}\\n\\nfunction scriptTextOutputCallback() {\\n var message = getString(properties.options.message);\\n callbacksBuilder.scriptTextOutputCallback(message);\\n}\\n\\nfunction selectIdPCallback() {\\n var providers = getObject(properties.options.providers);\\n callbacksBuilder.selectIdPCallback(providers);\\n}\\n\\nfunction stringAttributeInputCallback() {\\n var name = getString(properties.options.name);\\n var prompt = getString(properties.options.prompt);\\n var value = getString(properties.options.value);\\n var required = getBoolean(properties.options.required);\\n var policies = getObject(properties.options.policies);\\n var validateOnly = getBoolean(properties.options.validateOnly);\\n var failedPolicies = getArray(properties.options.failedPolicies);\\n if (isBooleanPresent(properties.options.validateOnly) || isObjectPresent(properties.options.policies)) {\\n if (isArrayPresent(failedPolicies)) {\\n callbacksBuilder.stringAttributeInputCallback(name, prompt, value, required, policies, validateOnly, failedPolicies);\\n } else {\\n callbacksBuilder.stringAttributeInputCallback(name, prompt, value, required, policies, validateOnly);\\n }\\n } else if (isArrayPresent(failedPolicies)) {\\n callbacksBuilder.stringAttributeInputCallback(name, prompt, value, required, failedPolicies);\\n } else {\\n callbacksBuilder.stringAttributeInputCallback(name, prompt, value, required);\\n }\\n}\\n\\nfunction suspendedTextOutputCallback() {\\n var messageType = getInt(properties.options.messageType);\\n var message = getString(properties.options.message);\\n callbacksBuilder.suspendedTextOutputCallback(messageType, message);\\n}\\n\\nfunction termsAndConditionsCallback() {\\n var version = getString(properties.options.version);\\n var terms = getString(properties.options.terms);\\n var createDate = getString(properties.options.createDate);\\n callbacksBuilder.termsAndConditionsCallback(version, terms, createDate);\\n}\\n\\nfunction textInputCallback() {\\n var prompt = getString(properties.options.prompt);\\n var defaultText = getString(properties.options.defaultText);\\n if (isStringPresent(properties.options.defaultText)) {\\n callbacksBuilder.textInputCallback(prompt, defaultText);\\n } else {\\n callbacksBuilder.textInputCallback(prompt);\\n }\\n}\\n\\nfunction textOutputCallback() {\\n var messageType = getString(properties.options.messageType);\\n var message = getString(properties.options.message);\\n callbacksBuilder.textOutputCallback(messageType, message);\\n}\\n\\nfunction validatedPasswordCallback() {\\n var prompt = getString(properties.options.prompt);\\n var echoOn = getBoolean(properties.options.echoOn);\\n var policies = getObject(properties.options.policies);\\n var validateOnly = getBoolean(properties.options.validateOnly);\\n var failedPolicies = getArray(properties.options.failedPolicies);\\n if (isArrayPresent(properties.options.failedPolicies)) {\\n callbacksBuilder.validatedPasswordCallback(prompt, echoOn, policies, validateOnly, failedPolicies);\\n } else {\\n callbacksBuilder.validatedPasswordCallback(prompt, echoOn, policies, validateOnly);\\n }\\n}\\n\\nfunction validatedUsernameCallback() {\\n var prompt = getString(properties.options.prompt);\\n var policies = getObject(properties.options.policies);\\n var validateOnly = getBoolean(properties.options.validateOnly);\\n var failedPolicies = getArray(properties.options.failedPolicies);\\n if (isArrayPresent(properties.options.failedPolicies)) {\\n callbacksBuilder.validatedUsernameCallback(prompt, policies, validateOnly, failedPolicies);\\n } else {\\n callbacksBuilder.validatedUsernameCallback(prompt, policies, validateOnly);\\n }\\n}\\n\\nfunction x509CertificateCallback() {\\n throw new Error('Not Implemented');\\n}\\n\\nfunction getBooleanAttributeInputCallback() {\\n setProperty(callbacks.getBooleanAttributeInputCallbacks().get(0));\\n}\\n\\nfunction getChoiceCallback() {\\n var multipleSelectionsAllowed = getBoolean(properties.options.multipleSelectionsAllowed);\\n var selections = callbacks.getChoiceCallbacks().get(0);\\n setProperty(multipleSelectionsAllowed ? selections : selections[0]);\\n}\\n\\nfunction getConfirmationCallback() {\\n setProperty(callbacks.getConfirmationCallbacks().get(0));\\n}\\n\\nfunction getConsentMappingCallback() {\\n setProperty(callbacks.getConsentMappingCallbacks().get(0));\\n}\\n\\nfunction getDeviceProfileCallback() {\\n setProperty(callbacks.getDeviceProfileCallbacks().get(0));\\n}\\n\\nfunction getHiddenValueCallback() {\\n var id = getString(properties.options.id);\\n setProperty(callbacks.getHiddenValueCallbacks().get(id));\\n}\\n\\nfunction getHttpCallback() {\\n setProperty(callbacks.getHttpCallbacks().get(0));\\n}\\n\\nfunction getIdPCallback() {\\n setProperty(callbacks.getIdpCallbacks().get(0));\\n}\\n\\nfunction getKbaCreateCallback() {\\n setProperty(callbacks.getKbaCreateCallbacks().get(0));\\n}\\n\\nfunction getLanguageCallback() {\\n setProperty(callbacks.getLanguageCallbacks().get(0));\\n}\\n\\nfunction getNameCallback() {\\n setProperty(callbacks.getNameCallbacks().get(0));\\n}\\n\\nfunction getNumberAttributeInputCallback() {\\n setProperty(callbacks.getNumberAttributeInputCallbacks().get(0));\\n}\\n\\nfunction getPasswordCallback() {\\n setProperty(callbacks.getPasswordCallbacks().get(0));\\n}\\n\\nfunction getSelectIdPCallback() {\\n setProperty(callbacks.getSelectIdPCallbacks().get(0));\\n}\\n\\nfunction getStringAttributeInputCallback() {\\n setProperty(callbacks.getStringAttributeInputCallbacks().get(0));\\n}\\n\\nfunction getTermsAndConditionsCallback() {\\n setProperty(callbacks.getTermsAndConditionsCallbacks().get(0));\\n}\\n\\nfunction getTextInputCallback() {\\n setProperty(callbacks.getTextInputCallbacks().get(0));\\n}\\n\\nfunction getValidatedPasswordCallback() {\\n setProperty(callbacks.getValidatedPasswordCallbacks().get(0));\\n}\\n\\nfunction getValidatedUsernameCallback() {\\n setProperty(callbacks.getValidatedUsernameCallbacks().get(0));\\n}\\n\\nfunction getX509CertificateCallback() {\\n setProperty(callbacks.getX509CertificateCallbacks().get(0));\\n}\\n\\nfunction main() {\\n if (!callbacks.isEmpty()) {\\n switch (properties.callback) {\\n case CALLBACKS.BOOLEAN_ATTRIBUTE_INPUT_CALLBACK: getBooleanAttributeInputCallback(); break;\\n case CALLBACKS.CHOICE_CALLBACK: getChoiceCallback(); break;\\n case CALLBACKS.CONFIRMATION_CALLBACK: getConfirmationCallback(); break;\\n case CALLBACKS.CONSENT_MAPPING_CALLBACK: getConsentMappingCallback(); break;\\n case CALLBACKS.DEVICE_PROFILE_CALLBACK: getDeviceProfileCallback(); break;\\n case CALLBACKS.HIDDEN_VALUE_CALLBACK: getHiddenValueCallback(); break;\\n case CALLBACKS.HTTP_CALLBACK: getHttpCallback(); break;\\n case CALLBACKS.IDP_CALLBACK: getIdPCallback(); break;\\n case CALLBACKS.KBA_CREATE_CALLBACK: getKbaCreateCallback(); break;\\n case CALLBACKS.LANGUAGE_CALLBACK: getLanguageCallback(); break;\\n case CALLBACKS.NAME_CALLBACK: getNameCallback(); break;\\n case CALLBACKS.NUMBER_ATTRIBUTE_INPUT_CALLBACK: getNumberAttributeInputCallback(); break;\\n case CALLBACKS.PASSWORD_CALLBACK: getPasswordCallback(); break;\\n case CALLBACKS.SELECT_IDP_CALLBACK: getSelectIdPCallback(); break;\\n case CALLBACKS.STRING_ATTRIBUTE_INPUT_CALLBACK: getStringAttributeInputCallback(); break;\\n case CALLBACKS.TERMS_AND_CONDITIONS_CALLBACK: getTermsAndConditionsCallback(); break;\\n case CALLBACKS.TEXT_INPUT_CALLBACK: getTextInputCallback(); break;\\n case CALLBACKS.VALIDATED_PASSWORD_CALLBACK: getValidatedPasswordCallback(); break;\\n case CALLBACKS.VALIDATED_USERNAME_CALLBACK: getValidatedUsernameCallback(); break;\\n case CALLBACKS.X509_CERTIFICATE_CALLBACK: getX509CertificateCallback(); break;\\n default: break;\\n }\\n action.goTo(SCRIPT_OUTCOMES.OUTCOME);\\n return;\\n }\\n\\n switch (properties.callback) {\\n case CALLBACKS.BOOLEAN_ATTRIBUTE_INPUT_CALLBACK: booleanAttributeInputCallback(); break;\\n case CALLBACKS.CHOICE_CALLBACK: choiceCallback(); break;\\n case CALLBACKS.CONFIRMATION_CALLBACK: confirmationCallback(); break;\\n case CALLBACKS.CONSENT_MAPPING_CALLBACK: consentMappingCallback(); break;\\n case CALLBACKS.DEVICE_PROFILE_CALLBACK: deviceProfileCallback(); break;\\n case CALLBACKS.HIDDEN_VALUE_CALLBACK: hiddenValueCallback(); break;\\n case CALLBACKS.HTTP_CALLBACK: httpCallback(); break;\\n case CALLBACKS.IDP_CALLBACK: idPCallback(); break;\\n case CALLBACKS.KBA_CREATE_CALLBACK: kbaCreateCallback(); break;\\n case CALLBACKS.LANGUAGE_CALLBACK: languageCallback(); break;\\n case CALLBACKS.METADATA_CALLBACK: metadataCallback(); break;\\n case CALLBACKS.NAME_CALLBACK: nameCallback(); break;\\n case CALLBACKS.NUMBER_ATTRIBUTE_INPUT_CALLBACK: numberAttributeInputCallback(); break;\\n case CALLBACKS.PASSWORD_CALLBACK: passwordCallback(); break;\\n case CALLBACKS.POLLING_WAIT_CALLBACK: pollingWaitCallback(); break;\\n case CALLBACKS.REDIRECT_CALLBACK: redirectCallback(); break;\\n case CALLBACKS.SCRIPT_TEXT_OUTPUT_CALLBACK: scriptTextOutputCallback(); break;\\n case CALLBACKS.SELECT_IDP_CALLBACK: selectIdPCallback(); break;\\n case CALLBACKS.STRING_ATTRIBUTE_INPUT_CALLBACK: stringAttributeInputCallback(); break;\\n case CALLBACKS.SUSPENDED_TEXT_OUTPUT_CALLBACK: suspendedTextOutputCallback(); break;\\n case CALLBACKS.TERMS_AND_CONDITIONS_CALLBACK: termsAndConditionsCallback(); break;\\n case CALLBACKS.TEXT_INPUT_CALLBACK: textInputCallback(); break;\\n case CALLBACKS.TEXT_OUTPUT_CALLBACK: textOutputCallback(); break;\\n case CALLBACKS.VALIDATED_PASSWORD_CALLBACK: validatedPasswordCallback(); break;\\n case CALLBACKS.VALIDATED_USERNAME_CALLBACK: validatedUsernameCallback(); break;\\n case CALLBACKS.X509_CERTIFICATE_CALLBACK: x509CertificateCallback(); break;\\n default: throw new Error('Unknown Callback'); // Should never reach this case\\n }\\n}\\n\\nmain();\\n\",\"errorOutcome\":false,\"tags\":[\"callback\",\"utilities\"],\"properties\":{\"callback\":{\"title\":\"Callback\",\"description\":\"The callback to display\",\"type\":\"STRING\",\"required\":true,\"options\":{\"METADATA_CALLBACK\":\"metadataCallback\",\"TERMS_AND_CONDITIONS_CALLBACK\":\"termsAndConditionsCallback\",\"NUMBER_ATTRIBUTE_INPUT_CALLBACK\":\"numberAttributeInputCallback\",\"TEXT_OUTPUT_CALLBACK\":\"textOutputCallback\",\"SCRIPT_TEXT_OUTPUT_CALLBACK\":\"scriptTextOutputCallback\",\"CONSENT_MAPPING_CALLBACK\":\"consentMappingCallback\",\"STRING_ATTRIBUTE_INPUT_CALLBACK\":\"stringAttributeInputCallback\",\"IDP_CALLBACK\":\"idPCallback\",\"VALIDATED_PASSWORD_CALLBACK\":\"validatedPasswordCallback\",\"SELECT_IDP_CALLBACK\":\"selectIdPCallback\",\"POLLING_WAIT_CALLBACK\":\"pollingWaitCallback\",\"NAME_CALLBACK\":\"nameCallback\",\"SUSPENDED_TEXT_OUTPUT_CALLBACK\":\"suspendedTextOutputCallback\",\"REDIRECT_CALLBACK\":\"redirectCallback\",\"X509_CERTIFICATE_CALLBACK\":\"x509CertificateCallback\",\"PASSWORD_CALLBACK\":\"passwordCallback\",\"TEXT_INPUT_CALLBACK\":\"textInputCallback\",\"BOOLEAN_ATTRIBUTE_INPUT_CALLBACK\":\"booleanAttributeInputCallback\",\"CONFIRMATION_CALLBACK\":\"confirmationCallback\",\"CHOICE_CALLBACK\":\"choiceCallback\",\"DEVICE_PROFILE_CALLBACK\":\"deviceProfileCallback\",\"HIDDEN_VALUE_CALLBACK\":\"hiddenValueCallback\",\"HTTP_CALLBACK\":\"httpCallback\",\"VALIDATED_USERNAME_CALLBACK\":\"validatedUsernameCallback\",\"KBA_CREATE_CALLBACK\":\"kbaCreateCallback\",\"LANGUAGE_CALLBACK\":\"languageCallback\"},\"multivalued\":false},\"objectSharedProperty\":{\"title\":\"Object Attributes Shared Property\",\"description\":\"The objectAttributes property on the shared state to put the callback input into (if applicable)\",\"type\":\"STRING\",\"required\":false,\"multivalued\":false},\"objectTransientProperty\":{\"title\":\"Object Attributes Transient Property\",\"description\":\"The objectAttributes property on the transient state to put the callback input into (if applicable)\",\"type\":\"STRING\",\"required\":false,\"multivalued\":false},\"options\":{\"title\":\"Options\",\"description\":\"The options containing the parameters for the callback (see documentation for possible parameters: https://docs.pingidentity.com/pingoneaic/latest/am-scripting/scripting-api-node.html#scripting-api-node-callbacks). \\n\\nFor example, for textOutputCallback, the options could be: { messageType: 0, message: \\\"Hello World!\\\" }. \\n\\nNote that for required parameters that are not specified in the options will use default values based on the type of the parameter (\\\"\\\" for Strings, [] for Arrays, {} for Objects, 0 for Ints, 0.0 for Doubles, and false for Booleans).\",\"type\":\"OBJECT\",\"required\":true,\"multivalued\":false},\"sharedProperty\":{\"title\":\"Shared State Property\",\"description\":\"The shared state property to put the callback input into (if applicable)\",\"type\":\"STRING\",\"required\":false,\"multivalued\":false},\"transientProperty\":{\"title\":\"Transient State Property\",\"description\":\"The transient state property to put the callback input into (if applicable)\",\"type\":\"STRING\",\"required\":false,\"multivalued\":false}}},{\"_id\":\"e5ad0110c8ee4dafaae983003cd05d4a-1\",\"_rev\":\"1242245001\",\"serviceName\":\"e5ad0110c8ee4dafaae983003cd05d4a\",\"displayName\":\"Generate JWT\",\"description\":\"Generate a signed JWT using the HMAC SHA-256 algorithm.\",\"outcomes\":[\"True\",\"False\"],\"outputs\":[],\"inputs\":[],\"script\":\"var aud = properties.audience;\\nvar iss = properties.issuer;\\nvar validity = properties.validity;\\nvar esv = properties.signingkey;\\n\\nvar signingkey = systemEnv.getProperty(esv);\\n\\nvar username = nodeState.get(\\\"username\\\");\\n\\nvar data = {\\n jwtType:\\\"SIGNED\\\",\\n jwsAlgorithm: \\\"HS256\\\",\\n issuer: iss,\\n subject: username,\\n audience: aud,\\n type: \\\"JWT\\\",\\n validityMinutes: validity,\\n signingKey: signingkey\\n};\\n\\nvar jwt = jwtAssertion.generateJwt(data);\\n\\nif (jwt !== null && jwt.length > 0) {\\n nodeState.putShared(\\\"assertionJwt\\\" , jwt);\\n action.goTo(\\\"True\\\");\\n} else {\\n action.goTo(\\\"False\\\");\\n}\",\"errorOutcome\":true,\"tags\":[\"Utilities\",\"utilities\"],\"properties\":{\"audience\":{\"title\":\"Audience\",\"description\":\"The audience (aud) claim\",\"type\":\"STRING\",\"required\":true,\"multivalued\":false},\"issuer\":{\"title\":\"Issuer\",\"description\":\"The issuer (iss) claim\",\"type\":\"STRING\",\"required\":true,\"multivalued\":false},\"signingkey\":{\"title\":\"HMAC Signing Key\",\"description\":\"The secret label for the HMAC signing key\",\"type\":\"STRING\",\"required\":true,\"defaultValue\":\"esv.signing.key\",\"multivalued\":false},\"validity\":{\"title\":\"Validity (minutes)\",\"description\":\"\",\"type\":\"NUMBER\",\"required\":true,\"defaultValue\":5,\"multivalued\":false}}},{\"_id\":\"session-1\",\"_rev\":\"717898089\",\"serviceName\":\"session\",\"displayName\":\"Has Session AM\",\"description\":\"Checks if the user has a current session.\",\"outcomes\":[\"True\",\"False\"],\"outputs\":[],\"inputs\":[],\"script\":\"var SCRIPT_OUTCOMES = {\\n TRUE: 'True',\\n FALSE: 'False'\\n}\\n\\nfunction main() {\\n action.goTo(typeof existingSession === \\\"undefined\\\" ? SCRIPT_OUTCOMES.FALSE : SCRIPT_OUTCOMES.TRUE);\\n}\\n\\nmain();\\n\",\"errorOutcome\":false,\"tags\":[\"utilities\"],\"properties\":{}},{\"_id\":\"8ab9f1aad4b4460a9c45d15fb148e221-1\",\"_rev\":\"-609282293\",\"serviceName\":\"8ab9f1aad4b4460a9c45d15fb148e221\",\"displayName\":\"Display State\",\"description\":\"Debug node that displays the shared and transient state of the journey for debugging purposes.\",\"outcomes\":[\"outcome\"],\"outputs\":[],\"inputs\":[],\"script\":\"var SCRIPT_OUTCOMES = {\\n OUTCOME: \\\"outcome\\\"\\n};\\n\\nfunction main() {\\n if (!callbacks.isEmpty()) {\\n action.goTo(SCRIPT_OUTCOMES.OUTCOME);\\n return;\\n }\\n var keySet = nodeState.keys(); // Java Set\\n var keys = Array.from(keySet); // Make it into JavaScript array\\n debugState = {};\\n for (var i in keys) {\\n var k = new String(keys[i]);\\n var item = nodeState.get(k);\\n if (typeof item === \\\"object\\\") {\\n debugState[k] = nodeState.getObject(k);\\n } else {\\n debugState[k] = nodeState.get(k);\\n }\\n }\\n if (properties.displayFormat === \\\"JSON\\\") {\\n callbacksBuilder.textOutputCallback(0, `
${JSON.stringify(debugState, null, 2)}
`);\\n return;\\n }\\n callbacksBuilder.textOutputCallback(0, `${Array.from(Object.keys(debugState).map(k => ``))}
KeyValue
${k}
${debugState[k]}
`);\\n}\\n\\nmain();\\n\",\"errorOutcome\":false,\"tags\":[\"debug\",\"testing\"],\"properties\":{\"displayFormat\":{\"title\":\"Display Format\",\"description\":\"The format in which to display the states.\",\"type\":\"STRING\",\"required\":true,\"defaultValue\":\"TABLE\",\"options\":{\"TABLE\":\"HTML Table\",\"JSON\":\"Raw JSON\"},\"multivalued\":false}}},{\"_id\":\"c15e2efb3deb4d4ea338c74a6440b69f-1\",\"_rev\":\"-803916807\",\"serviceName\":\"c15e2efb3deb4d4ea338c74a6440b69f\",\"displayName\":\"Vector ALU\",\"description\":\"Simple ALU that performs basic binary vector math operations. Outputs the result onto the shared state with key \\\"c\\\".\",\"outcomes\":[\"Success\"],\"outputs\":[\"c\"],\"inputs\":[],\"script\":\"var SCRIPT_OUTCOMES = {\\n SUCCESS: 'Success'\\n};\\n\\nvar OPERATORS = {\\n ADD: \\\"ADD\\\",\\n SUBTRACT: \\\"SUBTRACT\\\",\\n DOT: \\\"DOT\\\",\\n CROSS: \\\"CROSS\\\"\\n}\\n\\nfunction add(a, b) {\\n return a.map((v, i) => v + b[i]);\\n}\\n\\nfunction subtract(a, b) {\\n return a.map((v, i) => v - b[i]);\\n}\\n\\nfunction dot(a, b) {\\n return a.reduce((sum, v, i) => sum + v * b[i], 0);\\n}\\n\\nfunction cross(a, b) {\\n return [\\n a[1] * b[2] - a[2] * b[1],\\n a[2] * b[0] - a[0] * b[2],\\n a[0] * b[1] - a[1] * b[0]\\n ];\\n}\\n\\nfunction main() {\\n if (properties.a.length !== properties.b.length) throw new Error(\\\"Vectors not the same dimension.\\\");\\n switch (properties.operator) {\\n case OPERATORS.ADD:\\n nodeState.putShared(\\\"c\\\", add(properties.a, properties.b));\\n break;\\n case OPERATORS.SUBTRACT:\\n nodeState.putShared(\\\"c\\\", subtract(properties.a, properties.b));\\n break;\\n case OPERATORS.DOT:\\n nodeState.putShared(\\\"c\\\", dot(properties.a, properties.b));\\n break;\\n case OPERATORS.CROSS:\\n if (properties.a.length !== 3) throw new Error(\\\"Vectors not dimension 3 for cross product\\\");\\n nodeState.putShared(\\\"c\\\", cross(properties.a, properties.b));\\n break;\\n default: throw new Error(\\\"Unknown operator.\\\");\\n }\\n action.goTo(SCRIPT_OUTCOMES.SUCCESS);\\n}\\n\\nmain();\\n\",\"errorOutcome\":true,\"tags\":[\"math\",\"vector\",\"utilities\"],\"properties\":{\"a\":{\"title\":\"A\",\"description\":\"Left vector operand\",\"type\":\"NUMBER\",\"required\":true,\"defaultValue\":[1,2,3],\"multivalued\":true},\"b\":{\"title\":\"B\",\"description\":\"Right vector operand\",\"type\":\"NUMBER\",\"required\":true,\"defaultValue\":[4,5,6],\"multivalued\":true},\"operator\":{\"title\":\"Operator\",\"description\":\"The binary operation to perform on the vectors.\",\"type\":\"STRING\",\"required\":true,\"defaultValue\":\"DOT\",\"options\":{\"ADD\":\"+\",\"CROSS\":\"X\",\"DOT\":\".\",\"SUBTRACT\":\"-\"},\"multivalued\":false}}},{\"_id\":\"c605506774a848f7877b4d17a453bd39-1\",\"_rev\":\"1974329536\",\"serviceName\":\"c605506774a848f7877b4d17a453bd39\",\"displayName\":\"Has Session\",\"description\":\"Checks if the user has a current session.\",\"outcomes\":[\"True\",\"False\"],\"outputs\":[],\"inputs\":[],\"script\":\"var SCRIPT_OUTCOMES = {\\n TRUE: 'True',\\n FALSE: 'False'\\n}\\n\\nfunction main() {\\n action.goTo(typeof existingSession === \\\"undefined\\\" ? SCRIPT_OUTCOMES.FALSE : SCRIPT_OUTCOMES.TRUE);\\n}\\n\\nmain();\\n\",\"errorOutcome\":false,\"tags\":[\"utilities\"],\"properties\":{}},{\"_id\":\"c6063fb2f5dc42dd9772bedc93898bd8-1\",\"_rev\":\"1371687245\",\"serviceName\":\"c6063fb2f5dc42dd9772bedc93898bd8\",\"displayName\":\"ALU\",\"description\":\"Simple ALU that performs basic binary math operations. Expects an \\\"x\\\" and \\\"y\\\" value on the shared state, and will produce a new \\\"z\\\" value on the shared state as output.\",\"outcomes\":[\"Success\"],\"outputs\":[\"z\"],\"inputs\":[\"x\",\"y\"],\"script\":\"var SCRIPT_OUTCOMES = {\\n SUCCESS: 'Success'\\n};\\n\\nvar OPERATORS = {\\n ADD: \\\"ADD\\\",\\n SUBTRACT: \\\"SUBTRACT\\\",\\n MULTIPLY: \\\"MULTIPLY\\\",\\n DIVIDE: \\\"DIVIDE\\\"\\n}\\n\\nfunction main() {\\n var a = Number(properties.a);\\n var b = Number(properties.b);\\n switch (properties.operator) {\\n case OPERATORS.ADD:\\n nodeState.putShared(\\\"z\\\", a + b);\\n break;\\n case OPERATORS.SUBTRACT:\\n nodeState.putShared(\\\"z\\\", a - b);\\n break;\\n case OPERATORS.MULTIPLY:\\n nodeState.putShared(\\\"z\\\", a * b);\\n break;\\n case OPERATORS.DIVIDE:\\n if (b == 0) throw new Error(\\\"Cannot divide by 0\\\");\\n nodeState.putShared(\\\"z\\\", a / b);\\n break;\\n default: throw new Error(\\\"Unknown operator.\\\");\\n }\\n action.goTo(SCRIPT_OUTCOMES.SUCCESS);\\n}\\n\\nmain();\\n\",\"errorOutcome\":true,\"tags\":[\"math\",\"utilities\"],\"properties\":{\"operator\":{\"title\":\"Operator\",\"description\":\"The operation to perform.\",\"type\":\"STRING\",\"required\":true,\"defaultValue\":\"ADD\",\"options\":{\"ADD\":\"+\",\"MULTIPLY\":\"*\",\"SUBTRACT\":\"-\",\"DIVIDE\":\"/\"},\"multivalued\":false}}}],\"resultCount\":7,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"EXACT\",\"totalPagedResults\":7,\"remainingPagedResults\":-1}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0, resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:13:31 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-4044d694-530a-4c1e-8ef0-d4764a31ce00" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + }, + { + "name": "transfer-encoding", + "value": "chunked" + } + ], + "headersSize": 690, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:13:31.619Z", + "time": 83, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 83 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/node_2982235661/export_4211608755/0_node-name_use-string-arrays_2043637667/oauth2_393036114/recording.har b/test/e2e/mocks/node_2982235661/export_4211608755/0_node-name_use-string-arrays_2043637667/oauth2_393036114/recording.har new file mode 100644 index 000000000..f19ebadb6 --- /dev/null +++ b/test/e2e/mocks/node_2982235661/export_4211608755/0_node-name_use-string-arrays_2043637667/oauth2_393036114/recording.har @@ -0,0 +1,142 @@ +{ + "log": { + "_recordingName": "node/export/0_node-name/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1329, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-4044d694-530a-4c1e-8ef0-d4764a31ce00" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1329" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:autoaccess:* fr:idc:esv:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1787, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1787, + "text": "{\"access_token\":\"\",\"scope\":\"fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:autoaccess:* fr:idc:esv:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1787" + }, + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:13:31 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-4044d694-530a-4c1e-8ef0-d4764a31ce00" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 451, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:13:31.324Z", + "time": 95, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 95 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/node_2982235661/export_4211608755/0_node-name_use-string-arrays_2043637667/openidm_3290118515/recording.har b/test/e2e/mocks/node_2982235661/export_4211608755/0_node-name_use-string-arrays_2043637667/openidm_3290118515/recording.har new file mode 100644 index 000000000..951b16357 --- /dev/null +++ b/test/e2e/mocks/node_2982235661/export_4211608755/0_node-name_use-string-arrays_2043637667/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "node/export/0_node-name/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-4044d694-530a-4c1e-8ef0-d4764a31ce00" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1925, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/ad62492c-d064-4952-95ed-0a74ed5b2fd1?_fields=%2A" + }, + "response": { + "bodySize": 1476, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1476, + "text": "{\"_id\":\"ad62492c-d064-4952-95ed-0a74ed5b2fd1\",\"_rev\":\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\",\"accountStatus\":\"active\",\"name\":\"Frodo TriVir\",\"description\":\"Frodo service account for use by TriVir\",\"scopes\":[\"fr:am:*\",\"fr:autoaccess:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:certificate:read\",\"fr:idc:content-security-policy:read\",\"fr:idc:cookie-domain:*\",\"fr:idc:cookie-domain:read\",\"fr:idc:custom-domain:read\",\"fr:idc:custom-domain:*\",\"fr:idc:esv:*\",\"fr:idc:promotion:*\",\"fr:idc:promotion:read\",\"fr:idc:release:*\",\"fr:idc:release:read\",\"fr:idc:sso-cookie:*\",\"fr:idc:sso-cookie:read\",\"fr:idm:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"rNWWJ9vZGkyMSXhaZVBEufp3oODou19gVDLje2_AMcw2Id4bILpBJ2Ob2LF4y2yV6l4m_OXVApvj5dInLqbsn_ZQoEmqc6AP6XFqAog4w-xRy5XFHBf1cKws3a5ANcZXlw-NTnuDFvzXkQXYeGH1WSqBIeVXlpjPe0C-7vtbN4oIZyy6QaFjqv7BEjmZ1F1YoHQryPzJl58rnomcQFqIk42-UMGfQt0w63ON1mtHyQOMWUduTFIU67_jGW7YKIrYs4JO9yizKR-4Uab9M1hKkYZRUmWCgL53YJtMjg-uVRWixKhJJy3fSCBDa_SXcz-c1glbg9fGQh908WRoN3tT4B0CaeDHexLId80Vuaq3VkplH6FZHzW9-KL8Td_0kOrKKbnLgtwRvr3Fxf95hLRVm1v4QCRujlRx5wtgkCWWHl9LET1d_MeLVYrfjz4p_Ha8ui8eWNPQLIPPcP3rbHX1py9zHHREt2Jp7ezA-lFnHbCAaoO4IksT5cIjmx1p1I_JhrVECXTn3J-s0ow3w9YIksXPovT2m-ytDWcqRJ-37OCr9xcO9CK2q9HAOjoqIpkJ0TfHrXw-YpqV9QR-sF79h-qwivBY2yrAUkfKoJwbBgjX60EDUpjEj5g157Jj576GVZtdRZgHRwzdcIFP2KyBrD3AfStpybVu2L2ZoOgebs0\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:13:31 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1476" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-4044d694-530a-4c1e-8ef0-d4764a31ce00" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:13:31.431Z", + "time": 63, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 63 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.3.3" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-4044d694-530a-4c1e-8ef0-d4764a31ce00" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1925, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/ad62492c-d064-4952-95ed-0a74ed5b2fd1?_fields=%2A" + }, + "response": { + "bodySize": 1476, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1476, + "text": "{\"_id\":\"ad62492c-d064-4952-95ed-0a74ed5b2fd1\",\"_rev\":\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\",\"accountStatus\":\"active\",\"name\":\"Frodo TriVir\",\"description\":\"Frodo service account for use by TriVir\",\"scopes\":[\"fr:am:*\",\"fr:autoaccess:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:certificate:read\",\"fr:idc:content-security-policy:read\",\"fr:idc:cookie-domain:*\",\"fr:idc:cookie-domain:read\",\"fr:idc:custom-domain:read\",\"fr:idc:custom-domain:*\",\"fr:idc:esv:*\",\"fr:idc:promotion:*\",\"fr:idc:promotion:read\",\"fr:idc:release:*\",\"fr:idc:release:read\",\"fr:idc:sso-cookie:*\",\"fr:idc:sso-cookie:read\",\"fr:idm:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"rNWWJ9vZGkyMSXhaZVBEufp3oODou19gVDLje2_AMcw2Id4bILpBJ2Ob2LF4y2yV6l4m_OXVApvj5dInLqbsn_ZQoEmqc6AP6XFqAog4w-xRy5XFHBf1cKws3a5ANcZXlw-NTnuDFvzXkQXYeGH1WSqBIeVXlpjPe0C-7vtbN4oIZyy6QaFjqv7BEjmZ1F1YoHQryPzJl58rnomcQFqIk42-UMGfQt0w63ON1mtHyQOMWUduTFIU67_jGW7YKIrYs4JO9yizKR-4Uab9M1hKkYZRUmWCgL53YJtMjg-uVRWixKhJJy3fSCBDa_SXcz-c1glbg9fGQh908WRoN3tT4B0CaeDHexLId80Vuaq3VkplH6FZHzW9-KL8Td_0kOrKKbnLgtwRvr3Fxf95hLRVm1v4QCRujlRx5wtgkCWWHl9LET1d_MeLVYrfjz4p_Ha8ui8eWNPQLIPPcP3rbHX1py9zHHREt2Jp7ezA-lFnHbCAaoO4IksT5cIjmx1p1I_JhrVECXTn3J-s0ow3w9YIksXPovT2m-ytDWcqRJ-37OCr9xcO9CK2q9HAOjoqIpkJ0TfHrXw-YpqV9QR-sF79h-qwivBY2yrAUkfKoJwbBgjX60EDUpjEj5g157Jj576GVZtdRZgHRwzdcIFP2KyBrD3AfStpybVu2L2ZoOgebs0\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 17 Dec 2025 23:13:31 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"03de0609-c46a-478a-bc58-6f69391b4a0d-2546\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1476" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-4044d694-530a-4c1e-8ef0-d4764a31ce00" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2025-12-17T23:13:31.551Z", + "time": 57, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 57 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/script_540962730/export_4211608755/0_extract_script-id_directory_3126738353/am_1076162899/recording.har b/test/e2e/mocks/script_540962730/export_4211608755/0_extract_script-id_directory_3126738353/am_1076162899/recording.har new file mode 100644 index 000000000..fe0589b09 --- /dev/null +++ b/test/e2e/mocks/script_540962730/export_4211608755/0_extract_script-id_directory_3126738353/am_1076162899/recording.har @@ -0,0 +1,1067 @@ +{ + "log": { + "_recordingName": "script/export/0_extract_script-id_directory/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "accept-api-version", + "value": "resource=2.0" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 387, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 538, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 538, + "text": "{\"_id\":\"*\",\"_rev\":\"36966512\",\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[]}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=2.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"36966512\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "538" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:32:43 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 785, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:32:44.322Z", + "time": 276, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 276 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1936, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 284, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 284, + "text": "{\"_id\":\"version\",\"_rev\":\"-1830081578\",\"version\":\"7.6.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 7.6.0-SNAPSHOT Build 98ab9c81e93dae0afbb3fb3ee4bbc41d745361bd (2024-September-04 13:47)\",\"revision\":\"98ab9c81e93dae0afbb3fb3ee4bbc41d745361bd\",\"date\":\"2024-September-04 13:47\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-1830081578\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "284" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:32:44 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 788, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:32:44.717Z", + "time": 72, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 72 + } + }, + { + "_id": "0ac4a5ec30bd9a108e714d2a1992da80", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "accept-api-version", + "value": "protocol=2.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 2000, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/realms/root/realms/alpha/scripts/bb393d07-a121-47e2-9d24-1a1066f39ec0" + }, + "response": { + "bodySize": 659, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 659, + "text": "{\"_id\":\"bb393d07-a121-47e2-9d24-1a1066f39ec0\",\"name\":\"My Example Script Using Libraries\",\"description\":\"My Example Script Using Libraries\",\"script\":\"LyoqCiAqIFRlc3RpbmcgbGlicmFyeSBzY3JpcHRzCiAqLwp2YXIgbXlsaWIgPSByZXF1aXJlKCdNeSBFeGFtcGxlIExpYnJhcnknKTsKdmFyIGxvZ2dlcnMgPSByZXF1aXJlKCdMaWJyYXJ5IFNjcmlwdCcpOwoKbXlsaWIuYWRkKDEpOwpteWxpYi5sb2dUb3RhbChsb2dnZXIpOwpteWxpYi5hZGQoMyk7Cm15bGliLmxvZ1RvdGFsV2l0aE1lc3NhZ2UobG9nZ2VyLCBteWxpYi5NU0cpOwoKb3V0Y29tZSA9ICd0cnVlJzs=\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"2.0\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "659" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:32:44 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 766, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:32:44.889Z", + "time": 68, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 68 + } + }, + { + "_id": "9f5fae53bb48b1f59117d2164779fd6b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "accept-api-version", + "value": "protocol=2.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 2017, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "name eq \"My Example Library\"" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/realms/root/realms/alpha/scripts?_queryFilter=name%20eq%20%22My%20Example%20Library%22" + }, + "response": { + "bodySize": 864, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 864, + "text": "{\"result\":[{\"_id\":\"2c38c998-aec0-4e56-8d46-bff6e24a704e\",\"name\":\"My Example Library\",\"description\":\"My Example Library\",\"script\":\"dmFyIGkgPSAwOwoKZnVuY3Rpb24gYWRkKGopIHtpICs9IGp9OwpmdW5jdGlvbiBsb2dUb3RhbChsb2cpIHsgbG9nLmluZm8oIlRvdGFsOiAiICsgaSkgfTsKCi8vIGV4cG9ydCBjb25zdGFudApleHBvcnRzLk1TRyA9ICdGaW5hbCBzdW0nOwoKLy8gZXhwb3J0IGZ1bmN0aW9ucwpleHBvcnRzLmFkZCA9IGFkZDsKZXhwb3J0cy5sb2dUb3RhbCA9IGxvZ1RvdGFsOwoKLy9kaXJlY3QgZXhwb3J0IHVzaW5nIGFuIGlubGluZSBkZWNsYXJhdGlvbgpleHBvcnRzLmxvZ1RvdGFsV2l0aE1lc3NhZ2UgPSAobG9nLCBtZXNzYWdlKSA9PiBsb2cuaW5mbyhtZXNzYWdlICsgIjogIiArIGkpOw==\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"LIBRARY\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"2.0\"}],\"resultCount\":1,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"NONE\",\"totalPagedResults\":-1,\"remainingPagedResults\":0}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.0,resource=1.1, resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "864" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:32:44 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 793, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:32:44.965Z", + "time": 65, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 65 + } + }, + { + "_id": "2c8325ae78c1183838d010882c0b48b2", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "accept-api-version", + "value": "protocol=2.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 2011, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "name eq \"Library Script\"" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/realms/root/realms/alpha/scripts?_queryFilter=name%20eq%20%22Library%20Script%22" + }, + "response": { + "bodySize": 1746, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1746, + "text": "{\"result\":[{\"_id\":\"6c49bebe-3a62-11ed-a261-0242ac120002\",\"name\":\"Library Script\",\"description\":\"Default global library script to be referenced from other scripts\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjItMjAyMyBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgovKgogKiBUaGlzIGlzIGFuIGV4YW1wbGUgbGlicmFyeSBzY3JpcHQgd2l0aCBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gb3RoZXIgc2NyaXB0cy4KICogVG8gcmVmZXJlbmNlIGl0LCB1c2UgdGhlIGZvbGxvd2luZzoKICoKICogdmFyIGxpYnJhcnkgPSByZXF1aXJlKCJMaWJyYXJ5IFNjcmlwdCIpOwogKgogKiBsaWJyYXJ5LmxvZ0Vycm9yKGxvZ2dlciwgIkVycm9yIG1lc3NhZ2UiKTsKICogbGlicmFyeS5sb2dEZWJ1Zyhsb2dnZXIsICJEZWJ1ZyBtZXNzYWdlIik7CiAqLwoKZnVuY3Rpb24gbG9nRXJyb3IobG9nLCBlcnJvck1lc3NhZ2UpIHsKICBsb2cuZXJyb3IoZXJyb3JNZXNzYWdlKTsKfQoKZnVuY3Rpb24gbG9nV2FybmluZyhsb2csIHdhcm5pbmdNZXNzYWdlKSB7CiAgbG9nLndhcm4od2FybmluZ01lc3NhZ2UpOwp9CgpleHBvcnRzLmxvZ0Vycm9yID0gbG9nRXJyb3I7CmV4cG9ydHMubG9nV2FybmluZyA9IGxvZ1dhcm5pbmc7CgovLyBBbHRlcm5hdGl2ZWx5LCBleHBvcnRzIGNhbiBiZSBkZWNsYXJlZCB1c2luZyBhbiBpbmxpbmUgYXJyb3cgZnVuY3Rpb24KCmV4cG9ydHMubG9nSW5mbyA9IChsb2csIGluZm9NZXNzYWdlKSA9PiBsb2cuaW5mbyhpbmZvTWVzc2FnZSk7CmV4cG9ydHMubG9nRGVidWcgPSAobG9nLCBkZWJ1Z01lc3NhZ2UpID0+IGxvZy5kZWJ1ZyhkZWJ1Z01lc3NhZ2UpOwo=\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"LIBRARY\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"2.0\"}],\"resultCount\":1,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"NONE\",\"totalPagedResults\":-1,\"remainingPagedResults\":0}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.0,resource=1.1, resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1746" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:32:44 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 794, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:32:44.966Z", + "time": 64, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 64 + } + }, + { + "_id": "a1925f1f53c4a64ae258898780fcb1f4", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "accept-api-version", + "value": "protocol=2.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 2019, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "name eq \"My Example Library\"" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/realms/root/realms/alpha/libraries?_queryFilter=name%20eq%20%22My%20Example%20Library%22" + }, + "response": { + "bodySize": 396, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 396, + "text": "{\"result\":[{\"_id\":\"2c38c998-aec0-4e56-8d46-bff6e24a704e\",\"name\":\"My Example Library\",\"exports\":[{\"id\":\"MSG\",\"type\":\"String\"},{\"id\":\"add\",\"type\":\"Function\",\"arity\":1},{\"id\":\"logTotal\",\"type\":\"Function\",\"arity\":1},{\"id\":\"logTotalWithMessage\",\"type\":\"Function\",\"arity\":2}]}],\"resultCount\":1,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"NONE\",\"totalPagedResults\":-1,\"remainingPagedResults\":0}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.0,resource=1.0, resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "396" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:32:44 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 793, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:32:45.036Z", + "time": 75, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 75 + } + }, + { + "_id": "ac02ebf96dde71d07ad40429340a7b32", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "accept-api-version", + "value": "protocol=2.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 2013, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "name eq \"Library Script\"" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/realms/root/realms/alpha/libraries?_queryFilter=name%20eq%20%22Library%20Script%22" + }, + "response": { + "bodySize": 404, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 404, + "text": "{\"result\":[{\"_id\":\"6c49bebe-3a62-11ed-a261-0242ac120002\",\"name\":\"Library Script\",\"exports\":[{\"id\":\"logError\",\"type\":\"Function\",\"arity\":2},{\"id\":\"logWarning\",\"type\":\"Function\",\"arity\":2},{\"id\":\"logInfo\",\"type\":\"Function\",\"arity\":2},{\"id\":\"logDebug\",\"type\":\"Function\",\"arity\":2}]}],\"resultCount\":1,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"NONE\",\"totalPagedResults\":-1,\"remainingPagedResults\":0}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.0,resource=1.0, resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "404" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:32:44 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 793, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:32:45.117Z", + "time": 83, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 83 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/script_540962730/export_4211608755/0_extract_script-id_directory_3126738353/oauth2_393036114/recording.har b/test/e2e/mocks/script_540962730/export_4211608755/0_extract_script-id_directory_3126738353/oauth2_393036114/recording.har new file mode 100644 index 000000000..d3276836e --- /dev/null +++ b/test/e2e/mocks/script_540962730/export_4211608755/0_extract_script-id_directory_3126738353/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "script/export/0_extract_script-id_directory/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1339, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1339" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 442, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:autoaccess:* fr:idc:esv:* fr:iga:* fr:idc:analytics:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:certificate:read fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1818, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1818, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:autoaccess:* fr:idc:esv:* fr:iga:* fr:idc:analytics:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:certificate:read fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1818" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:32:43 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 561, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:32:44.609Z", + "time": 101, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 101 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/script_540962730/export_4211608755/0_extract_script-id_directory_3126738353/openidm_3290118515/recording.har b/test/e2e/mocks/script_540962730/export_4211608755/0_extract_script-id_directory_3126738353/openidm_3290118515/recording.har new file mode 100644 index 000000000..01ececfc5 --- /dev/null +++ b/test/e2e/mocks/script_540962730/export_4211608755/0_extract_script-id_directory_3126738353/openidm_3290118515/recording.har @@ -0,0 +1,302 @@ +{ + "log": { + "_recordingName": "script/export/0_extract_script-id_directory/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1948, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/7a031a92-f70d-4b30-9d70-da7cfb1d9c93?_fields=%2A" + }, + "response": { + "bodySize": 1382, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1382, + "text": "{\"_id\":\"7a031a92-f70d-4b30-9d70-da7cfb1d9c93\",\"_rev\":\"fd891c5f-b3b8-4ec3-933d-db614ea36542-142\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1720799681233\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:autoaccess:*\",\"fr:idc:certificate:*\",\"fr:idc:certificate:read\",\"fr:idc:content-security-policy:*\",\"fr:idc:custom-domain:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:iga:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"0XdDQoML6maEILSCc8AWtpjBlKNOzf_NTG_jT0M0wzk\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"mvVVosknqaMRfUPxzZKLpNIIEZCTHcVT3QGRsA2CpUaK0jNO5WOljqLe3XjJmE27b2vcO_GT29M9QIwUVYAx8cv9BnwTEuioTu_Tugp3O4X3VO9VmNTQkaM1gASCTkZ2u_VuZefusBmydrheMP_XlT7GvB_sSpLgpyiN88LEO1RVVZEiG9YAanSQZejtKYLpxV5-Sxu3kh3c1M2HGiw9LeGu0h1p6okCDWwaJUDIG7jXgcHYgFCcNLkklzMX82ozWXEyjQPaxg95sk3d1ZLl-hoAJAI2-bF_ANvqK60i3WCBBPpulUU_RGeVhgxcnMTbDJUm1KgFhlK9TcvgQmZtm1u9NF0hkNlfrYhDUiy3BVWnHCTi50JUZYTevfo6LS2waTE-ZWMAZ0CCeShPR92HkcyfFIYf_PFvrwk55pmvDbx4Fc4l2y_JXKckSuKf2ErmWN_8F7ou5zNsrYcmApCuNj7m0Is3BhnvafhIsI8nocyeJPiaH5oHm5aCSWbjVFvFyOmsuZQ3AAkHjBcET3iqBneHKqSe4-Zw9-u4W6iSw8L8fF7_RPFGYAnxidqEl2Y4WOB3GsaYXEOn5uT6yKJTDbtRABdvEswFfxdVcWwvnGItgmVbUnU_QFjkOgNC2U051jUE3crGZSpeTN8028NGikzvB4PhcvIFT0biHIXFr98\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:32:44 GMT" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"fd891c5f-b3b8-4ec3-933d-db614ea36542-142\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1382" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 667, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:32:44.747Z", + "time": 126, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 126 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1948, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/7a031a92-f70d-4b30-9d70-da7cfb1d9c93?_fields=%2A" + }, + "response": { + "bodySize": 1382, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1382, + "text": "{\"_id\":\"7a031a92-f70d-4b30-9d70-da7cfb1d9c93\",\"_rev\":\"fd891c5f-b3b8-4ec3-933d-db614ea36542-142\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1720799681233\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:autoaccess:*\",\"fr:idc:certificate:*\",\"fr:idc:certificate:read\",\"fr:idc:content-security-policy:*\",\"fr:idc:custom-domain:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:iga:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"0XdDQoML6maEILSCc8AWtpjBlKNOzf_NTG_jT0M0wzk\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"mvVVosknqaMRfUPxzZKLpNIIEZCTHcVT3QGRsA2CpUaK0jNO5WOljqLe3XjJmE27b2vcO_GT29M9QIwUVYAx8cv9BnwTEuioTu_Tugp3O4X3VO9VmNTQkaM1gASCTkZ2u_VuZefusBmydrheMP_XlT7GvB_sSpLgpyiN88LEO1RVVZEiG9YAanSQZejtKYLpxV5-Sxu3kh3c1M2HGiw9LeGu0h1p6okCDWwaJUDIG7jXgcHYgFCcNLkklzMX82ozWXEyjQPaxg95sk3d1ZLl-hoAJAI2-bF_ANvqK60i3WCBBPpulUU_RGeVhgxcnMTbDJUm1KgFhlK9TcvgQmZtm1u9NF0hkNlfrYhDUiy3BVWnHCTi50JUZYTevfo6LS2waTE-ZWMAZ0CCeShPR92HkcyfFIYf_PFvrwk55pmvDbx4Fc4l2y_JXKckSuKf2ErmWN_8F7ou5zNsrYcmApCuNj7m0Is3BhnvafhIsI8nocyeJPiaH5oHm5aCSWbjVFvFyOmsuZQ3AAkHjBcET3iqBneHKqSe4-Zw9-u4W6iSw8L8fF7_RPFGYAnxidqEl2Y4WOB3GsaYXEOn5uT6yKJTDbtRABdvEswFfxdVcWwvnGItgmVbUnU_QFjkOgNC2U051jUE3crGZSpeTN8028NGikzvB4PhcvIFT0biHIXFr98\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:32:44 GMT" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"fd891c5f-b3b8-4ec3-933d-db614ea36542-142\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1382" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c64a612-75be-44a9-9f5a-a7fd796e987a" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 667, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:32:44.795Z", + "time": 88, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 88 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/script_540962730/export_4211608755/0_modified-properties_all-separate_no-metadata_default_extract_directory_1410389095/am_1076162899/recording.har b/test/e2e/mocks/script_540962730/export_4211608755/0_modified-properties_all-separate_no-metadata_default_extract_directory_1410389095/am_1076162899/recording.har new file mode 100644 index 000000000..3e41ba171 --- /dev/null +++ b/test/e2e/mocks/script_540962730/export_4211608755/0_modified-properties_all-separate_no-metadata_default_extract_directory_1410389095/am_1076162899/recording.har @@ -0,0 +1,1072 @@ +{ + "log": { + "_recordingName": "script/export/0_all-separate_no-metadata_default_extract_directory/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "accept-api-version", + "value": "resource=2.0" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 387, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 538, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 538, + "text": "{\"_id\":\"*\",\"_rev\":\"36966512\",\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[]}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=2.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"36966512\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "538" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:34:21 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 785, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:34:21.590Z", + "time": 92, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 92 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1936, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 284, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 284, + "text": "{\"_id\":\"version\",\"_rev\":\"-1830081578\",\"version\":\"7.6.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 7.6.0-SNAPSHOT Build 98ab9c81e93dae0afbb3fb3ee4bbc41d745361bd (2024-September-04 13:47)\",\"revision\":\"98ab9c81e93dae0afbb3fb3ee4bbc41d745361bd\",\"date\":\"2024-September-04 13:47\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-1830081578\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "284" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:34:21 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 788, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:34:21.822Z", + "time": 73, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 73 + } + }, + { + "_id": "b7e5f03e029a842be23c2a1356d9c4b3", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "accept-api-version", + "value": "protocol=2.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1981, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "true" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/realms/root/realms/alpha/scripts?_queryFilter=true" + }, + "response": { + "bodySize": 430517, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 430517, + "text": "{\"result\":[{\"_id\":\"403cf226-6051-4368-8b72-9ba14f9a5140\",\"name\":\"VKontakte Profile Normalization\",\"description\":\"Normalizes raw profile data from VKontakte\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLmlkKSwKICAgICAgICBmaWVsZCgiZGlzcGxheU5hbWUiLCByYXdQcm9maWxlLmZpcnN0X25hbWUpLAogICAgICAgIGZpZWxkKCJnaXZlbk5hbWUiLCByYXdQcm9maWxlLmZpcnN0X25hbWUpLAogICAgICAgIGZpZWxkKCJmYW1pbHlOYW1lIiwgcmF3UHJvZmlsZS5sYXN0X25hbWUpLAogICAgICAgIGZpZWxkKCJwaG90b1VybCIsIHJhd1Byb2ZpbGUucGhvdG9fNTApLAogICAgICAgIGZpZWxkKCJlbWFpbCIsIHJhd1Byb2ZpbGUuZW1haWwpLAogICAgICAgIGZpZWxkKCJ1c2VybmFtZSIsIHJhd1Byb2ZpbGUuZW1haWwpKSk=\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"5e854779-6ec1-4c39-aeba-0477e0986646\",\"name\":\"Config Provider Node Script\",\"description\":\"Script to provide values for a config provider node\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjEtMjAyMiBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgovKioKICogVGhlIGZvbGxvd2luZyBzY3JpcHQgaXMgYSBzaW1wbGlmaWVkIHRlbXBsYXRlIGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0byBidWlsZAogKiB1cCBhIGNvbmZpZyBNYXAgb2JqZWN0IHdpdGggY3VzdG9tIHZhbHVlcy4gVGhlIENvbmZpZyBQcm92aWRlciBOb2RlIHdpbGwgdGhlbgogKiBwcm92aWRlIHRoaXMgY29uZmlnIE1hcCB0byB0aGUgZGVzaXJlZCBub2RlIHR5cGUuIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBNYXAKICogeW91IGJ1aWxkIGhlcmUgaXMgbmFtZWQgJ2NvbmZpZycuCiAqCiAqIERlZmluZWQgdmFyaWFibGVzOgogKgogKiBub2RlU3RhdGUgLSBOb2RlIFN0YXRlICgxKQogKiAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoaXMgcmVwcmVzZW50cyB0aGUgY3VycmVudCB2YWx1ZXMgc3RvcmVkIGluIHRoZSBub2RlIHN0YXRlLgogKgogKiBpZFJlcG9zaXRvcnkgLSBQcm9maWxlIERhdGEgKDIpCiAqICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgYSByZXBvc2l0b3J5IHRvIHJldHJpZXZlIHVzZXIgaW5mb3JtYXRpb24uCiAqCiAqIHNlY3JldHMgLSBDcmVkZW50aWFscyBhbmQgU2VjcmV0cyAoMykKICogICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCBhbiBpbnRlcmZhY2UgdG8gYWNjZXNzIHRoZSBTZWNyZXRzIEFQSSBmcm9tIGEgc2NyaXB0aW5nIGNvbnRleHQuCiAqCiAqIHJlcXVlc3RIZWFkZXJzICg0KSAtIE1hcCAoNSkKICogICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCBhbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIGZvciBhY2Nlc3NpbmcgaGVhZGVycyBpbiB0aGUgbG9naW4gcmVxdWVzdC4KICoKICogbG9nZ2VyIC0gRGVidWcgTG9nZ2luZyAoNikKICogICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBkZWJ1ZyBsb2dnZXIgaW5zdGFuY2UuCiAqCiAqIGh0dHBDbGllbnQgLSBIVFRQIENsaWVudCAoNykKICogICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBIVFRQIGNsaWVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIG1ha2UgZXh0ZXJuYWwgSFRUUCByZXF1ZXN0cy4KICoKICogcmVhbG0gLSBTdHJpbmcgKHByaW1pdGl2ZSkuCiAqICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCB0aGUgbmFtZSBvZiB0aGUgcmVhbG0gdGhlIHVzZXIgaXMgYXV0aGVudGljYXRpbmcgdG8uCiAqCiAqIGV4aXN0aW5nU2Vzc2lvbiAtIE1hcDxTdHJpbmcsIFN0cmluZz4gKDUpCiAqICAgICAgICAgIFByZXNlbnQgaWYgdGhlIHJlcXVlc3QgY29udGFpbnMgdGhlIHNlc3Npb24gY29va2llLCB0aGUgdXNlcidzIHNlc3Npb24gb2JqZWN0LiBUaGUgcmV0dXJuZWQgbWFwIGZyb20KICogICAgICAgICAgU1NPVG9rZW4uZ2V0UHJvcGVydGllcygpICg4KQogKgogKiByZXF1ZXN0UGFyYW1ldGVycyAtIE1hcCAoNSkKICogICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgYXV0aGVudGljYXRpb24gcmVxdWVzdCBwYXJhbWV0ZXJzLgogKgogKgogKiBPdXRwdXRzOgogKgogKiBjb25maWcgLSBNYXAgKDUpCiAqICAgICAgICAgICBEZWZpbmUgYW5kIGZpbGwgYSBNYXAgb2JqZWN0IG5hbWVkICdjb25maWcnIHdpdGggY3VzdG9tIHZhbHVlcywgdGhpcyB3aWxsIGRlZmluZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlCiAqICAgICAgICAgICBhc3NvY2lhdGVkIG5vZGUgc2VsZWN0ZWQgaW4gdGhlIENvbmZpZ1Byb3ZpZGVyTm9kZS4KICoKICogUmVmZXJlbmNlOgogKiAoMSkgTm9kZSBTdGF0ZSAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9pZGNsb3VkLWFtL2xhdGVzdC9hdXRoZW50aWNhdGlvbi1ndWlkZS9zY3JpcHRpbmctYXBpLW5vZGUuaHRtbCNzY3JpcHRpbmctYXBpLW5vZGUtbm9kZVN0YXRlCiAqICgyKSBQcm9maWxlIERhdGEgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4xL2F1dGhlbnRpY2F0aW9uLWd1aWRlL3NjcmlwdGluZy1hcGktbm9kZS5odG1sI3NjcmlwdGluZy1hcGktbm9kZS1pZC1yZXBvCiAqICgzKSBDcmVkZW50aWFscyBhbmQgU2VjcmV0cyAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjEvYXV0aGVudGljYXRpb24tZ3VpZGUvc2NyaXB0aW5nLWFwaS1ub2RlLmh0bWwjc2NyaXB0aW5nLWFwaS1hdXRobi1zZWNyZXRzCiAqICg0KSBSZXF1ZXN0IEhlYWRlcnMgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hdXRoZW50aWNhdGlvbi1ndWlkZS9zY3JpcHRpbmctYXBpLW5vZGUuaHRtbCNzY3JpcHRpbmctYXBpLW5vZGUtcmVxdWVzdEhlYWRlcnMuCiAqICg1KSBNYXAgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS91dGlsL01hcC5odG1sCiAqICg2KSBEZWJ1ZyBMb2dnaW5nIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvc2NyaXB0aW5nLWd1aWRlL3NjcmlwdGluZy1hcGktZ2xvYmFsLWxvZ2dlci5odG1sI3NjcmlwdGluZy1hcGktZ2xvYmFsLWxvZ2dlci4KICogKDcpIEhUVFAgQ2xpZW50IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL2h0dHAvQ2xpZW50Lmh0bWwuCiAqICg4KSBTU09Ub2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3MvY29tL2lwbGFuZXQvc3NvL1NTT1Rva2VuLmh0bWwuCiAqLwoKY29uZmlnID0gewogICAgImtleTAiOiB7InN1YktleSI6ICJ2YWx1ZTAifSwKICAgICJrZXkxIjogInZhbHVlMSIKfTs=\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"CONFIG_PROVIDER_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"400e48ba-3f13-4144-ac7b-f824ea8e98c5\",\"name\":\"OAuth2 JWT Issuer Script\",\"description\":\"Default global script for scripted JWT Issuers\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjIgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKLyoKICogVGhpcyBzY3JpcHQgbGV0cyB5b3UgdG8gZGVyaXZlIHRoZSBjb25maWd1cmF0aW9uIGZvciBhIGR5bmFtaWMgSldUIGlzc3VlciBmcm9tIHRoZSBpc3N1ZXIgc3RyaW5nLgogKiBBIEpXVCBpc3N1ZXIgaXMgbWFkZSB1cCBvZiB0aGUgZm9sbG93aW5nOgogKiAgIC0gaXNzdWVyIC0gdGhlIGlkZW50aWZpZXIgb2YgdGhlIGVudGl0eSB0aGF0IGlzc3VlcyBKV1RzCiAqICAgLSByZXNvdXJjZSBvd25lciBzdWJqZWN0IGNsYWltIC0gdGhlIG5hbWUgb2YgdGhlIGNsYWltIGluIHRoZSBKV1QgdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZSBvd25lcgogKiAgIC0gY29uc2VudGVkIHNjb3BlIGNsYWltIC0gdGhlIG5hbWUgb2YgdGhlIGNsYWltIGluIHRoZSBKV1QgdGhhdCByZXByZXNlbnRzIHNjb3BlIHRoYXQgdGhlIHJlc291cmNlIG93bmVyCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYWxyZWFkeSBjb25zZW50ZWQgdG8gZXh0ZXJuYWxseQogKiAgIC0gYXV0aG9yaXplZCBzdWJqZWN0cyAtIHRoZSBzZXQgb2YgcHJpbmNpcGFsIGlkZW50aWZpZXJzIHRoYXQgYXJlIGF1dGhvcml6ZWQgdG8gYmUgdXNlZCBhcyByZXNvdXJjZSBvd25lcnMKICogICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgaXNzdWVyCiAqICAgLSBKV0tzIC0gZWl0aGVyIGEgc2V0IG9mIEpXS3Mgb3IgY29ubmVjdGlvbiBkZXRhaWxzIGZvciBvYnRhaW5pbmcgdGhhdCBzZXQsIHRoYXQgYXJlIHRoZSBwdWJsaWMga2V5cyB0aGF0CiAqICAgICAgICAgICAgY2FuIHZlcmlmeSB0aGUgc2lnbmF0dXJlIG9uIHRoZSBpc3N1ZWQgSldUcy4KICoKICogRGVmaW5lZCB2YXJpYWJsZXM6CiAqIGlzc3VlciAtIFN0cmluZwogKiAgICAgICAgICBUaGUgaXNzdWVyIGZyb20gdGhlIGJlYXJlciBKV1QuCiAqIHJlYWxtIC0gU3RyaW5nCiAqICAgICAgICAgVGhlIHBhdGggb2YgdGhlIHJlYWxtIHRoYXQgaXMgaGFuZGxpbmcgdGhlIHJlcXVlc3QuCiAqIHNjcmlwdE5hbWUgLSBTdHJpbmcuCiAqICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgc2NyaXB0LgogKiBsb2dnZXIgLSBBbHdheXMgcHJlc2VudCwgdGhlIHNjcmlwdCBkZWJ1ZyBsb2dnZXIgaW5zdGFuY2U6CiAqICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuaHRtbCNzY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuCiAqICAgICAgICAgIENvcnJlc3BvbmRpbmcgbG9nIGZpbGVzIHdpbGwgYmUgcHJlZml4ZWQgd2l0aDogc2NyaXB0cy5PQVVUSDJfU0NSSVBURURfSldUX0lTU1VFUi4KICogaHR0cENsaWVudCAtIEhUVFAgQ2xpZW50ICgxKS4KICogICAgICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCB0aGUgSFRUUCBDbGllbnQgaW5zdGFuY2U6CiAqICAgICAgICAgICAgICBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9zY3JpcHRpbmctZ3VpZGUvc2NyaXB0aW5nLWFwaS1nbG9iYWwtaHR0cC1jbGllbnQuaHRtbCNzY3JpcHRpbmctYXBpLWdsb2JhbC1odHRwLWNsaWVudC4KICogaWRSZXBvc2l0b3J5IC0gSWRlbnRpdHkgUmVwb3NpdG9yeSAoMikuIEFsd2F5cyBwcmVzZW50LgogKiBzZWNyZXRzIC0gU2VjcmV0cyBhY2Nlc3NvciAoMykuIEFsd2F5cyBwcmVzZW50LgogKgogKiBSZXR1cm4gLSBvcmcuZm9yZ2Vyb2NrLm9hdXRoMi5jb3JlLlRydXN0ZWRKd3RJc3N1ZXJDb25maWcgKDQpIC0gdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRydXN0ZWQgSldUIGlzc3Vlci4KICoKICogQ2xhc3MgcmVmZXJlbmNlOgogKiAoMSkgQ2xpZW50IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL2h0dHAvQ2xpZW50Lmh0bWwuCiAqICgyKSBTY3JpcHRlZElkZW50aXR5UmVwb3NpdG9yeSAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuYW0vc2NyaXB0aW5nL2FwaS9pZGVudGl0eS9TY3JpcHRlZElkZW50aXR5UmVwb3NpdG9yeS5odG1sLgogKiAoMykgU2NyaXB0ZWRTZWNyZXRzIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5hbS9zY3JpcHRpbmcvYXBpL3NlY3JldHMvU2NyaXB0ZWRTZWNyZXRzLmh0bWwuCiAqICg0KSBUcnVzdGVkSnd0SXNzdWVyQ29uZmlnIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29hdXRoMi9jb3JlL1RydXN0ZWRKd3RJc3N1ZXJDb25maWcuaHRtbC4KICovCgovKiBFWEFNUExFCihmdW5jdGlvbiAoKSB7CiAgICB2YXIgZnJKYXZhID0gSmF2YUltcG9ydGVyKAogICAgICAgIG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuVHJ1c3RlZEp3dElzc3VlckNvbmZpZywKICAgICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbnMKICAgICk7CgogICAgdmFyIGlzcyA9IGlkUmVwb3NpdG9yeS5nZXRJZGVudGl0eShpc3N1ZXIpOwogICAgaWYgKGlzcyA9PSBudWxsKSB7CiAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoJ05vIGlzc3VlciBmb3VuZCBmb3I6ICcraXNzdWVyKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGxvZ2dlci5tZXNzYWdlKCdGb3VuZCBpc3N1ZXI6ICcraXNzKTsKICAgIC8vIGluIHRoaXMgZXhhbXBsZSBlaXRoZXIgYSBKV0sgc2V0IG9yIGEgVVJJIHRvIGEgSldLIHNldCBhcmUgaW4gdGhlIHBvc3RhbEFkZHJlc3MgYXR0cmlidXRlCiAgICB2YXIgandrc0F0dHJzID0gaXNzLmdldEF0dHJpYnV0ZVZhbHVlcygncG9zdGFsQWRkcmVzcycpOwogICAgdmFyIGp3a1NldCA9IGp3a3NBdHRycy5sZW5ndGggPT09IDAgPyBudWxsIDogandrc0F0dHJzWzBdOwogICAgdmFyIGNvbmZpZyA9IG5ldyBmckphdmEuVHJ1c3RlZEp3dElzc3VlckNvbmZpZygKICAgICAgICBpc3N1ZXIsCiAgICAgICAgJ3N1YicsCiAgICAgICAgJ3Njb3BlJywKICAgICAgICAvLyBpbiB0aGlzIGV4YW1wbGUsIHZhbGlkIHN1YmplY3RzIGFyZSBzdG9yZWQgaW4gdGhlIG1haWwgYXR0cmlidXRlCiAgICAgICAgaXNzLmdldEF0dHJpYnV0ZVZhbHVlcygnbWFpbCcpLAogICAgICAgIGp3a1NldC5zdGFydHNXaXRoKCd7JykgPyBqd2tTZXQgOiBudWxsLAogICAgICAgIGp3a1NldC5zdGFydHNXaXRoKCdodHRwJykgPyBqd2tTZXQgOiBudWxsLAogICAgICAgICc1IG1pbnV0ZXMnLAogICAgICAgICcxIG1pbnV0ZScKICAgICk7CiAgICByZXR1cm4gY29uZmlnOwp9KCkpOwoqLw==\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"OAUTH2_SCRIPTED_JWT_ISSUER\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"6b3cfd48-62d3-48ff-a96f-fe8f3a22ab30\",\"name\":\"Amazon Profile Normalization\",\"description\":\"Normalizes raw profile data from Amazon\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLnVzZXJfaWQpLAogICAgICAgIGZpZWxkKCJkaXNwbGF5TmFtZSIsIHJhd1Byb2ZpbGUubmFtZSksCiAgICAgICAgZmllbGQoImVtYWlsIiwgcmF3UHJvZmlsZS5lbWFpbCksCiAgICAgICAgZmllbGQoInVzZXJuYW1lIiwgcmF3UHJvZmlsZS5lbWFpbCkpKQ==\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"85523e71-2d77-4577-b078-6f9674cc54e2\",\"name\":\"Saml2 IDP Adapter Always Auth\",\"description\":\"Always redirect browser pre-auth\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjEtMjAyMiBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgovKgogKiBUaGUgc2NyaXB0IGhhcyB0aGVzZSB0b3AgbGV2ZWwgZnVuY3Rpb25zIHRoYXQgY291bGQgYmUgZXhlY3V0ZWQgZHVyaW5nIGEgU0FNTDIgZmxvdy4KICogICAgICAtIHByZVNpbmdsZVNpZ25PbgogKiAgICAgIC0gcHJlQXV0aGVudGljYXRpb24KICogICAgICAtIHByZVNlbmRSZXNwb25zZQogKiAgICAgIC0gcHJlU2lnblJlc3BvbnNlCiAqICAgICAgLSBwcmVTZW5kRmFpbHVyZVJlc3BvbnNlCiAqCiAqIFBsZWFzZSBzZWUgdGhlIGphdmFkb2MgZm9yIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBhbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBtZXRob2RzLgogKiBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4yL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9wbHVnaW5zL1NBTUwySWRlbnRpdHlQcm92aWRlckFkYXB0ZXIuaHRtbAogKiBOb3RlIHRoYXQgdGhlIGluaXRpYWxpemUgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIHNjcmlwdHMuCiAqCiAqIERlZmluZWQgdmFyaWFibGVzLiBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgcmVzcGVjdGl2ZSBmdW5jdGlvbnMgZm9yIHRoZSB2YXJpYWJsZXMgYXZhaWxhYmxlIHRvIGl0LgogKgogKiBob3N0ZWRFbnRpdHlJZCAtIFN0cmluZwogKiAgICAgRW50aXR5IElEIGZvciB0aGUgaG9zdGVkIElEUAogKiByZWFsbSAtIFN0cmluZwogKiAgICAgUmVhbG0gb2YgdGhlIGhvc3RlZCBJRFAKICogaWRwQWRhcHRlclNjcmlwdEhlbHBlciAtIElkcEFkYXB0ZXJTY3JpcHRIZWxwZXIgKDEpCiAqICAgICBBbiBpbnN0YW5jZSBvZiBJZHBBZGFwdGVyU2NyaXB0SGVscGVyIGNvbnRhaW5pbmcgaGVscGVyIG1ldGhvZHMuIFNlZSBKYXZhZG9jIGZvciBtb3JlIGRldGFpbHMuCiAqIHJlcXVlc3QgLSBIdHRwU2VydmxldFJlcXVlc3QgKDIpCiAqICAgICBTZXJ2bGV0IHJlcXVlc3Qgb2JqZWN0CiAqIHJlc3BvbnNlIC0gSHR0cFNlcnZsZXRSZXNwb25zZSAoMykKICogICAgIFNlcnZsZXQgcmVzcG9uc2Ugb2JqZWN0CiAqIGF1dGhuUmVxdWVzdCAtIEF1dGhuUmVxdWVzdCAoNCkKICogICAgIFRoZSBvcmlnaW5hbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IHNlbnQgZnJvbSBTUAogKiByZXFJZCAtIFN0cmluZwogKiAgICAgVGhlIGlkIHRvIHVzZSBmb3IgY29udGludWF0aW9uIG9mIHByb2Nlc3NpbmcgaWYgdGhlIGFkYXB0ZXIgcmVkaXJlY3RzCiAqIHJlcyAtIFJlc3BvbnNlICg1KQogKiAgICAgVGhlIFNBTUwgUmVzcG9uc2UKICogc2Vzc2lvbiAtIFNTT1Rva2VuICg2KQogKiAgICAgVGhlIHNpbmdsZSBzaWduLW9uIHNlc3Npb24uIFRoZSByZWZlcmVuY2UgdHlwZSBvZiB0aGlzIGlzIE9iamVjdCBhbmQgd291bGQgbmVlZCB0byBiZSBjYXN0ZWQgdG8gU1NPVG9rZW4uCiAqIHJlbGF5U3RhdGUgLSBTdHJpbmcKICogICAgIFRoZSByZWxheVN0YXRlIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSByZWRpcmVjdAogKiBmYXVsdENvZGUgLSBTdHJpbmcKICogICAgIHRoZSBmYXVsdCBjb2RlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgU0FNTCByZXNwb25zZQogKiBmYXVsdERldGFpbCAtIFN0cmluZwogKiAgICAgdGhlIGZhdWx0IGRldGFpbCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIFNBTUwgcmVzcG9uc2UKICogbG9nZ2VyIC0gTG9nZ2VyIGluc3RhbmNlCiAqICAgICBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9zY3JpcHRpbmctZ3VpZGUvc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLmh0bWwjc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLgogKiAgICAgQ29ycmVzcG9uZGluZyBsb2cgZmlsZXMgd2lsbCBiZSBwcmVmaXhlZCB3aXRoOiBzY3JpcHRzLjxzY3JpcHQgbmFtZT4KICoKICogVGhyb3dzIFNBTUwyRXhjZXB0aW9uICg3KToKICogICAgIGZvciBhbnkgZXhjZXB0aW9ucyBvY2N1cnJpbmcgaW4gdGhlIGFkYXB0ZXIuIFRoZSBmZWRlcmF0aW9uIHByb2Nlc3Mgd2lsbCBjb250aW51ZQogKgogKiBDbGFzcyByZWZlcmVuY2U6CiAqICgxKSBpZHBBZGFwdGVyU2NyaXB0SGVscGVyIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMi9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcGx1Z2lucy9zY3JpcHRlZC9JZHBBZGFwdGVyU2NyaXB0SGVscGVyLmh0bWwuCiAqICgyKSBIdHRwU2VydmxldFJlcXVlc3QgLSBodHRwczovL3RvbWNhdC5hcGFjaGUub3JnL3RvbWNhdC03LjAtZG9jL3NlcnZsZXRhcGkvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdC5odG1sLgogKiAoMykgSHR0cFNlcnZsZXRSZXNwb25zZSAtIGh0dHBzOi8vdG9tY2F0LmFwYWNoZS5vcmcvdG9tY2F0LTcuMC1kb2Mvc2VydmxldGFwaS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZS5odG1sLgogKiAoNCkgQXV0aG5SZXF1ZXN0IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMi9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvQXV0aG5SZXF1ZXN0Lmh0bWwuCiAqICg1KSBSZXNwb25zZSAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjIvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL3Byb3RvY29sL1Jlc3BvbnNlLmh0bWwuCiAqICg2KSBTU09Ub2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjIvYXBpZG9jcy9jb20vaXBsYW5ldC9zc28vU1NPVG9rZW4uaHRtbC4KICogKDcpIFNBTUwyRXhjZXB0aW9uIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMi9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvY29tbW9uL1NBTUwyRXhjZXB0aW9uLmh0bWwuCiAqLwoKLyoKICogVGVtcGxhdGUvZGVmYXVsdCBzY3JpcHQgZm9yIFNBTUwyIElEUCBBZGFwdGVyIHNjcmlwdGVkIHBsdWdpbi4KICovCgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwcmVTaW5nbGVTaWduT246CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIGlkcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIHJlcXVlc3QKICogICAgIGF1dGhuUmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIHJlcUlkCiAqICAgICBsb2dnZXIKICoKICogUmV0dXJuIC0gdHJ1ZSBpZiBicm93c2VyIHJlZGlyZWN0aW9uIGlzIGhhcHBlbmluZyBhZnRlciBwcm9jZXNzaW5nLCBmYWxzZSBvdGhlcndpc2UuIERlZmF1bHQgdG8gZmFsc2UuCiAqLwpmdW5jdGlvbiBwcmVTaW5nbGVTaWduT24gKCkgewogICAgICBsb2dnZXIuZXJyb3IoIkNoaWNhZ286IHByZVNpbmdsZVNpZ25PbiIpOwogICAgcmV0dXJuIHRydWU7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZUF1dGhlbnRpY2F0aW9uOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICBpZHBBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICByZXF1ZXN0CiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICByZXFJZAogKiAgICAgc2Vzc2lvbgogKiAgICAgcmVsYXlTdGF0ZQogKiAgICAgbG9nZ2VyCiAqCiAqIFJldHVybiAtIHRydWUgaWYgYnJvd3NlciByZWRpcmVjdGlvbiBpcyBoYXBwZW5pbmcgYWZ0ZXIgcHJvY2Vzc2luZywgZmFsc2Ugb3RoZXJ3aXNlLiBEZWZhdWx0IHRvIGZhbHNlLgogKi8KZnVuY3Rpb24gcHJlQXV0aGVudGljYXRpb24gKCkgewogICAgICBsb2dnZXIuZXJyb3IoIkNoaWNhZ286IHByZUF1dGhlbnRpY2F0aW9uIik7CiAgICByZXR1cm4gdHJ1ZTsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcHJlU2VuZFJlc3BvbnNlOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICBpZHBBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICByZXF1ZXN0CiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICByZXFJZAogKiAgICAgc2Vzc2lvbgogKiAgICAgcmVsYXlTdGF0ZQogKiAgICAgbG9nZ2VyCiAqCiAqIFJldHVybiAtIHRydWUgaWYgYnJvd3NlciByZWRpcmVjdGlvbiBoYXBwZW5lZCBhZnRlciBwcm9jZXNzaW5nLCBmYWxzZSBvdGhlcndpc2UuIERlZmF1bHQgdG8gZmFsc2UuCiAqLwpmdW5jdGlvbiBwcmVTZW5kUmVzcG9uc2UgKCkgewogICAgICBsb2dnZXIuZXJyb3IoIkNoaWNhZ286IHByZVNlbmRSZXNwb25zZSIpOwogICAgICBsb2dnZXIuZXJyb3IoIkNoaWNhZ286IGF1dGhuUmVxdWVzdDogIithdXRoblJlcXVlc3QpOwogICAgICByZXNwb25zZS5zZW5kUmVkaXJlY3QoImh0dHBzOi8vaWRjLnNjaGV1YmVyLmlvL2FtL1hVSS8/cmVhbG09YWxwaGEmYXV0aEluZGV4VHlwZT1zZXJ2aWNlJmF1dGhJbmRleFZhbHVlPURpc3BhdGNoZXImRm9yY2VBdXRoPXRydWUmZ290bz0iK3JlbGF5U3RhdGUpOwogICAgcmV0dXJuIHRydWU7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZVNpZ25SZXNwb25zZToKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgaWRwQWRhcHRlclNjcmlwdEhlbHBlcgogKiAgICAgcmVxdWVzdAogKiAgICAgYXV0aG5SZXF1ZXN0CiAqICAgICBzZXNzaW9uCiAqICAgICByZWxheVN0YXRlCiAqICAgICByZXMKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcHJlU2lnblJlc3BvbnNlICgpIHsKICAgICAgbG9nZ2VyLmVycm9yKCJDaGljYWdvOiBwcmVTaWduUmVzcG9uc2UiKTsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcHJlU2VuZEZhaWx1cmVSZXNwb25zZToKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgaWRwQWRhcHRlclNjcmlwdEhlbHBlcgogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIGZhdWx0Q29kZQogKiAgICAgZmF1bHREZXRhaWwKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcHJlU2VuZEZhaWx1cmVSZXNwb25zZSAoKSB7CiAgICAgIGxvZ2dlci5lcnJvcigiQ2hpY2FnbzogcHJlU2VuZEZhaWx1cmVSZXNwb25zZSIpOwp9\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"SAML2_IDP_ADAPTER\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"4e053815-adde-46ac-9fe2-d3ae93517c14\",\"name\":\"My Other Example Library Script\",\"description\":\"null\",\"script\":\"Y29uc29sZS5sb2coImhpIHRoZXJlIik7\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"LIBRARY\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"2.0\"},{\"_id\":\"dbe0bf9a-72aa-49d5-8483-9db147985a47\",\"name\":\"ADFS Profile Normalization (JS)\",\"description\":\"Normalizes raw profile data from ADFS\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjIgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMKICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgovKgogKiBUaGlzIHNjcmlwdCByZXR1cm5zIHRoZSBzb2NpYWwgaWRlbnRpdHkgcHJvZmlsZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGF1dGhlbnRpY2F0aW5nIHVzZXIKICogaW4gYSBzdGFuZGFyZCBmb3JtIGV4cGVjdGVkIGJ5IHRoZSBTb2NpYWwgUHJvdmlkZXIgSGFuZGxlciBOb2RlLgogKgogKiBEZWZpbmVkIHZhcmlhYmxlczoKICogcmF3UHJvZmlsZSAtIFRoZSBzb2NpYWwgaWRlbnRpdHkgcHJvdmlkZXIgcHJvZmlsZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGF1dGhlbnRpY2F0aW5nIHVzZXIuCiAqICAgICAgICAgICAgICBKc29uVmFsdWUgKDEpLgogKiBsb2dnZXIgLSBUaGUgZGVidWcgbG9nZ2VyIGluc3RhbmNlOgogKiAgICAgICAgICBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9zY3JpcHRpbmctZ3VpZGUvc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLmh0bWwjc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLgogKiByZWFsbSAtIFN0cmluZyAocHJpbWl0aXZlKS4KICogICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcmVhbG0gdGhlIHVzZXIgaXMgYXV0aGVudGljYXRpbmcgdG8uCiAqIHJlcXVlc3RIZWFkZXJzIC0gVHJlZU1hcCAoMikuCiAqICAgICAgICAgICAgICAgICAgVGhlIG9iamVjdCB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBoZWFkZXJzIGluIHRoZSBsb2dpbiByZXF1ZXN0OgogKiAgICAgICAgICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2F1dGhlbnRpY2F0aW9uLWd1aWRlL3NjcmlwdGluZy1hcGktbm9kZS5odG1sI3NjcmlwdGluZy1hcGktbm9kZS1yZXF1ZXN0SGVhZGVycy4KICogcmVxdWVzdFBhcmFtZXRlcnMgLSBUcmVlTWFwICgyKS4KICogICAgICAgICAgICAgICAgICAgICBUaGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgcGFyYW1ldGVycy4KICogc2VsZWN0ZWRJZHAgLSBTdHJpbmcgKHByaW1pdGl2ZSkuCiAqICAgICAgICAgICAgICAgVGhlIHNvY2lhbCBpZGVudGl0eSBwcm92aWRlciBuYW1lLiBGb3IgZXhhbXBsZTogZ29vZ2xlLgogKiBzaGFyZWRTdGF0ZSAtIExpbmtlZEhhc2hNYXAgKDMpLgogKiAgICAgICAgICAgICAgIFRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgc3RhdGUgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHRyZWUgYW5kIGFsbG93cyBkYXRhIGV4Y2hhbmdlIGJldHdlZW4gdGhlIHN0YXRlbGVzcyBub2RlczoKICogICAgICAgICAgICAgICBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hdXRoLW5vZGVzL2NvcmUtYWN0aW9uLmh0bWwjYWNjZXNzaW5nLXRyZWUtc3RhdGUuCiAqIHRyYW5zaWVudFN0YXRlIC0gTGlua2VkSGFzaE1hcCAoMykuCiAqICAgICAgICAgICAgICAgICAgVGhlIG9iamVjdCBmb3Igc3RvcmluZyBzZW5zaXRpdmUgaW5mb3JtYXRpb24gdGhhdCBtdXN0IG5vdCBsZWF2ZSB0aGUgc2VydmVyIHVuZW5jcnlwdGVkLAogKiAgICAgICAgICAgICAgICAgIGFuZCB0aGF0IG1heSBub3QgbmVlZCB0byBwZXJzaXN0IGJldHdlZW4gYXV0aGVudGljYXRpb24gcmVxdWVzdHMgZHVyaW5nIHRoZSBhdXRoZW50aWNhdGlvbiBzZXNzaW9uOgogKiAgICAgICAgICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2F1dGgtbm9kZXMvY29yZS1hY3Rpb24uaHRtbCNhY2Nlc3NpbmctdHJlZS1zdGF0ZS4KICoKICogUmV0dXJuIC0gYSBKc29uVmFsdWUgKDEpLgogKiAgICAgICAgICBUaGUgcmVzdWx0IG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpbiB0aGUgc2NyaXB0IGlzIHJldHVybmVkIHRvIHRoZSBzZXJ2ZXIuCiAqICAgICAgICAgIEN1cnJlbnRseSwgdGhlIEltbWVkaWF0ZWx5IEludm9rZWQgRnVuY3Rpb24gRXhwcmVzc2lvbiAoYWxzbyBrbm93biBhcyBTZWxmLUV4ZWN1dGluZyBBbm9ueW1vdXMgRnVuY3Rpb24pCiAqICAgICAgICAgIGlzIHRoZSBsYXN0IChhbmQgb25seSkgc3RhdGVtZW50IGluIHRoaXMgc2NyaXB0LCBhbmQgaXRzIHJldHVybiB2YWx1ZSB3aWxsIGJlY29tZSB0aGUgc2NyaXB0IHJlc3VsdC4KICogICAgICAgICAgRG8gbm90IHVzZSAicmV0dXJuIHZhcmlhYmxlIiBzdGF0ZW1lbnQgb3V0c2lkZSBvZiBhIGZ1bmN0aW9uIGRlZmluaXRpb24uCiAqCiAqICAgICAgICAgIFRoaXMgc2NyaXB0J3MgbGFzdCBzdGF0ZW1lbnQgc2hvdWxkIHJlc3VsdCBpbiBhIEpzb25WYWx1ZSAoMSkgd2l0aCB0aGUgZm9sbG93aW5nIGtleXM6CiAqICAgICAgICAgIHsKICogICAgICAgICAgICAgIHsiZGlzcGxheU5hbWUiOiAiY29ycmVzcG9uZGluZy1zb2NpYWwtaWRlbnRpdHktcHJvdmlkZXItdmFsdWUifSwKICogICAgICAgICAgICAgIHsiZW1haWwiOiAiY29ycmVzcG9uZGluZy1zb2NpYWwtaWRlbnRpdHktcHJvdmlkZXItdmFsdWUifSwKICogICAgICAgICAgICAgIHsiZmFtaWx5TmFtZSI6ICJjb3JyZXNwb25kaW5nLXNvY2lhbC1pZGVudGl0eS1wcm92aWRlci12YWx1ZSJ9LAogKiAgICAgICAgICAgICAgeyJnaXZlbk5hbWUiOiAiY29ycmVzcG9uZGluZy1zb2NpYWwtaWRlbnRpdHktcHJvdmlkZXItdmFsdWUifSwKICogICAgICAgICAgICAgIHsiaWQiOiAiY29ycmVzcG9uZGluZy1zb2NpYWwtaWRlbnRpdHktcHJvdmlkZXItdmFsdWUifSwKICogICAgICAgICAgICAgIHsibG9jYWxlIjogImNvcnJlc3BvbmRpbmctc29jaWFsLWlkZW50aXR5LXByb3ZpZGVyLXZhbHVlIn0sCiAqICAgICAgICAgICAgICB7InBob3RvVXJsIjogImNvcnJlc3BvbmRpbmctc29jaWFsLWlkZW50aXR5LXByb3ZpZGVyLXZhbHVlIn0sCiAqICAgICAgICAgICAgICB7InVzZXJuYW1lIjogImNvcnJlc3BvbmRpbmctc29jaWFsLWlkZW50aXR5LXByb3ZpZGVyLXZhbHVlIn0KICogICAgICAgICAgfQogKgogKiAgICAgICAgICBUaGUgY29uc3VtZXIgb2YgdGhpcyBkYXRhIGRlZmluZXMgd2hpY2gga2V5cyBhcmUgcmVxdWlyZWQgYW5kIHdoaWNoIGFyZSBvcHRpb25hbC4KICogICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBzY3JpcHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBTb2NpYWwgUHJvdmlkZXIgSGFuZGxlciBOb2RlIGFuZCwKICogICAgICAgICAgdWx0aW1hdGVseSwgdGhlIG1hbmFnZWQgb2JqZWN0IGNyZWF0ZWQvdXBkYXRlZCB3aXRoIHRoaXMgZGF0YQogKiAgICAgICAgICB3aWxsIGV4cGVjdCBjZXJ0YWluIGtleXMgdG8gYmUgcG9wdWxhdGVkLgogKiAgICAgICAgICBJbiBzb21lIGNvbW1vbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zLCB0aGUgZm9sbG93aW5nIGtleXMgYXJlIHJlcXVpcmVkIHRvIGJlIG5vdCBlbXB0eToKICogICAgICAgICAgdXNlcm5hbWUsIGdpdmVuTmFtZSwgZmFtaWx5TmFtZSwgZW1haWwuCiAqCiAqICAgICAgICAgIEZyb20gUkZDNDUxNzogQSB2YWx1ZSBvZiB0aGUgRGlyZWN0b3J5IFN0cmluZyBzeW50YXggaXMgYSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUKICogICAgICAgICAgYXJiaXRyYXJ5IGNoYXJhY3RlcnMgZnJvbSB0aGUgVW5pdmVyc2FsIENoYXJhY3RlciBTZXQgKFVDUykuCiAqICAgICAgICAgIEEgemVyby1sZW5ndGggY2hhcmFjdGVyIHN0cmluZyBpcyBub3QgcGVybWl0dGVkLgogKgogKiAoMSkgSnNvblZhbHVlIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL2pzb24vSnNvblZhbHVlLmh0bWwuCiAqICgyKSBUcmVlTWFwIC0gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9UcmVlTWFwLmh0bWwuCiAqICgzKSBMaW5rZWRIYXNoTWFwIC0gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9MaW5rZWRIYXNoTWFwLmh0bWwuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgIHZhciBmckphdmEgPSBKYXZhSW1wb3J0ZXIoCiAgICAgICAgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZQogICAgKTsKCiAgICB2YXIgbm9ybWFsaXplZFByb2ZpbGVEYXRhID0gZnJKYXZhLkpzb25WYWx1ZS5qc29uKGZySmF2YS5Kc29uVmFsdWUub2JqZWN0KCkpOwogIAogIAkvL2xvZ2dlci5tZXNzYWdlKCdTZWd1aW4gcmF3UHJvZmlsZTogJytyYXdQcm9maWxlKTsKCiAgICBub3JtYWxpemVkUHJvZmlsZURhdGEucHV0KCdpZCcsIHJhd1Byb2ZpbGUuZ2V0KCdzdWInKS5hc1N0cmluZygpKTsKICAgIG5vcm1hbGl6ZWRQcm9maWxlRGF0YS5wdXQoJ2Rpc3BsYXlOYW1lJywgcmF3UHJvZmlsZS5nZXQoJ2dpdmVuTmFtZScpLmFzU3RyaW5nKCkgKyAnICcgKyByYXdQcm9maWxlLmdldCgnc24nKS5hc1N0cmluZygpKTsKICAgIG5vcm1hbGl6ZWRQcm9maWxlRGF0YS5wdXQoJ2VtYWlsJywgcmF3UHJvZmlsZS5nZXQoJ21haWwnKS5hc1N0cmluZygpKTsKICAgIG5vcm1hbGl6ZWRQcm9maWxlRGF0YS5wdXQoJ2dpdmVuTmFtZScsIHJhd1Byb2ZpbGUuZ2V0KCdnaXZlbk5hbWUnKS5hc1N0cmluZygpKTsKICAgIG5vcm1hbGl6ZWRQcm9maWxlRGF0YS5wdXQoJ2ZhbWlseU5hbWUnLCByYXdQcm9maWxlLmdldCgnc24nKS5hc1N0cmluZygpKTsKICAgIG5vcm1hbGl6ZWRQcm9maWxlRGF0YS5wdXQoJ3VzZXJuYW1lJywgcmF3UHJvZmlsZS5nZXQoJ3VwbicpLmFzU3RyaW5nKCkpOwogICAgbm9ybWFsaXplZFByb2ZpbGVEYXRhLnB1dCgncm9sZXMnLCByYXdQcm9maWxlLmdldCgncm9sZXMnKS5hc1N0cmluZygpKTsKICAKICAJLy9sb2dnZXIubWVzc2FnZSgnU2VndWluIG5vcm1hbGl6ZWRQcm9maWxlRGF0YTogJytub3JtYWxpemVkUHJvZmlsZURhdGEpOwoKICAgIHJldHVybiBub3JtYWxpemVkUHJvZmlsZURhdGE7Cn0oKSk7\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"e1db8a0a-0329-4962-a5bf-ecffaca376ae\",\"name\":\"Alpha endUserUIClient OIDC Claims Script\",\"description\":\"Used by endUserUIClient\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMTQtMjAyMSBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUwogKiBvciB3aXRoIG9uZSBvZiBpdHMgYWZmaWxpYXRlcy4gQWxsIHVzZSBzaGFsbCBiZSBleGNsdXNpdmVseSBzdWJqZWN0CiAqIHRvIHN1Y2ggbGljZW5zZSBiZXR3ZWVuIHRoZSBsaWNlbnNlZSBhbmQgRm9yZ2VSb2NrIEFTLgogKi8KCi8qCiAqIFRoaXMgc2NyaXB0IGNvbXB1dGVzIGNsYWltIHZhbHVlcyByZXR1cm5lZCBpbiBJRCB0b2tlbnMgYW5kL29yIGF0IHRoZSBVc2VySW5mbyBFbmRwb2ludC4KICogVGhlIGNsYWltIHZhbHVlcyBhcmUgY29tcHV0ZWQgZm9yOgogKiB0aGUgY2xhaW1zIGRlcml2ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHNjb3BlcywKICogdGhlIGNsYWltcyBwcm92aWRlZCBieSB0aGUgYXV0aG9yaXphdGlvbiBzZXJ2ZXIsCiAqIGFuZCB0aGUgY2xhaW1zIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50IHZpYSB0aGUgY2xhaW1zIHBhcmFtZXRlci4KICoKICogSW4gdGhlIENPTkZJR1VSQVRJT04gQU5EIENVU1RPTUlaQVRJT04gc2VjdGlvbiwgeW91IGNhbgogKiBkZWZpbmUgdGhlIHNjb3BlLXRvLWNsYWltcyBtYXBwaW5nLCBhbmQKICogYXNzaWduIHRvIGVhY2ggY2xhaW0gYSByZXNvbHZlciBmdW5jdGlvbiB0aGF0IHdpbGwgY29tcHV0ZSB0aGUgY2xhaW0gdmFsdWUuCiAqCiAqIERlZmluZWQgdmFyaWFibGVzIChjbGFzcyByZWZlcmVuY2VzIGFyZSBwcm92aWRlZCBiZWxvdyk6CiAqIHNjb3BlcyAtIFNldDxTdHJpbmc+ICg2KS4KICogICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSByZXF1ZXN0ZWQgc2NvcGVzLgogKiBjbGFpbXMgLSBNYXA8U3RyaW5nLCBPYmplY3Q+ICg1KS4KICogICAgICAgICAgQWx3YXlzIHByZXNlbnQsIGRlZmF1bHQgc2VydmVyIHByb3ZpZGVkIGNsYWltcy4KICogY2xhaW1PYmplY3RzIC0gTGlzdDxDbGFpbT4gKDcsIDIpLgogKiAgICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIGRlZmF1bHQgc2VydmVyIHByb3ZpZGVkIGNsYWltcy4KICogcmVxdWVzdGVkQ2xhaW1zIC0gTWFwPFN0cmluZywgU2V0PFN0cmluZz4+ICg1KS4KICogICAgICAgICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIG5vdCBlbXB0eSBpZiB0aGUgcmVxdWVzdCBjb250YWlucyB0aGUgY2xhaW1zIHBhcmFtZXRlciBhbmQgdGhlIHNlcnZlciBoYXMgZW5hYmxlZAogKiAgICAgICAgICAgICAgICAgICBjbGFpbXNfcGFyYW1ldGVyX3N1cHBvcnRlZC4gQSBtYXAgb2YgdGhlIHJlcXVlc3RlZCBjbGFpbXMgdG8gcG9zc2libGUgdmFsdWVzLCBvdGhlcndpc2UgZW1wdHk7CiAqICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBjbGFpbXMgd2l0aCBubyByZXF1ZXN0ZWQgdmFsdWVzIHdpbGwgaGF2ZSBhIGtleSBidXQgbm8gdmFsdWUgaW4gdGhlIG1hcC4gQSBrZXkgd2l0aAogKiAgICAgICAgICAgICAgICAgICBhIHNpbmdsZSB2YWx1ZSBpbiBpdHMgU2V0ICg2KSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiByZXF1ZXN0ZWRUeXBlZENsYWltcyAtIExpc3Q8Q2xhaW0+ICg3LCAyKS4KICogICAgICAgICAgICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIHJlcXVlc3RlZCBjbGFpbXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdGVkIGNsYWltcyB3aXRoIG5vIHJlcXVlc3RlZCB2YWx1ZXMgd2lsbCBoYXZlIGEgY2xhaW0gd2l0aCBubyB2YWx1ZXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgQSBjbGFpbSB3aXRoIGEgc2luZ2xlIHZhbHVlIGluZGljYXRlcyB0aGlzIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiBjbGFpbXNMb2NhbGVzIC0gTGlzdDxTdHJpbmc+ICg3KS4KICogICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgZnJvbSB0aGUgJ2NsYWltc19sb2NhbGVzJyBwYXJhbWV0ZXIuCiAqICAgICAgICAgICAgICAgICBTZWUgaHR0cHM6Ly9vcGVuaWQubmV0L3NwZWNzL29wZW5pZC1jb25uZWN0LWNvcmUtMV8wLmh0bWwjQ2xhaW1zTGFuZ3VhZ2VzQW5kU2NyaXB0cyBmb3IgdGhlIE9JREMgc3BlY2lmaWNhdGlvbiBkZXRhaWxzLgogKiByZXF1ZXN0UHJvcGVydGllcyAtIFVubW9kaWZpYWJsZSBNYXAgKDUpLgogKiAgICAgICAgICAgICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCBjb250YWlucyBhIG1hcCBvZiByZXF1ZXN0IHByb3BlcnRpZXM6CiAqICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVyaSAtIFRoZSByZXF1ZXN0IFVSSS4KICogICAgICAgICAgICAgICAgICAgICByZWFsbSAtIFRoZSByZWFsbSB0aGF0IHRoZSByZXF1ZXN0IHJlbGF0ZXMgdG8uCiAqICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhcmFtcyAtIEEgbWFwIG9mIHRoZSByZXF1ZXN0IHBhcmFtcyBhbmQvb3IgcG9zdGVkIGRhdGEuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVhY2ggdmFsdWUgaXMgYSBsaXN0IG9mIG9uZSBvciBtb3JlIHByb3BlcnRpZXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBub3RlIHRoYXQgdGhlc2Ugc2hvdWxkIGJlIGhhbmRsZWQgaW4gYWNjb3JkYW5jZSB3aXRoIE9XQVNQIGJlc3QgcHJhY3RpY2VzOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL293YXNwLm9yZy93d3ctY29tbXVuaXR5L3Z1bG5lcmFiaWxpdGllcy9VbnNhZmVfdXNlX29mX1JlZmxlY3Rpb24uCiAqIGNsaWVudFByb3BlcnRpZXMgLSBVbm1vZGlmaWFibGUgTWFwICg1KS4KICogICAgICAgICAgICAgICAgICAgIFByZXNlbnQgaWYgdGhlIGNsaWVudCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIGlkZW50aWZpZWQsIGNvbnRhaW5zIGEgbWFwIG9mIGNsaWVudCBwcm9wZXJ0aWVzOgogKiAgICAgICAgICAgICAgICAgICAgY2xpZW50SWQgLSBUaGUgY2xpZW50J3MgVVJJIGZvciB0aGUgcmVxdWVzdCBsb2NhbGUuCiAqICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JhbnRUeXBlcyAtIExpc3Qgb2YgdGhlIGFsbG93ZWQgZ3JhbnQgdHlwZXMgKG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuR3JhbnRUeXBlKSBmb3IgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgIGFsbG93ZWRSZXNwb25zZVR5cGVzIC0gTGlzdCBvZiB0aGUgYWxsb3dlZCByZXNwb25zZSB0eXBlcyBmb3IgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgIGFsbG93ZWRTY29wZXMgLSBMaXN0IG9mIHRoZSBhbGxvd2VkIHNjb3BlcyBmb3IgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgIGN1c3RvbVByb3BlcnRpZXMgLSBBIG1hcCBvZiB0aGUgY3VzdG9tIHByb3BlcnRpZXMgb2YgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0cyBvciBtYXBzIHdpbGwgYmUgaW5jbHVkZWQgYXMgc3ViLW1hcHM7IGZvciBleGFtcGxlOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbU1hcFtLZXkxXT1WYWx1ZTEgd2lsbCBiZSByZXR1cm5lZCBhcyBjdXN0b21NYXAgLT4gS2V5MSAtPiBWYWx1ZTEuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gYWRkIGN1c3RvbSBwcm9wZXJ0aWVzIHRvIGEgY2xpZW50LCB1cGRhdGUgdGhlIEN1c3RvbSBQcm9wZXJ0aWVzIGZpZWxkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQU0gQ29uc29sZSA+IFJlYWxtIE5hbWUgPiBBcHBsaWNhdGlvbnMgPiBPQXV0aCAyLjAgPiBDbGllbnRzID4gQ2xpZW50IElEID4gQWR2YW5jZWQuCiAqIGlkZW50aXR5IC0gQU1JZGVudGl0eSAoMykuCiAqICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBpZGVudGl0eSBvZiB0aGUgcmVzb3VyY2Ugb3duZXIuCiAqIHNlc3Npb24gLSBTU09Ub2tlbiAoNCkuCiAqICAgICAgICAgICBQcmVzZW50IGlmIHRoZSByZXF1ZXN0IGNvbnRhaW5zIHRoZSBzZXNzaW9uIGNvb2tpZSwgdGhlIHVzZXIncyBzZXNzaW9uIG9iamVjdC4KICogc2NyaXB0TmFtZSAtIFN0cmluZyAocHJpbWl0aXZlKS4KICogICAgICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzY3JpcHQuCiAqIGxvZ2dlciAtIEFsd2F5cyBwcmVzZW50LCB0aGUgIk9BdXRoMlByb3ZpZGVyIiBkZWJ1ZyBsb2dnZXIgaW5zdGFuY2U6CiAqICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuaHRtbCNzY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuCiAqICAgICAgICAgIENvcnJlc3BvbmRpbmcgZmlsZXMgd2lsbCBiZSBwcmVmaXhlZCB3aXRoOiBzY3JpcHRzLk9JRENfQ0xBSU1TLgogKiBodHRwQ2xpZW50IC0gSFRUUCBDbGllbnQgKDgpLgogKiAgICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBIVFRQIENsaWVudCBpbnN0YW5jZToKICogICAgICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHRpbmctYXBpLWdsb2JhbC1odHRwLWNsaWVudC5odG1sI3NjcmlwdGluZy1hcGktZ2xvYmFsLWh0dHAtY2xpZW50LgogKiAgICAgICAgICAgICAgSW4gb3JkZXIgdG8gdXNlIHRoZSBjbGllbnQsIHlvdSBtYXkgbmVlZCB0byBhZGQKICogICAgICAgICAgICAgIG9yZy5mb3JnZXJvY2suaHR0cC5DbGllbnQsCiAqICAgICAgICAgICAgICBvcmcuZm9yZ2Vyb2NrLmh0dHAucHJvdG9jb2wuKiwKICogICAgICAgICAgICAgIGFuZCBvcmcuZm9yZ2Vyb2NrLnV0aWwucHJvbWlzZS5Qcm9taXNlSW1wbAogKiAgICAgICAgICAgICAgdG8gdGhlIGFsbG93ZWQgSmF2YSBjbGFzc2VzIGluIHRoZSBzY3JpcHRpbmcgZW5naW5lIGNvbmZpZ3VyYXRpb24sIGFzIGRlc2NyaWJlZCBpbjoKICogICAgICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHQtZW5naW5lLXNlY3VyaXR5Lmh0bWwKICoKICogUmV0dXJuIC0gYSBuZXcgVXNlckluZm9DbGFpbXMoTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZXMsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gY29tcG9zaXRlU2NvcGVzKSAoMSkgb2JqZWN0LgogKiAgICAgICAgICBUaGUgcmVzdWx0IG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpbiB0aGUgc2NyaXB0IGlzIHJldHVybmVkIHRvIHRoZSBzZXJ2ZXIuCiAqICAgICAgICAgIEN1cnJlbnRseSwgdGhlIEltbWVkaWF0ZWx5IEludm9rZWQgRnVuY3Rpb24gRXhwcmVzc2lvbiAoYWxzbyBrbm93biBhcyBTZWxmLUV4ZWN1dGluZyBBbm9ueW1vdXMgRnVuY3Rpb24pCiAqICAgICAgICAgIGlzIHRoZSBsYXN0IChhbmQgb25seSkgc3RhdGVtZW50IGluIHRoaXMgc2NyaXB0LCBhbmQgaXRzIHJldHVybiB2YWx1ZSB3aWxsIGJlY29tZSB0aGUgc2NyaXB0IHJlc3VsdC4KICogICAgICAgICAgRG8gbm90IHVzZSAicmV0dXJuIHZhcmlhYmxlIiBzdGF0ZW1lbnQgb3V0c2lkZSBvZiBhIGZ1bmN0aW9uIGRlZmluaXRpb24uCiAqICAgICAgICAgIFNlZSBSRVNVTFRTIHNlY3Rpb24gZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KICoKICogQ2xhc3MgcmVmZXJlbmNlOgogKiAoMSkgVXNlckluZm9DbGFpbXMgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb2F1dGgyL2NvcmUvVXNlckluZm9DbGFpbXMuaHRtbC4KICogKDIpIENsYWltIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbCkuCiAqICAgICAgICAgQW4gaW5zdGFuY2Ugb2Ygb3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltIGhhcyBtZXRob2RzIHRvIGFjY2VzcwogKiAgICAgICAgIHRoZSBjbGFpbSBuYW1lLCByZXF1ZXN0ZWQgdmFsdWVzLCBsb2NhbGUsIGFuZCB3aGV0aGVyIHRoZSBjbGFpbSBpcyBlc3NlbnRpYWwuCiAqICgzKSBBTUlkZW50aXR5IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L2lkbS9BTUlkZW50aXR5Lmh0bWwuCiAqICg0KSBTU09Ub2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3MvY29tL2lwbGFuZXQvc3NvL1NTT1Rva2VuLmh0bWwuCiAqICg1KSBNYXAgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS91dGlsL0hhc2hNYXAuaHRtbCwKICogICAgICAgICAgIG9yIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL3V0aWwvTGlua2VkSGFzaE1hcC5odG1sLgogKiAoNikgU2V0IC0gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9IYXNoU2V0Lmh0bWwuCiAqICg3KSBMaXN0IC0gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9BcnJheUxpc3QuaHRtbC4KICogKDgpIENsaWVudCAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9odHRwL0NsaWVudC5odG1sLgoqLwoKKGZ1bmN0aW9uICgpIHsKICAgIC8vIFNFVFVQCgogICAgLyoqCiAgICAgKiBDbGFpbSBwcm9jZXNzaW5nIHV0aWxpdGllcy4KICAgICAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHJldXNhYmxlIGZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyBjbGFpbXMuCiAgICAgKiBAc2VlIENMQUlNIFBST0NFU1NJTkcgVVRJTElUSUVTIHNlY3Rpb24gZm9yIGRldGFpbHMuCiAgICAgKi8KICAgIHZhciB1dGlscyA9IGdldFV0aWxzKCk7CgogICAgLy8gQ09ORklHVVJBVElPTiBBTkQgQ1VTVE9NSVpBVElPTgoKICAgIC8qKgogICAgICogT0F1dGggMi4wIHNjb3BlIHZhbHVlcyAoc2NvcGVzKSBjYW4gYmUgdXNlZCBieSB0aGUgQ2xpZW50IHRvIHJlcXVlc3QgT0lEQyBjbGFpbXMuCiAgICAgKgogICAgICogQ2FsbCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kLCBhbmQgcGFzcyBpbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAqIGFuIG9iamVjdCB0aGF0IG1hcHMgYSBzY29wZSB2YWx1ZSB0byBhbiBhcnJheSBvZiBjbGFpbSBuYW1lcwogICAgICogdG8gc3BlY2lmeSB3aGljaCBjbGFpbXMgbmVlZCB0byBiZSBwcm9jZXNzZWQgYW5kIHJldHVybmVkIGZvciB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI1Njb3BlQ2xhaW1zfQogICAgICogZm9yIHRoZSBzY29wZSB2YWx1ZXMgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlcXVlc3QgY2xhaW1zIGFzIGRlZmluZWQgaW4gdGhlIE9JREMgc3BlY2lmaWNhdGlvbi4KICAgICAqCiAgICAgKiBCZWxvdywgZmluZCBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0aGF0IGlzIGV4cGVjdGVkIHRvIHdvcmsgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCiAgICAgKgogICAgICogQ1VTVE9NSVpBVElPTgogICAgICogWW91IGNhbiBjaG9vc2UgdGhlIGNsYWltIG5hbWVzIHJldHVybmVkIGZvciBhIHNjb3BlLgogICAgICovCiAgICB1dGlscy5zZXRTY29wZUNsYWltc01hcCh7CiAgICAgICAgcHJvZmlsZTogWwogICAgICAgICAgICAnbmFtZScsCiAgICAgICAgICAgICdmYW1pbHlfbmFtZScsCiAgICAgICAgICAgICdnaXZlbl9uYW1lJywKICAgICAgICAgICAgJ3pvbmVpbmZvJywKICAgICAgICAgICAgJ2xvY2FsZScKICAgICAgICBdLAogICAgICAgIGVtYWlsOiBbJ2VtYWlsJ10sCiAgICAgICAgYWRkcmVzczogWydhZGRyZXNzJ10sCiAgICAgICAgcGhvbmU6IFsncGhvbmVfbnVtYmVyJ10KICAgIH0pOwoKICAgIC8qKgogICAgICogSW4gdGhpcyBzY3JpcHQsIGVhY2ggY2xhaW0KICAgICAqIGRlcml2ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHNjb3BlcywKICAgICAqIHByb3ZpZGVkIGJ5IHRoZSBhdXRob3JpemF0aW9uIHNlcnZlciwgYW5kCiAgICAgKiByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCB2aWEgdGhlIGNsYWltcyBwYXJhbWV0ZXIKICAgICAqIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IGEgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGFpbSBuYW1lLgogICAgICoKICAgICAqIENhbGwgdGhpcyBjb25maWd1cmF0aW9uIG1ldGhvZCwgYW5kIHBhc3MgaW4gYXMgdGhlIGZpcnN0IGFyZ3VtZW50CiAgICAgKiBhbiBvYmplY3QgdGhhdCBtYXBzIGEgY2xhaW0gbmFtZSB0byBhIHJlc29sdmVyIGZ1bmN0aW9uLAogICAgICogd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGV4ZWN1dGVkIGZvciBlYWNoIGNsYWltIHByb2Nlc3NlZCBieSB0aGUgc2NyaXB0LgogICAgICoKICAgICAqIFRoZSBjbGFpbSByZXNvbHZlciBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgdGhlIHJlcXVlc3RlZCBjbGFpbSBpbmZvcm1hdGlvbgogICAgICogaW4gYW4gaW5zdGFuY2Ugb2Ygb3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuaWRjb25uZWN0L0NsYWltLmh0bWx9CiAgICAgKiBmb3IgZGV0YWlscyBvbiB0aGUgQ2xhaW0gY2xhc3MuCiAgICAgKgogICAgICogSWYgdGhlIGNsYWltIHJlc29sdmVyIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSwKICAgICAqIG90aGVyIHRoYW4gdW5kZWZpbmVkIG9yIG51bGwsCiAgICAgKiB0aGUgY2xhaW0gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgc2NyaXB0J3MgcmVzdWx0cy4KICAgICAqCiAgICAgKiBUaGUgQ2xhaW0gaW5zdGFuY2UgcHJvdmlkZXMgbWV0aG9kcyB0byBjaGVjawogICAgICogd2hhdCB0aGUgbmFtZSBvZiB0aGUgY2xhaW0gaXMsCiAgICAgKiB3aGljaCB2YWx1ZXMgdGhlIGNsYWltIHJlcXVlc3QgY29udGFpbnMsCiAgICAgKiB3aGV0aGVyIHRoZSBjbGFpbSBpcyBlc3NlbnRpYWwsIGFuZAogICAgICogd2hpY2ggbG9jYWxlIHRoZSBjbGFpbSBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgKiBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gY2FuIGNvbnNpZGVyIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjb21wdXRpbmcgYW5kIHJldHVybmluZyB0aGUgY2xhaW0gdmFsdWUuCiAgICAgKgogICAgICogQmVsb3csIGZpbmQgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdGhhdCBpcyBleHBlY3RlZCB0byB3b3JrIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LgogICAgICogQSByZXVzYWJsZSBmdW5jdGlvbiwgdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKFN0cmluZyBhdHRyaWJ1dGUtbmFtZSksCiAgICAgKiBpcyBjYWxsZWQgdG8gcmV0dXJuIGEgY2xhaW0gcmVzb2x2ZXIgZnVuY3Rpb24gYmFzZWQgb24gYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlLgogICAgICogQHNlZSBDTEFJTSBSRVNPTFZFUlMgc2VjdGlvbiBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIGV4YW1wbGVzLgogICAgICogRm9yIHRoZSBhZGRyZXNzIGNsYWltLCBhbiBleGFtcGxlIG9mIGEgY2xhaW0gcmVzb2x2ZXIgdGhhdCB1c2VzIGFub3RoZXIgY2xhaW0gcmVzb2x2ZXIgaXMgcHJvdmlkZWQuCiAgICAgKgogICAgICogQ1VTVE9NSVpBVElPTgogICAgICogWW91IGNhbiByZXVzZSB0aGUgcHJlZGVmaW5lZCB1dGlscyBtZXRob2RzIHdpdGggeW91ciBjdXN0b20gYXJndW1lbnRzLgogICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBjdXN0b20gcmVzb2x2ZXIgZnVuY3Rpb24gZm9yIGEgY2xhaW0gbmFtZSwKICAgICAqIHRoYXQgd2lsbCBjb21wdXRlIGFuZCByZXR1cm4gdGhlIGNsYWltIHZhbHVl4oCUYXMgc2hvd24gaW4gdGhlIGNvbW1lbnRlZCBvdXQgZXhhbXBsZSBiZWxvdy4KICAgICAqLwogICAgdXRpbHMuc2V0Q2xhaW1SZXNvbHZlcnMoewogICAgICAgIC8qCiAgICAgICAgLy8gQW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBjbGFpbSByZXNvbHZlciBmdW5jdGlvbiB0aGF0IGlzIGRlZmluZWQgZm9yIGEgY2xhaW0KICAgICAgICAvLyBkaXJlY3RseSBpbiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3Q6CiAgICAgICAgY3VzdG9tLWNsYWltLW5hbWU6IGZ1bmN0aW9uIChyZXF1ZXN0ZWRDbGFpbSkgewogICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGluaXRpYWxseSwgdGhlIGNsYWltIHZhbHVlIGNvbWVzIHN0cmFpZ2h0IGZyb20gYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlOgogICAgICAgICAgICB2YXIgY2xhaW1WYWx1ZSA9IGlkZW50aXR5LmdldEF0dHJpYnV0ZSgnY3VzdG9tLWF0dHJpYnV0ZS1uYW1lJykudG9BcnJheSgpWzBdCgogICAgICAgICAgICAvLyBPcHRpb25hbGx5LCBwcm92aWRlIGFkZGl0aW9uYWwgbG9naWMgZm9yIHByb2Nlc3NpbmcgKGZpbHRlcmluZywgZm9ybWF0dGluZywgZXRjLikgdGhlIGNsYWltIHZhbHVlLgogICAgICAgICAgICAvLyBZb3UgY2FuIHVzZToKICAgICAgICAgICAgLy8gcmVxdWVzdGVkQ2xhaW0uZ2V0TmFtZSgpCiAgICAgICAgICAgIC8vIHJlcXVlc3RlZENsYWltLmdldFZhbHVlcygpCiAgICAgICAgICAgIC8vIHJlcXVlc3RlZENsYWltLmdldExvY2FsZSgpCiAgICAgICAgICAgIC8vIHJlcXVlc3RlZENsYWltLmlzRXNzZW50aWFsKCkKCiAgICAgICAgICAgIHJldHVybiBjbGFpbVZhbHVlCiAgICAgICAgfSwKICAgICAgICAqLwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB1c2Ugb2YgdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyIHNob3dzIGhvdwogICAgICAgICAqIGFuIGFyZ3VtZW50IHBhc3NlZCB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYWltIHJlc29sdmVyCiAgICAgICAgICogYmVjb21lcyBhdmFpbGFibGUgdG8gdGhlIHJlc29sdmVyIGZ1bmN0aW9uICh2aWEgaXRzIGxleGljYWwgY29udGV4dCkuCiAgICAgICAgICovCiAgICAgICAgbmFtZTogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdjbicpLAogICAgICAgIGZhbWlseV9uYW1lOiB1dGlscy5nZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXIoJ3NuJyksCiAgICAgICAgZ2l2ZW5fbmFtZTogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdnaXZlbm5hbWUnKSwKICAgICAgICB6b25laW5mbzogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdwcmVmZXJyZWR0aW1lem9uZScpLAogICAgICAgIGxvY2FsZTogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdwcmVmZXJyZWRsb2NhbGUnKSwKICAgICAgICBlbWFpbDogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdtYWlsJyksCiAgICAgICAgYWRkcmVzczogdXRpbHMuZ2V0QWRkcmVzc0NsYWltUmVzb2x2ZXIoCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgcGFzc2VkIGluIHVzZXIgcHJvZmlsZSBjbGFpbSByZXNvbHZlciBmdW5jdGlvbgogICAgICAgICAgICAgKiBjYW4gYmUgdXNlZCBieSB0aGUgYWRkcmVzcyBjbGFpbSByZXNvbHZlciBmdW5jdGlvbgogICAgICAgICAgICAgKiB0byBvYnRhaW4gdGhlIGNsYWltIHZhbHVlIHRvIGJlIGZvcm1hdHRlZCBhcyBwZXIgdGhlIE9JREMgc3BlY2lmaWNhdGlvbjoKICAgICAgICAgICAgICogQHNlZSBodHRwczovL29wZW5pZC5uZXQvc3BlY3Mvb3BlbmlkLWNvbm5lY3QtY29yZS0xXzAuaHRtbCNBZGRyZXNzQ2xhaW0uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB1dGlscy5nZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXIoJ3Bvc3RhbGFkZHJlc3MnKQogICAgICAgICksCiAgICAgICAgcGhvbmVfbnVtYmVyOiB1dGlscy5nZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXIoJ3RlbGVwaG9uZW51bWJlcicpCiAgICB9KTsKCiAgICAvLyBDTEFJTSBQUk9DRVNTSU5HIFVUSUxJVElFUwoKICAgIC8qKgogICAgICogQHJldHVybnMge29iamVjdH0gQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgcmV1c2FibGUgY2xhaW0gcHJvY2Vzc2luZyB1dGlsaXRpZXMuCiAgICAgKiBAc2VlIFBVQkxJQyBNRVRIT0RTIHNlY3Rpb24gYW5kIHRoZSByZXR1cm4gc3RhdGVtZW50IGZvciB0aGUgbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFV0aWxzICgpIHsKICAgICAgICAvLyBJTVBPUlQgSkFWQQoKICAgICAgICAvKioKICAgICAgICAgKiBQcm92aWRlcyBKYXZhIHNjcmlwdGluZyBmdW5jdGlvbmFsaXR5LgogICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvTW96aWxsYS9Qcm9qZWN0cy9SaGluby9TY3JpcHRpbmdfSmF2YSNqYXZhaW1wb3J0ZXJfY29uc3RydWN0b3J9LgogICAgICAgICAqLwogICAgICAgIHZhciBmckphdmEgPSBKYXZhSW1wb3J0ZXIoCiAgICAgICAgICAgIG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiwKICAgICAgICAgICAgb3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5Vc2VySW5mb0NsYWltcywKICAgICAgICAgICAgb3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltLAoKICAgICAgICAgICAgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAsCiAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QKICAgICAgICApOwoKICAgICAgICAvLyBTRVQgVVAgQ09ORklHVVJBVElPTgoKICAgICAgICAvKioKICAgICAgICAgKiBQbGFjZWhvbGRlciBmb3IgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB0aGF0IGNvbnRhaW5zCiAgICAgICAgICogYW4gb2JqZWN0IHRoYXQgbWFwcyB0aGUgc3VwcG9ydGVkIHNjb3BlIHZhbHVlcyAoc2NvcGVzKQogICAgICAgICAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjbGFpbSBuYW1lcyBmb3IgZWFjaCBzY29wZSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB2YXIgc2NvcGVDbGFpbXNNYXA7CgogICAgICAgIC8qKgogICAgICAgICAqIFBsYWNlaG9sZGVyIGZvciBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRoYXQgY29udGFpbnMKICAgICAgICAgKiBhbiBvYmplY3QgdGhhdCBtYXBzIHRoZSBzdXBwb3J0ZWQgY2xhaW0gbmFtZXMKICAgICAgICAgKiBhbmQgdGhlIHJlc29sdmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdGhlIGNsYWltIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIHZhciBjbGFpbVJlc29sdmVyczsKCiAgICAgICAgLyoqCiAgICAgICAgICogQSAocHVibGljKSBtZXRob2QgdGhhdCBhY2NlcHRzIGFuIG9iamVjdCB0aGF0IG1hcHMgdGhlIHN1cHBvcnRlZCBzY29wZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYWltIG5hbWVzLAogICAgICAgICAqIGFuZCBhc3NpZ25zIGl0IHRvIGEgKHByaXZhdGUpIHZhcmlhYmxlIHRoYXQgc2VydmVzIGFzIGEgY29uZmlndXJhdGlvbiBvcHRpb24uCiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyAtIEFuIG9iamVjdCB0aGF0IG1hcHMgZWFjaCBzdXBwb3J0ZWQgc2NvcGUgdmFsdWUgdG8gYW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMsCiAgICAgICAgICogaW4gb3JkZXIgdG8gc3BlY2lmeSB3aGljaCBjbGFpbXMgbmVlZCB0byBiZSBwcm9jZXNzZWQgZm9yIHRoZSByZXF1ZXN0ZWQgc2NvcGVzLgogICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI1Njb3BlQ2xhaW1zfSBmb3IgZGV0YWlscy4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcGFyYW1zLnByb2ZpbGVdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIHByb2ZpbGUgc2NvcGUgaXMgcmVxdWVzdGVkLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtwYXJhbXMuZW1haWxdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIGVtYWlsIHNjb3BlIGlzIHJlcXVlc3RlZC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcGFyYW1zLmFkZHJlc3NdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIGFkZHJlc3Mgc2NvcGUgaXMgcmVxdWVzdGVkLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtwYXJhbXMucGhvbmVdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIHBob25lIHNjb3BlIGlzIHJlcXVlc3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNldFNjb3BlQ2xhaW1zTWFwKHBhcmFtcykgewogICAgICAgICAgICBzY29wZUNsYWltc01hcCA9IHBhcmFtczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEEgKHB1YmxpYykgbWV0aG9kIHRoYXQgYWNjZXB0cyBhbiBvYmplY3QgdGhhdCBtYXBzIHRoZSBzdXBwb3J0ZWQgY2xhaW0gbmFtZXMKICAgICAgICAgKiBhbmQgdGhlIHJlc29sdmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdGhlIGNsYWltIHZhbHVlLAogICAgICAgICAqIGFuZCBhc3NpZ25zIGl0IHRvIGEgKHByaXZhdGUpIHZhcmlhYmxlIHRoYXQgc2VydmVzIGFzIGEgY29uZmlndXJhdGlvbiBvcHRpb24uCiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyAtIEFuIG9iamVjdCB0aGF0IG1hcHMKICAgICAgICAgKiBlYWNoIHN1cHBvcnRlZCBjbGFpbSBuYW1lIHRvIGEgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgY2xhaW0gdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc2V0Q2xhaW1SZXNvbHZlcnMocGFyYW1zKSB7CiAgICAgICAgICAgIGNsYWltUmVzb2x2ZXJzID0gcGFyYW1zOwogICAgICAgIH0KCiAgICAgICAgLy8gQ0xBSU0gUkVTT0xWRVJTCgogICAgICAgIC8qKgogICAgICAgICAqIENsYWltIHJlc29sdmVycyBhcmUgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGEgY2xhaW0gdmFsdWUuCiAgICAgICAgICogQHBhcmFtIHsqfQogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGEgY2xhaW0gcmVzb2x2ZXIgYmFzZWQgb24gYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gTmFtZSBvZiB0aGUgdXNlciBwcm9maWxlIGF0dHJpYnV0ZS4KICAgICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGRldGVybWluZSB0aGUgY2xhaW0gdmFsdWUKICAgICAgICAgKiBiYXNlZCBvbiB0aGUgdXNlciBwcm9maWxlIGF0dHJpYnV0ZSBhbmQgdGhlIChyZXF1ZXN0ZWQpIGNsYWltIHByb3BlcnRpZXMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyIChhdHRyaWJ1dGVOYW1lKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZXNvbHZlcyBhIGNsYWltIHdpdGggYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlLgogICAgICAgICAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgaWRlbnRpdHkgYXR0cmlidXRlIGlzIG5vdCBwb3B1bGF0ZWQsCiAgICAgICAgICAgICAqIE9SIGlmIHRoZSBjbGFpbSBoYXMgcmVxdWVzdGVkIHZhbHVlcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZSBpZGVudGl0eSBhdHRyaWJ1dGUgdmFsdWUuCiAgICAgICAgICAgICAqIEFUVEVOVElPTjogdGhlIGFmb3JlbWVudGlvbmVkIGNvbXBhcmlzb24gaXMgY2FzZS1zZW5zaXRpdmUuCiAgICAgICAgICAgICAqIEBwYXJhbSB7b3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltfSBjbGFpbQogICAgICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG9idGFpbiBpbmZvcm1hdGlvbi9yZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhaW0uCiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuaWRjb25uZWN0L0NsYWltLmh0bWx9IGZvciBkZXRhaWxzLgogICAgICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfEhhc2hTZXR8dW5kZWZpbmVkfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZUNsYWltKGNsYWltKSB7CiAgICAgICAgICAgICAgICB2YXIgdXNlclByb2ZpbGVWYWx1ZTsKCiAgICAgICAgICAgICAgICBpZiAoaWRlbnRpdHkpIHsKICAgICAgICAgICAgICAgICAgICB1c2VyUHJvZmlsZVZhbHVlID0gZ2V0Q2xhaW1WYWx1ZUZyb21TZXQoY2xhaW0sIGlkZW50aXR5LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSk7CgogICAgICAgICAgICAgICAgICAgIGlmICh1c2VyUHJvZmlsZVZhbHVlICYmICF1c2VyUHJvZmlsZVZhbHVlLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsYWltLmdldFZhbHVlcygpIHx8IGNsYWltLmdldFZhbHVlcygpLmlzRW1wdHkoKSB8fCBjbGFpbS5nZXRWYWx1ZXMoKS5jb250YWlucyh1c2VyUHJvZmlsZVZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJQcm9maWxlVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhaW07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGFkZHJlc3MgY2xhaW0gcmVzb2x2ZXIgYmFzZWQgb24gYSBjbGFpbSB2YWx1ZSBvYnRhaW5lZCB3aXRoIGFub3RoZXIgY2xhaW0gcmVzb2x2ZXIuCiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZUNsYWltIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBjbGFpbSB2YWx1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGFjY2VwdCBhIGNsYWltIGFzIGFuIGFyZ3VtZW50LAogICAgICAgICAqIHJ1biB0aGUgY2xhaW0gcmVzb2x2ZXIgZnVuY3Rpb24gZm9yIHRoZSBjbGFpbSBhbmQgb2J0YWluIHRoZSBjbGFpbSB2YWx1ZSwKICAgICAgICAgKiBhbmQgYXBwbHkgYWRkaXRpb25hbCBmb3JtYXR0aW5nIHRvIHRoZSB2YWx1ZSBiZWZvcmUgcmV0dXJuaW5nIGl0LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldEFkZHJlc3NDbGFpbVJlc29sdmVyIChyZXNvbHZlQ2xhaW0pIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENyZWF0ZXMgYW4gYWRkcmVzcyBjbGFpbSBvYmplY3QgZnJvbSBhIHZhbHVlIHJldHVybmVkIGJ5IGEgY2xhaW0gcmVzb2x2ZXIsCiAgICAgICAgICAgICAqIGFuZCByZXR1cm5zIHRoZSBhZGRyZXNzIGNsYWltIG9iamVjdCBhcyB0aGUgY2xhaW0gdmFsdWUuCiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI0FkZHJlc3NDbGFpbX0uCiAgICAgICAgICAgICAqIFRoZSBjbGFpbSB2YWx1ZSBpcyBvYnRhaW5lZCB3aXRoIGEgY2xhaW0gcmVzb2x2aW5nIGZ1bmN0aW9uIGF2YWlsYWJsZSBmcm9tIHRoZSBjbG9zdXJlLgogICAgICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBvYnRhaW4gaW5mb3JtYXRpb24vcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIGNsYWltLgogICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmlkY29ubmVjdC9DbGFpbS5odG1sfSBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICogQHJldHVybnMge2phdmEudXRpbC5MaW5rZWRIYXNoTWFwfHVuZGVmaW5lZH0gVGhlIGFkZHJlc3MgY2xhaW0gb2JqZWN0IGNyZWF0ZWQgZnJvbSBhIGNsYWltIHZhbHVlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZUFkZHJlc3NDbGFpbShjbGFpbSkgewogICAgICAgICAgICAgICAgdmFyIGNsYWltVmFsdWUgPSByZXNvbHZlQ2xhaW0oY2xhaW0pOwogICAgICAgICAgICAgICAgdmFyIGFkZHJlc3NPYmplY3Q7CgogICAgICAgICAgICAgICAgaWYgKGlzQ2xhaW1WYWx1ZVZhbGlkKGNsYWltVmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgYWRkcmVzc09iamVjdCA9IG5ldyBmckphdmEuTGlua2VkSGFzaE1hcCgpOwoKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzT2JqZWN0LnB1dCgnZm9ybWF0dGVkJywgY2xhaW1WYWx1ZSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRyZXNzT2JqZWN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFkZHJlc3NDbGFpbTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gZXNzZW50aWFsIGNsYWltIHJlc29sdmVyIGJhc2VkIG9uIGEgY2xhaW0gdmFsdWUgb2J0YWluZWQgd2l0aCBhbm90aGVyIGNsYWltIHJlc29sdmVyLgogICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlc29sdmVDbGFpbSAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgY2xhaW0gdmFsdWUuCiAgICAgICAgICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBhY2NlcHQgYSBjbGFpbSBhcyBhbiBhcmd1bWVudCwKICAgICAgICAgKiBydW4gdGhlIGNsYWltIHJlc29sdmVyIGZ1bmN0aW9uIGZvciB0aGUgY2xhaW0gYW5kIG9idGFpbiB0aGUgY2xhaW0gdmFsdWUsCiAgICAgICAgICogYW5kIGFwcGx5IGFkZGl0aW9uYWwgbG9naWMgZm9yIGVzc2VudGlhbCBjbGFpbXMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0RXNzZW50aWFsQ2xhaW1SZXNvbHZlciAocmVzb2x2ZUNsYWltKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZXR1cm5zIGEgY2xhaW0gdmFsdWUgb3IgdGhyb3dzIGFuIGVycm9yLgogICAgICAgICAgICAgKiBUaGUgY2xhaW0gdmFsdWUgaXMgb2J0YWluZWQgd2l0aCBhIGNsYWltIHJlc29sdmluZyBmdW5jdGlvbiBhdmFpbGFibGUgZnJvbSB0aGUgY2xvc3VyZS4KICAgICAgICAgICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgY2xhaW0gaXMgZXNzZW50aWFsIGFuZCBubyB2YWx1ZSBpcyByZXR1cm5lZCBmb3IgdGhlIGNsYWltLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBVc2Ugb2YgdGhpcyByZXNvbHZlciBpcyBvcHRpb25hbC4KICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9vcGVuaWQubmV0L3NwZWNzL29wZW5pZC1jb25uZWN0LWNvcmUtMV8wLmh0bWwjSW5kaXZpZHVhbENsYWltc1JlcXVlc3RzfSBzdGF0aW5nOgogICAgICAgICAgICAgKiAiTm90ZSB0aGF0IGV2ZW4gaWYgdGhlIENsYWltcyBhcmUgbm90IGF2YWlsYWJsZSBiZWNhdXNlIHRoZSBFbmQtVXNlciBkaWQgbm90IGF1dGhvcml6ZSB0aGVpciByZWxlYXNlIG9yIHRoZXkgYXJlIG5vdCBwcmVzZW50LAogICAgICAgICAgICAgKiB0aGUgQXV0aG9yaXphdGlvbiBTZXJ2ZXIgTVVTVCBOT1QgZ2VuZXJhdGUgYW4gZXJyb3Igd2hlbiBDbGFpbXMgYXJlIG5vdCByZXR1cm5lZCwgd2hldGhlciB0aGV5IGFyZSBFc3NlbnRpYWwgb3IgVm9sdW50YXJ5LAogICAgICAgICAgICAgKiB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNwZWNpZmljIGNsYWltLiIKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtvcmcuZm9yZ2Vyb2NrLm9wZW5pZGNvbm5lY3QuQ2xhaW19IGNsYWltCiAgICAgICAgICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgdG8gb2J0YWluIGluZm9ybWF0aW9uL3JlcXVpcmVtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBjbGFpbS4KICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbH0gZm9yIGRldGFpbHMuCiAgICAgICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAgICAgKiBAdGhyb3dzIHtvcmcuZm9yZ2Vyb2NrLm9hdXRoMi5jb3JlLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb259CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiByZXNvbHZlRXNzZW50aWFsQ2xhaW0oY2xhaW0pIHsKICAgICAgICAgICAgICAgIHZhciBjbGFpbVZhbHVlID0gcmVzb2x2ZUNsYWltKGNsYWltKTsKCiAgICAgICAgICAgICAgICBpZiAoY2xhaW0uaXNFc3NlbnRpYWwoKSAmJiAhaXNDbGFpbVZhbHVlVmFsaWQoY2xhaW1WYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZnJKYXZhLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCdDb3VsZCBub3QgcHJvdmlkZSB2YWx1ZSBmb3IgZXNzZW50aWFsIGNsYWltOiAnICsgY2xhaW0uZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1WYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVFc3NlbnRpYWxDbGFpbTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGRlZmF1bHQgcmVzb2x1dGlvbiBmb3IgYSBjbGFpbS4KICAgICAgICAgKiBVc2UgaXQgaWYgYSBjbGFpbS1zcGVjaWZpYyByZXNvbHZlciBpcyBub3QgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG9idGFpbiBpbmZvcm1hdGlvbi9yZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhaW0uCiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbH0gZm9yIGRldGFpbHMuCiAgICAgICAgICogQHJldHVybnMgeyp9IEEgc2luZ2xlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYWltLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHJlc29sdmVBbnlDbGFpbSAoY2xhaW0pIHsKICAgICAgICAgICAgaWYgKGNsYWltLmdldFZhbHVlcygpLnNpemUoKSA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNsYWltLmdldFZhbHVlcygpLnRvQXJyYXkoKVswXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVVRJTElUSUVTCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgY2xhaW0gdmFsdWUgZnJvbSBhIHNldC4KICAgICAgICAgKiBJZiB0aGUgc2V0IGNvbnRhaW5zIGEgc2luZ2xlIHZhbHVlLCByZXR1cm5zIHRoZSB2YWx1ZS4KICAgICAgICAgKiBJZiB0aGUgc2V0IGNvbnRhaW5zIG11bHRpcGxlIHZhbHVlcywgcmV0dXJucyB0aGUgc2V0LgogICAgICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyB1bmRlZmluZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG9idGFpbiBpbmZvcm1hdGlvbi9yZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhaW0uCiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbH0gZm9yIGRldGFpbHMuCiAgICAgICAgICogQHBhcmFtIHtqYXZhLnV0aWwuSGFzaFNldH0gc2V0IFRoZSBzZXTigJRmb3IgZXhhbXBsZSwgYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd8amF2YS51dGlsLkhhc2hTZXR8dW5kZWZpbmVkfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldENsYWltVmFsdWVGcm9tU2V0IChjbGFpbSwgc2V0KSB7CiAgICAgICAgICAgIGlmIChzZXQgJiYgc2V0LnNpemUoKSkgewogICAgICAgICAgICAgICAgaWYgKHNldC5zaXplKCkgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0LnRvQXJyYXkoKVswXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChsb2dnZXIud2FybmluZ0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ09JREMgQ2xhaW1zIHNjcmlwdC4gR290IGFuIGVtcHR5IHNldCBmb3IgY2xhaW06ICcgKyBjbGFpbS5nZXROYW1lKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBpc0NsYWltVmFsdWVWYWxpZCAoY2xhaW1WYWx1ZSkgewogICAgICAgICAgICBpZiAodHlwZW9mIGNsYWltVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IGNsYWltVmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBDTEFJTSBQUk9DRVNTSU5HCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHBvcHVsYXRlZCB3aXRoIHRoZSBjb21wdXRlZCBjbGFpbSB2YWx1ZXMKICAgICAgICAgKiBhbmQgdGhlIHJlcXVlc3RlZCBzY29wZXMgbWFwcGVkIHRvIHRoZSBjbGFpbSBuYW1lcy4KICAgICAgICAgKiBAcmV0dXJucyB7b3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5Vc2VySW5mb0NsYWltc30gVGhlIG9iamVjdCB0byBiZSByZXR1cm5lZCB0byB0aGUgYXV0aG9yaXphdGlvbiBzZXJ2ZXIuCiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29hdXRoMi9jb3JlL1VzZXJJbmZvQ2xhaW1zLmh0bWx9LgogICAgICAgICAqIEBzZWUgUkVTVUxUUyBzZWN0aW9uIGZvciB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0VXNlckluZm9DbGFpbXMgKCkgewogICAgICAgICAgICByZXR1cm4gbmV3IGZySmF2YS5Vc2VySW5mb0NsYWltcyhnZXRDb21wdXRlZENsYWltcygpLCBnZXRDb21wb3NpdGVTY29wZXMoKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbWFwIG9mIChyZXF1ZXN0ZWQpIGNsYWltIG5hbWVzIHBvcHVsYXRlZCB3aXRoIHRoZSBjb21wdXRlZCBjbGFpbSB2YWx1ZXMuCiAgICAgICAgICogQHJldHVybnMge2phdmEudXRpbC5MaW5rZWRIYXNoTWFwfQogICAgICAgICAqIEEgbWFwIG9mIHRoZSByZXF1ZXN0ZWQgY2xhaW0gbmFtZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYWltIHZhbHVlcy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRDb21wdXRlZENsYWltcyAoKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDcmVhdGVzIGEgY29tcGxldGUgbGlzdCBvZiBjbGFpbSBvYmplY3RzIGZyb206CiAgICAgICAgICAgICAqIHRoZSBjbGFpbXMgZGVyaXZlZCBmcm9tIHRoZSBzY29wZXMsCiAgICAgICAgICAgICAqIHRoZSBjbGFpbXMgcHJvdmlkZWQgYnkgdGhlIGF1dGhvcml6YXRpb24gc2VydmVyLAogICAgICAgICAgICAgKiBhbmQgdGhlIGNsYWltcyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4KICAgICAgICAgICAgICogQHJldHVybnMge2phdmEudXRpbC5BcnJheUxpc3R9CiAgICAgICAgICAgICAqIFJldHVybnMgYSBjb21wbGV0ZSBsaXN0IG9mIG9yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbSBvYmplY3RzIGF2YWlsYWJsZSB0byB0aGUgc2NyaXB0LgogICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmlkY29ubmVjdC9DbGFpbS5odG1sfSBmb3IgdGhlIGNsYWltIG9iamVjdCBkZXRhaWxzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0Q2xhaW1zKCkgewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBjbGFpbSBvYmplY3RzIGZvciB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICAgICAgICAgICAgICAgICAqIFVzZXMgdGhlIHNjb3BlQ2xhaW1zTWFwIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGRlcml2ZSB0aGUgY2xhaW0gbmFtZXM7CiAgICAgICAgICAgICAgICAgKiBubyBvdGhlciBwcm9wZXJ0aWVzIG9mIGEgY2xhaW0gZGVyaXZlZCBmcm9tIGEgc2NvcGUgYXJlIHBvcHVsYXRlZC4KICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtqYXZhLnV0aWwuQXJyYXlMaXN0fQogICAgICAgICAgICAgICAgICogQSBsaXN0IG9mIG9yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbSBvYmplY3RzIGRlcml2ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICAgICAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuaWRjb25uZWN0L0NsYWltLmh0bWx9IGZvciB0aGUgY2xhaW0gb2JqZWN0IGRldGFpbHMuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnZlcnRTY29wZVRvQ2xhaW1zKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjbGFpbXMgPSBuZXcgZnJKYXZhLkFycmF5TGlzdCgpOwoKICAgICAgICAgICAgICAgICAgICBzY29wZXMudG9BcnJheSgpLmZvckVhY2goZnVuY3Rpb24gKHNjb3BlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoc2NvcGUpICE9PSAnb3BlbmlkJyAmJiBzY29wZUNsYWltc01hcFtzY29wZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlQ2xhaW1zTWFwW3Njb3BlXS5mb3JFYWNoKGZ1bmN0aW9uIChjbGFpbU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFpbXMuYWRkKG5ldyBmckphdmEuQ2xhaW0oY2xhaW1OYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBjbGFpbXMgPSBuZXcgZnJKYXZhLkFycmF5TGlzdCgpOwoKICAgICAgICAgICAgICAgIGNsYWltcy5hZGRBbGwoY29udmVydFNjb3BlVG9DbGFpbXMoKSk7CiAgICAgICAgICAgICAgICBjbGFpbXMuYWRkQWxsKGNsYWltT2JqZWN0cyk7CiAgICAgICAgICAgICAgICBjbGFpbXMuYWRkQWxsKHJlcXVlc3RlZFR5cGVkQ2xhaW1zKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBjbGFpbSB2YWx1ZS4KICAgICAgICAgICAgICogVG8gb2J0YWluIHRoZSBjbGFpbSB2YWx1ZSwgdXNlcyB0aGUgcmVzb2x2ZXIgZnVuY3Rpb24gc3BlY2lmaWVkIGZvciB0aGUgY2xhaW0gaW4gdGhlIGNsYWltUmVzb2x2ZXJzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LgogICAgICAgICAgICAgKiBAc2VlIGNsYWltUmVzb2x2ZXJzCiAgICAgICAgICAgICAqIElmIG5vIHJlc29sdmVyIGZ1bmN0aW9uIGlzIGZvdW5kLCB1c2VzIHRoZSBkZWZhdWx0IGNsYWltIHJlc29sdmVyIGZ1bmN0aW9uLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBvYnRhaW4gaW5mb3JtYXRpb24vcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIGNsYWltLgogICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmlkY29ubmVjdC9DbGFpbS5odG1sfSBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICogQHJldHVybnMgeyp9IENsYWltIHZhbHVlLgogICAgICAgICAgICAgKiBAdGhyb3dzIHtvcmcuZm9yZ2Vyb2NrLm9hdXRoMi5jb3JlLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb259CiAgICAgICAgICAgICAqIFJldGhyb3dzIHRoaXMgZXhjZXB0aW9uIGlmIGEgY2xhaW0gcmVzb2x2ZXIgdGhyb3dzIGl0LgogICAgICAgICAgICAgKiBZb3UgY2FuIHRocm93IG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBmcm9tIHlvdXIgY3VzdG9tIGNsYWltIHJlc29sdmVyCiAgICAgICAgICAgICAqIGlmIHlvdSB3YW50IHRvIHRlcm1pbmF0ZSB0aGUgY2xhaW0gcHJvY2Vzc2luZy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXB1dGVDbGFpbShjbGFpbSkgewogICAgICAgICAgICAgICAgdmFyIHJlc29sdmVDbGFpbTsKICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNsYWltID0gY2xhaW1SZXNvbHZlcnNbY2xhaW0uZ2V0TmFtZSgpXSB8fCByZXNvbHZlQW55Q2xhaW07CgogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhaW0oY2xhaW0pOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnT0lEQyBDbGFpbXMgc2NyaXB0IGV4Y2VwdGlvbi4gVW5hYmxlIHRvIHJlc29sdmUgT0lEQyBDbGFpbS4gJyArIGU7CgogICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoZSkuaW5kZXhPZignb3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLndhcm5pbmdFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcobWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY29tcHV0ZWRDbGFpbXMgPSBuZXcgZnJKYXZhLkxpbmtlZEhhc2hNYXAoKTsKCiAgICAgICAgICAgIGdldENsYWltcygpLnRvQXJyYXkoKS5mb3JFYWNoKGZ1bmN0aW9uIChjbGFpbSkgewogICAgICAgICAgICAgICAgdmFyIGNsYWltVmFsdWUgPSBjb21wdXRlQ2xhaW0oY2xhaW0pOwoKICAgICAgICAgICAgICAgIGlmIChpc0NsYWltVmFsdWVWYWxpZChjbGFpbVZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkQ2xhaW1zLnB1dChjbGFpbS5nZXROYW1lKCksIGNsYWltVmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBJZiBhIGNsYWltIGhhcyBiZWVuIHByb2Nlc3NlZCwgYnV0IGFwcGVhcnMgaW4gdGhlIGxpc3QgYWdhaW4sCiAgICAgICAgICAgICAgICAgICAgICogYW5kIGl0cyB2YWx1ZSBjYW5ub3QgYmUgY29tcHV0ZWQgdW5kZXIgdGhlIG5ldyBjb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAqIHRoZSBjbGFpbSBpcyByZW1vdmVkIGZyb20gdGhlIGZpbmFsIHJlc3VsdC4KICAgICAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICAgICAqIEZvciBleGFtcGxlLCBhIGNsYWltIGNvdWxkIGJlIG1hcHBlZCB0byBhIHNjb3BlIGFuZCBmb3VuZCBpbiB0aGUgdXNlciBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAqIGJ1dCBhbHNvIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50IHdpdGggcmVxdWlyZWQgdmFsdWVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGNvbXB1dGVkIG9uZS4KICAgICAgICAgICAgICAgICAgICAgKiBAc2VlIHtsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI0luZGl2aWR1YWxDbGFpbXNSZXF1ZXN0c30uCiAgICAgICAgICAgICAgICAgICAgICogZm9yIHRoZSByZWxldmFudCBPSURDIHNwZWNpZmljYXRpb24gZGV0YWlscy4KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBjb21wdXRlZENsYWltcy5yZW1vdmUoY2xhaW0uZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gY29tcHV0ZWRDbGFpbXM7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbWFwIG9mIHJlcXVlc3RlZCBzY29wZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYWltIG5hbWVzLgogICAgICAgICAqIEByZXR1cm5zIHtqYXZhLnV0aWwuTGlua2VkSGFzaE1hcH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRDb21wb3NpdGVTY29wZXMgKCkgewogICAgICAgICAgICB2YXIgY29tcG9zaXRlU2NvcGVzID0gbmV3IGZySmF2YS5MaW5rZWRIYXNoTWFwKCk7CgogICAgICAgICAgICBzY29wZXMudG9BcnJheSgpLmZvckVhY2goZnVuY3Rpb24gKHNjb3BlKSB7CiAgICAgICAgICAgICAgICB2YXIgc2NvcGVDbGFpbXMgPSBuZXcgZnJKYXZhLkFycmF5TGlzdCgpOwoKICAgICAgICAgICAgICAgIGlmIChzY29wZUNsYWltc01hcFtzY29wZV0pIHsKICAgICAgICAgICAgICAgICAgICBzY29wZUNsYWltc01hcFtzY29wZV0uZm9yRWFjaChmdW5jdGlvbiAoY2xhaW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlQ2xhaW1zLmFkZChjbGFpbU5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzY29wZUNsYWltcy5zaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVTY29wZXMucHV0KHNjb3BlLCBzY29wZUNsYWltcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZVNjb3BlczsKICAgICAgICB9CgogICAgICAgIC8vIFBVQkxJQyBNRVRIT0RTCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHNldFNjb3BlQ2xhaW1zTWFwOiBzZXRTY29wZUNsYWltc01hcCwKICAgICAgICAgICAgc2V0Q2xhaW1SZXNvbHZlcnM6IHNldENsYWltUmVzb2x2ZXJzLAogICAgICAgICAgICBnZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXI6IGdldFVzZXJQcm9maWxlQ2xhaW1SZXNvbHZlciwKICAgICAgICAgICAgZ2V0QWRkcmVzc0NsYWltUmVzb2x2ZXI6IGdldEFkZHJlc3NDbGFpbVJlc29sdmVyLAogICAgICAgICAgICBnZXRFc3NlbnRpYWxDbGFpbVJlc29sdmVyOiBnZXRFc3NlbnRpYWxDbGFpbVJlc29sdmVyLAogICAgICAgICAgICBnZXRVc2VySW5mb0NsYWltczogZ2V0VXNlckluZm9DbGFpbXMKICAgICAgICB9OwogICAgfQoKICAgIC8vIFJFU1VMVFMKCiAgICAvKioKICAgICAqIFRoaXMgc2NyaXB0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuVXNlckluZm9DbGFpbXMgY2xhc3MKICAgICAqIHBvcHVsYXRlZCB3aXRoIHRoZSBjb21wdXRlZCBjbGFpbSB2YWx1ZXMgYW5kCiAgICAgKiB0aGUgcmVxdWVzdGVkIHNjb3BlcyBtYXBwZWQgdG8gdGhlIGNsYWltIG5hbWVzLgogICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29hdXRoMi9jb3JlL1VzZXJJbmZvQ2xhaW1zLmh0bWx9LgogICAgICoKICAgICAqIEFzc2lnbmluZyBpdCB0byBhIHZhcmlhYmxlIGdpdmVzIHlvdSBhbiBvcHBvcnR1bml0eQogICAgICogdG8gbG9nIHRoZSBjb250ZW50IG9mIHRoZSByZXR1cm5lZCB2YWx1ZSBkdXJpbmcgZGV2ZWxvcG1lbnQuCiAgICAgKi8KICAgIHZhciB1c2VySW5mb0NsYWltcyA9IHV0aWxzLmdldFVzZXJJbmZvQ2xhaW1zKCk7CgogICAgLyoKICAgIGxvZ2dlci5lcnJvcihzY3JpcHROYW1lICsgJyByZXN1bHRzOicpCiAgICBsb2dnZXIuZXJyb3IoJ1ZhbHVlczogJyArIHVzZXJJbmZvQ2xhaW1zLmdldFZhbHVlcygpKQogICAgbG9nZ2VyLmVycm9yKCdTY29wZXM6ICcgKyB1c2VySW5mb0NsYWltcy5nZXRDb21wb3NpdGVTY29wZXMoKSkKICAgICovCgogICAgcmV0dXJuIHVzZXJJbmZvQ2xhaW1zOwp9KCkpOwo=\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"OIDC_CLAIMS\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"2c38c998-aec0-4e56-8d46-bff6e24a704e\",\"name\":\"My Example Library\",\"description\":\"My Example Library\",\"script\":\"dmFyIGkgPSAwOwoKZnVuY3Rpb24gYWRkKGopIHtpICs9IGp9OwpmdW5jdGlvbiBsb2dUb3RhbChsb2cpIHsgbG9nLmluZm8oIlRvdGFsOiAiICsgaSkgfTsKCi8vIGV4cG9ydCBjb25zdGFudApleHBvcnRzLk1TRyA9ICdGaW5hbCBzdW0nOwoKLy8gZXhwb3J0IGZ1bmN0aW9ucwpleHBvcnRzLmFkZCA9IGFkZDsKZXhwb3J0cy5sb2dUb3RhbCA9IGxvZ1RvdGFsOwoKLy9kaXJlY3QgZXhwb3J0IHVzaW5nIGFuIGlubGluZSBkZWNsYXJhdGlvbgpleHBvcnRzLmxvZ1RvdGFsV2l0aE1lc3NhZ2UgPSAobG9nLCBtZXNzYWdlKSA9PiBsb2cuaW5mbyhtZXNzYWdlICsgIjogIiArIGkpOw==\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"LIBRARY\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"2.0\"},{\"_id\":\"647f2a33-9211-4315-a83f-a521d8b77d7b\",\"name\":\"Okta Profile Normalization - imported (2)\",\"description\":\"Normalizes raw profile data from GitHub\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjIgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCmxvZ2dlci53YXJuaW5nKCJPa3RhIHJhd1Byb2ZpbGU6ICIrcmF3UHJvZmlsZSkKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLmlkKSwKICAgICAgICBmaWVsZCgiZGlzcGxheU5hbWUiLCByYXdQcm9maWxlLm5hbWUpLAogICAgICAgIGZpZWxkKCJnaXZlbk5hbWUiLCByYXdQcm9maWxlLmZpcnN0X25hbWUpLAogICAgICAgIGZpZWxkKCJmYW1pbHlOYW1lIiwgcmF3UHJvZmlsZS5sYXN0X25hbWUpLAogICAgICAgIGZpZWxkKCJwaG90b1VybCIsIHJhd1Byb2ZpbGUucGljdHVyZS5kYXRhLnVybCksCiAgICAgICAgZmllbGQoImVtYWlsIiwgcmF3UHJvZmlsZS5lbWFpbCksCiAgICAgICAgZmllbGQoInVzZXJuYW1lIiwgcmF3UHJvZmlsZS5wcmVmZXJyZWRfdXNlcm5hbWUpKSk=\",\"default\":false,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"cf3515f0-8278-4ee3-a530-1bad7424c416\",\"name\":\"Alpha OIDC Claims Script\",\"description\":\"Default alpha realm script for OIDC claims\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMTQtMjAyMSBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUwogKiBvciB3aXRoIG9uZSBvZiBpdHMgYWZmaWxpYXRlcy4gQWxsIHVzZSBzaGFsbCBiZSBleGNsdXNpdmVseSBzdWJqZWN0CiAqIHRvIHN1Y2ggbGljZW5zZSBiZXR3ZWVuIHRoZSBsaWNlbnNlZSBhbmQgRm9yZ2VSb2NrIEFTLgogKi8KCi8qCiAqIFRoaXMgc2NyaXB0IGNvbXB1dGVzIGNsYWltIHZhbHVlcyByZXR1cm5lZCBpbiBJRCB0b2tlbnMgYW5kL29yIGF0IHRoZSBVc2VySW5mbyBFbmRwb2ludC4KICogVGhlIGNsYWltIHZhbHVlcyBhcmUgY29tcHV0ZWQgZm9yOgogKiB0aGUgY2xhaW1zIGRlcml2ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHNjb3BlcywKICogdGhlIGNsYWltcyBwcm92aWRlZCBieSB0aGUgYXV0aG9yaXphdGlvbiBzZXJ2ZXIsCiAqIGFuZCB0aGUgY2xhaW1zIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50IHZpYSB0aGUgY2xhaW1zIHBhcmFtZXRlci4KICoKICogSW4gdGhlIENPTkZJR1VSQVRJT04gQU5EIENVU1RPTUlaQVRJT04gc2VjdGlvbiwgeW91IGNhbgogKiBkZWZpbmUgdGhlIHNjb3BlLXRvLWNsYWltcyBtYXBwaW5nLCBhbmQKICogYXNzaWduIHRvIGVhY2ggY2xhaW0gYSByZXNvbHZlciBmdW5jdGlvbiB0aGF0IHdpbGwgY29tcHV0ZSB0aGUgY2xhaW0gdmFsdWUuCiAqCiAqIERlZmluZWQgdmFyaWFibGVzIChjbGFzcyByZWZlcmVuY2VzIGFyZSBwcm92aWRlZCBiZWxvdyk6CiAqIHNjb3BlcyAtIFNldDxTdHJpbmc+ICg2KS4KICogICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSByZXF1ZXN0ZWQgc2NvcGVzLgogKiBjbGFpbXMgLSBNYXA8U3RyaW5nLCBPYmplY3Q+ICg1KS4KICogICAgICAgICAgQWx3YXlzIHByZXNlbnQsIGRlZmF1bHQgc2VydmVyIHByb3ZpZGVkIGNsYWltcy4KICogY2xhaW1PYmplY3RzIC0gTGlzdDxDbGFpbT4gKDcsIDIpLgogKiAgICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIGRlZmF1bHQgc2VydmVyIHByb3ZpZGVkIGNsYWltcy4KICogcmVxdWVzdGVkQ2xhaW1zIC0gTWFwPFN0cmluZywgU2V0PFN0cmluZz4+ICg1KS4KICogICAgICAgICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIG5vdCBlbXB0eSBpZiB0aGUgcmVxdWVzdCBjb250YWlucyB0aGUgY2xhaW1zIHBhcmFtZXRlciBhbmQgdGhlIHNlcnZlciBoYXMgZW5hYmxlZAogKiAgICAgICAgICAgICAgICAgICBjbGFpbXNfcGFyYW1ldGVyX3N1cHBvcnRlZC4gQSBtYXAgb2YgdGhlIHJlcXVlc3RlZCBjbGFpbXMgdG8gcG9zc2libGUgdmFsdWVzLCBvdGhlcndpc2UgZW1wdHk7CiAqICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBjbGFpbXMgd2l0aCBubyByZXF1ZXN0ZWQgdmFsdWVzIHdpbGwgaGF2ZSBhIGtleSBidXQgbm8gdmFsdWUgaW4gdGhlIG1hcC4gQSBrZXkgd2l0aAogKiAgICAgICAgICAgICAgICAgICBhIHNpbmdsZSB2YWx1ZSBpbiBpdHMgU2V0ICg2KSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiByZXF1ZXN0ZWRUeXBlZENsYWltcyAtIExpc3Q8Q2xhaW0+ICg3LCAyKS4KICogICAgICAgICAgICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIHJlcXVlc3RlZCBjbGFpbXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdGVkIGNsYWltcyB3aXRoIG5vIHJlcXVlc3RlZCB2YWx1ZXMgd2lsbCBoYXZlIGEgY2xhaW0gd2l0aCBubyB2YWx1ZXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgQSBjbGFpbSB3aXRoIGEgc2luZ2xlIHZhbHVlIGluZGljYXRlcyB0aGlzIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiBjbGFpbXNMb2NhbGVzIC0gTGlzdDxTdHJpbmc+ICg3KS4KICogICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgZnJvbSB0aGUgJ2NsYWltc19sb2NhbGVzJyBwYXJhbWV0ZXIuCiAqICAgICAgICAgICAgICAgICBTZWUgaHR0cHM6Ly9vcGVuaWQubmV0L3NwZWNzL29wZW5pZC1jb25uZWN0LWNvcmUtMV8wLmh0bWwjQ2xhaW1zTGFuZ3VhZ2VzQW5kU2NyaXB0cyBmb3IgdGhlIE9JREMgc3BlY2lmaWNhdGlvbiBkZXRhaWxzLgogKiByZXF1ZXN0UHJvcGVydGllcyAtIFVubW9kaWZpYWJsZSBNYXAgKDUpLgogKiAgICAgICAgICAgICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCBjb250YWlucyBhIG1hcCBvZiByZXF1ZXN0IHByb3BlcnRpZXM6CiAqICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVyaSAtIFRoZSByZXF1ZXN0IFVSSS4KICogICAgICAgICAgICAgICAgICAgICByZWFsbSAtIFRoZSByZWFsbSB0aGF0IHRoZSByZXF1ZXN0IHJlbGF0ZXMgdG8uCiAqICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhcmFtcyAtIEEgbWFwIG9mIHRoZSByZXF1ZXN0IHBhcmFtcyBhbmQvb3IgcG9zdGVkIGRhdGEuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVhY2ggdmFsdWUgaXMgYSBsaXN0IG9mIG9uZSBvciBtb3JlIHByb3BlcnRpZXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBub3RlIHRoYXQgdGhlc2Ugc2hvdWxkIGJlIGhhbmRsZWQgaW4gYWNjb3JkYW5jZSB3aXRoIE9XQVNQIGJlc3QgcHJhY3RpY2VzOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL293YXNwLm9yZy93d3ctY29tbXVuaXR5L3Z1bG5lcmFiaWxpdGllcy9VbnNhZmVfdXNlX29mX1JlZmxlY3Rpb24uCiAqIGNsaWVudFByb3BlcnRpZXMgLSBVbm1vZGlmaWFibGUgTWFwICg1KS4KICogICAgICAgICAgICAgICAgICAgIFByZXNlbnQgaWYgdGhlIGNsaWVudCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIGlkZW50aWZpZWQsIGNvbnRhaW5zIGEgbWFwIG9mIGNsaWVudCBwcm9wZXJ0aWVzOgogKiAgICAgICAgICAgICAgICAgICAgY2xpZW50SWQgLSBUaGUgY2xpZW50J3MgVVJJIGZvciB0aGUgcmVxdWVzdCBsb2NhbGUuCiAqICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JhbnRUeXBlcyAtIExpc3Qgb2YgdGhlIGFsbG93ZWQgZ3JhbnQgdHlwZXMgKG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuR3JhbnRUeXBlKSBmb3IgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgIGFsbG93ZWRSZXNwb25zZVR5cGVzIC0gTGlzdCBvZiB0aGUgYWxsb3dlZCByZXNwb25zZSB0eXBlcyBmb3IgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgIGFsbG93ZWRTY29wZXMgLSBMaXN0IG9mIHRoZSBhbGxvd2VkIHNjb3BlcyBmb3IgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgIGN1c3RvbVByb3BlcnRpZXMgLSBBIG1hcCBvZiB0aGUgY3VzdG9tIHByb3BlcnRpZXMgb2YgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0cyBvciBtYXBzIHdpbGwgYmUgaW5jbHVkZWQgYXMgc3ViLW1hcHM7IGZvciBleGFtcGxlOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbU1hcFtLZXkxXT1WYWx1ZTEgd2lsbCBiZSByZXR1cm5lZCBhcyBjdXN0b21NYXAgLT4gS2V5MSAtPiBWYWx1ZTEuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gYWRkIGN1c3RvbSBwcm9wZXJ0aWVzIHRvIGEgY2xpZW50LCB1cGRhdGUgdGhlIEN1c3RvbSBQcm9wZXJ0aWVzIGZpZWxkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQU0gQ29uc29sZSA+IFJlYWxtIE5hbWUgPiBBcHBsaWNhdGlvbnMgPiBPQXV0aCAyLjAgPiBDbGllbnRzID4gQ2xpZW50IElEID4gQWR2YW5jZWQuCiAqIGlkZW50aXR5IC0gQU1JZGVudGl0eSAoMykuCiAqICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBpZGVudGl0eSBvZiB0aGUgcmVzb3VyY2Ugb3duZXIuCiAqIHNlc3Npb24gLSBTU09Ub2tlbiAoNCkuCiAqICAgICAgICAgICBQcmVzZW50IGlmIHRoZSByZXF1ZXN0IGNvbnRhaW5zIHRoZSBzZXNzaW9uIGNvb2tpZSwgdGhlIHVzZXIncyBzZXNzaW9uIG9iamVjdC4KICogc2NyaXB0TmFtZSAtIFN0cmluZyAocHJpbWl0aXZlKS4KICogICAgICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzY3JpcHQuCiAqIGxvZ2dlciAtIEFsd2F5cyBwcmVzZW50LCB0aGUgIk9BdXRoMlByb3ZpZGVyIiBkZWJ1ZyBsb2dnZXIgaW5zdGFuY2U6CiAqICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuaHRtbCNzY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuCiAqICAgICAgICAgIENvcnJlc3BvbmRpbmcgZmlsZXMgd2lsbCBiZSBwcmVmaXhlZCB3aXRoOiBzY3JpcHRzLk9JRENfQ0xBSU1TLgogKiBodHRwQ2xpZW50IC0gSFRUUCBDbGllbnQgKDgpLgogKiAgICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBIVFRQIENsaWVudCBpbnN0YW5jZToKICogICAgICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHRpbmctYXBpLWdsb2JhbC1odHRwLWNsaWVudC5odG1sI3NjcmlwdGluZy1hcGktZ2xvYmFsLWh0dHAtY2xpZW50LgogKiAgICAgICAgICAgICAgSW4gb3JkZXIgdG8gdXNlIHRoZSBjbGllbnQsIHlvdSBtYXkgbmVlZCB0byBhZGQKICogICAgICAgICAgICAgIG9yZy5mb3JnZXJvY2suaHR0cC5DbGllbnQsCiAqICAgICAgICAgICAgICBvcmcuZm9yZ2Vyb2NrLmh0dHAucHJvdG9jb2wuKiwKICogICAgICAgICAgICAgIGFuZCBvcmcuZm9yZ2Vyb2NrLnV0aWwucHJvbWlzZS5Qcm9taXNlSW1wbAogKiAgICAgICAgICAgICAgdG8gdGhlIGFsbG93ZWQgSmF2YSBjbGFzc2VzIGluIHRoZSBzY3JpcHRpbmcgZW5naW5lIGNvbmZpZ3VyYXRpb24sIGFzIGRlc2NyaWJlZCBpbjoKICogICAgICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHQtZW5naW5lLXNlY3VyaXR5Lmh0bWwKICoKICogUmV0dXJuIC0gYSBuZXcgVXNlckluZm9DbGFpbXMoTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZXMsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gY29tcG9zaXRlU2NvcGVzKSAoMSkgb2JqZWN0LgogKiAgICAgICAgICBUaGUgcmVzdWx0IG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpbiB0aGUgc2NyaXB0IGlzIHJldHVybmVkIHRvIHRoZSBzZXJ2ZXIuCiAqICAgICAgICAgIEN1cnJlbnRseSwgdGhlIEltbWVkaWF0ZWx5IEludm9rZWQgRnVuY3Rpb24gRXhwcmVzc2lvbiAoYWxzbyBrbm93biBhcyBTZWxmLUV4ZWN1dGluZyBBbm9ueW1vdXMgRnVuY3Rpb24pCiAqICAgICAgICAgIGlzIHRoZSBsYXN0IChhbmQgb25seSkgc3RhdGVtZW50IGluIHRoaXMgc2NyaXB0LCBhbmQgaXRzIHJldHVybiB2YWx1ZSB3aWxsIGJlY29tZSB0aGUgc2NyaXB0IHJlc3VsdC4KICogICAgICAgICAgRG8gbm90IHVzZSAicmV0dXJuIHZhcmlhYmxlIiBzdGF0ZW1lbnQgb3V0c2lkZSBvZiBhIGZ1bmN0aW9uIGRlZmluaXRpb24uCiAqICAgICAgICAgIFNlZSBSRVNVTFRTIHNlY3Rpb24gZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KICoKICogQ2xhc3MgcmVmZXJlbmNlOgogKiAoMSkgVXNlckluZm9DbGFpbXMgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb2F1dGgyL2NvcmUvVXNlckluZm9DbGFpbXMuaHRtbC4KICogKDIpIENsYWltIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbCkuCiAqICAgICAgICAgQW4gaW5zdGFuY2Ugb2Ygb3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltIGhhcyBtZXRob2RzIHRvIGFjY2VzcwogKiAgICAgICAgIHRoZSBjbGFpbSBuYW1lLCByZXF1ZXN0ZWQgdmFsdWVzLCBsb2NhbGUsIGFuZCB3aGV0aGVyIHRoZSBjbGFpbSBpcyBlc3NlbnRpYWwuCiAqICgzKSBBTUlkZW50aXR5IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L2lkbS9BTUlkZW50aXR5Lmh0bWwuCiAqICg0KSBTU09Ub2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3MvY29tL2lwbGFuZXQvc3NvL1NTT1Rva2VuLmh0bWwuCiAqICg1KSBNYXAgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS91dGlsL0hhc2hNYXAuaHRtbCwKICogICAgICAgICAgIG9yIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL3V0aWwvTGlua2VkSGFzaE1hcC5odG1sLgogKiAoNikgU2V0IC0gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9IYXNoU2V0Lmh0bWwuCiAqICg3KSBMaXN0IC0gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9BcnJheUxpc3QuaHRtbC4KICogKDgpIENsaWVudCAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9odHRwL0NsaWVudC5odG1sLgoqLwoKKGZ1bmN0aW9uICgpIHsKICAgIC8vIFNFVFVQCgogICAgLyoqCiAgICAgKiBDbGFpbSBwcm9jZXNzaW5nIHV0aWxpdGllcy4KICAgICAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHJldXNhYmxlIGZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyBjbGFpbXMuCiAgICAgKiBAc2VlIENMQUlNIFBST0NFU1NJTkcgVVRJTElUSUVTIHNlY3Rpb24gZm9yIGRldGFpbHMuCiAgICAgKi8KICAgIHZhciB1dGlscyA9IGdldFV0aWxzKCk7CgogICAgLy8gQ09ORklHVVJBVElPTiBBTkQgQ1VTVE9NSVpBVElPTgoKICAgIC8qKgogICAgICogT0F1dGggMi4wIHNjb3BlIHZhbHVlcyAoc2NvcGVzKSBjYW4gYmUgdXNlZCBieSB0aGUgQ2xpZW50IHRvIHJlcXVlc3QgT0lEQyBjbGFpbXMuCiAgICAgKgogICAgICogQ2FsbCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kLCBhbmQgcGFzcyBpbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAqIGFuIG9iamVjdCB0aGF0IG1hcHMgYSBzY29wZSB2YWx1ZSB0byBhbiBhcnJheSBvZiBjbGFpbSBuYW1lcwogICAgICogdG8gc3BlY2lmeSB3aGljaCBjbGFpbXMgbmVlZCB0byBiZSBwcm9jZXNzZWQgYW5kIHJldHVybmVkIGZvciB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI1Njb3BlQ2xhaW1zfQogICAgICogZm9yIHRoZSBzY29wZSB2YWx1ZXMgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlcXVlc3QgY2xhaW1zIGFzIGRlZmluZWQgaW4gdGhlIE9JREMgc3BlY2lmaWNhdGlvbi4KICAgICAqCiAgICAgKiBCZWxvdywgZmluZCBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0aGF0IGlzIGV4cGVjdGVkIHRvIHdvcmsgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCiAgICAgKgogICAgICogQ1VTVE9NSVpBVElPTgogICAgICogWW91IGNhbiBjaG9vc2UgdGhlIGNsYWltIG5hbWVzIHJldHVybmVkIGZvciBhIHNjb3BlLgogICAgICovCiAgICB1dGlscy5zZXRTY29wZUNsYWltc01hcCh7CiAgICAgICAgcHJvZmlsZTogWwogICAgICAgICAgICAnbmFtZScsCiAgICAgICAgICAgICdmYW1pbHlfbmFtZScsCiAgICAgICAgICAgICdnaXZlbl9uYW1lJywKICAgICAgICAgICAgJ3pvbmVpbmZvJywKICAgICAgICAgICAgJ2xvY2FsZScKICAgICAgICBdLAogICAgICAgIGVtYWlsOiBbJ2VtYWlsJ10sCiAgICAgICAgYWRkcmVzczogWydhZGRyZXNzJ10sCiAgICAgICAgcGhvbmU6IFsncGhvbmVfbnVtYmVyJ10KICAgIH0pOwoKICAgIC8qKgogICAgICogSW4gdGhpcyBzY3JpcHQsIGVhY2ggY2xhaW0KICAgICAqIGRlcml2ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHNjb3BlcywKICAgICAqIHByb3ZpZGVkIGJ5IHRoZSBhdXRob3JpemF0aW9uIHNlcnZlciwgYW5kCiAgICAgKiByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCB2aWEgdGhlIGNsYWltcyBwYXJhbWV0ZXIKICAgICAqIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IGEgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGFpbSBuYW1lLgogICAgICoKICAgICAqIENhbGwgdGhpcyBjb25maWd1cmF0aW9uIG1ldGhvZCwgYW5kIHBhc3MgaW4gYXMgdGhlIGZpcnN0IGFyZ3VtZW50CiAgICAgKiBhbiBvYmplY3QgdGhhdCBtYXBzIGEgY2xhaW0gbmFtZSB0byBhIHJlc29sdmVyIGZ1bmN0aW9uLAogICAgICogd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGV4ZWN1dGVkIGZvciBlYWNoIGNsYWltIHByb2Nlc3NlZCBieSB0aGUgc2NyaXB0LgogICAgICoKICAgICAqIFRoZSBjbGFpbSByZXNvbHZlciBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgdGhlIHJlcXVlc3RlZCBjbGFpbSBpbmZvcm1hdGlvbgogICAgICogaW4gYW4gaW5zdGFuY2Ugb2Ygb3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuaWRjb25uZWN0L0NsYWltLmh0bWx9CiAgICAgKiBmb3IgZGV0YWlscyBvbiB0aGUgQ2xhaW0gY2xhc3MuCiAgICAgKgogICAgICogSWYgdGhlIGNsYWltIHJlc29sdmVyIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSwKICAgICAqIG90aGVyIHRoYW4gdW5kZWZpbmVkIG9yIG51bGwsCiAgICAgKiB0aGUgY2xhaW0gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgc2NyaXB0J3MgcmVzdWx0cy4KICAgICAqCiAgICAgKiBUaGUgQ2xhaW0gaW5zdGFuY2UgcHJvdmlkZXMgbWV0aG9kcyB0byBjaGVjawogICAgICogd2hhdCB0aGUgbmFtZSBvZiB0aGUgY2xhaW0gaXMsCiAgICAgKiB3aGljaCB2YWx1ZXMgdGhlIGNsYWltIHJlcXVlc3QgY29udGFpbnMsCiAgICAgKiB3aGV0aGVyIHRoZSBjbGFpbSBpcyBlc3NlbnRpYWwsIGFuZAogICAgICogd2hpY2ggbG9jYWxlIHRoZSBjbGFpbSBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgKiBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gY2FuIGNvbnNpZGVyIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjb21wdXRpbmcgYW5kIHJldHVybmluZyB0aGUgY2xhaW0gdmFsdWUuCiAgICAgKgogICAgICogQmVsb3csIGZpbmQgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdGhhdCBpcyBleHBlY3RlZCB0byB3b3JrIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LgogICAgICogQSByZXVzYWJsZSBmdW5jdGlvbiwgdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKFN0cmluZyBhdHRyaWJ1dGUtbmFtZSksCiAgICAgKiBpcyBjYWxsZWQgdG8gcmV0dXJuIGEgY2xhaW0gcmVzb2x2ZXIgZnVuY3Rpb24gYmFzZWQgb24gYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlLgogICAgICogQHNlZSBDTEFJTSBSRVNPTFZFUlMgc2VjdGlvbiBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIGV4YW1wbGVzLgogICAgICogRm9yIHRoZSBhZGRyZXNzIGNsYWltLCBhbiBleGFtcGxlIG9mIGEgY2xhaW0gcmVzb2x2ZXIgdGhhdCB1c2VzIGFub3RoZXIgY2xhaW0gcmVzb2x2ZXIgaXMgcHJvdmlkZWQuCiAgICAgKgogICAgICogQ1VTVE9NSVpBVElPTgogICAgICogWW91IGNhbiByZXVzZSB0aGUgcHJlZGVmaW5lZCB1dGlscyBtZXRob2RzIHdpdGggeW91ciBjdXN0b20gYXJndW1lbnRzLgogICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBjdXN0b20gcmVzb2x2ZXIgZnVuY3Rpb24gZm9yIGEgY2xhaW0gbmFtZSwKICAgICAqIHRoYXQgd2lsbCBjb21wdXRlIGFuZCByZXR1cm4gdGhlIGNsYWltIHZhbHVl4oCUYXMgc2hvd24gaW4gdGhlIGNvbW1lbnRlZCBvdXQgZXhhbXBsZSBiZWxvdy4KICAgICAqLwogICAgdXRpbHMuc2V0Q2xhaW1SZXNvbHZlcnMoewogICAgICAgIC8qCiAgICAgICAgLy8gQW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBjbGFpbSByZXNvbHZlciBmdW5jdGlvbiB0aGF0IGlzIGRlZmluZWQgZm9yIGEgY2xhaW0KICAgICAgICAvLyBkaXJlY3RseSBpbiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3Q6CiAgICAgICAgY3VzdG9tLWNsYWltLW5hbWU6IGZ1bmN0aW9uIChyZXF1ZXN0ZWRDbGFpbSkgewogICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGluaXRpYWxseSwgdGhlIGNsYWltIHZhbHVlIGNvbWVzIHN0cmFpZ2h0IGZyb20gYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlOgogICAgICAgICAgICB2YXIgY2xhaW1WYWx1ZSA9IGlkZW50aXR5LmdldEF0dHJpYnV0ZSgnY3VzdG9tLWF0dHJpYnV0ZS1uYW1lJykudG9BcnJheSgpWzBdCgogICAgICAgICAgICAvLyBPcHRpb25hbGx5LCBwcm92aWRlIGFkZGl0aW9uYWwgbG9naWMgZm9yIHByb2Nlc3NpbmcgKGZpbHRlcmluZywgZm9ybWF0dGluZywgZXRjLikgdGhlIGNsYWltIHZhbHVlLgogICAgICAgICAgICAvLyBZb3UgY2FuIHVzZToKICAgICAgICAgICAgLy8gcmVxdWVzdGVkQ2xhaW0uZ2V0TmFtZSgpCiAgICAgICAgICAgIC8vIHJlcXVlc3RlZENsYWltLmdldFZhbHVlcygpCiAgICAgICAgICAgIC8vIHJlcXVlc3RlZENsYWltLmdldExvY2FsZSgpCiAgICAgICAgICAgIC8vIHJlcXVlc3RlZENsYWltLmlzRXNzZW50aWFsKCkKCiAgICAgICAgICAgIHJldHVybiBjbGFpbVZhbHVlCiAgICAgICAgfSwKICAgICAgICAqLwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB1c2Ugb2YgdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyIHNob3dzIGhvdwogICAgICAgICAqIGFuIGFyZ3VtZW50IHBhc3NlZCB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYWltIHJlc29sdmVyCiAgICAgICAgICogYmVjb21lcyBhdmFpbGFibGUgdG8gdGhlIHJlc29sdmVyIGZ1bmN0aW9uICh2aWEgaXRzIGxleGljYWwgY29udGV4dCkuCiAgICAgICAgICovCiAgICAgICAgbmFtZTogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdjbicpLAogICAgICAgIGZhbWlseV9uYW1lOiB1dGlscy5nZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXIoJ3NuJyksCiAgICAgICAgZ2l2ZW5fbmFtZTogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdnaXZlbm5hbWUnKSwKICAgICAgICB6b25laW5mbzogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdwcmVmZXJyZWR0aW1lem9uZScpLAogICAgICAgIGxvY2FsZTogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdwcmVmZXJyZWRsb2NhbGUnKSwKICAgICAgICBlbWFpbDogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdtYWlsJyksCiAgICAgICAgYWRkcmVzczogdXRpbHMuZ2V0QWRkcmVzc0NsYWltUmVzb2x2ZXIoCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgcGFzc2VkIGluIHVzZXIgcHJvZmlsZSBjbGFpbSByZXNvbHZlciBmdW5jdGlvbgogICAgICAgICAgICAgKiBjYW4gYmUgdXNlZCBieSB0aGUgYWRkcmVzcyBjbGFpbSByZXNvbHZlciBmdW5jdGlvbgogICAgICAgICAgICAgKiB0byBvYnRhaW4gdGhlIGNsYWltIHZhbHVlIHRvIGJlIGZvcm1hdHRlZCBhcyBwZXIgdGhlIE9JREMgc3BlY2lmaWNhdGlvbjoKICAgICAgICAgICAgICogQHNlZSBodHRwczovL29wZW5pZC5uZXQvc3BlY3Mvb3BlbmlkLWNvbm5lY3QtY29yZS0xXzAuaHRtbCNBZGRyZXNzQ2xhaW0uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB1dGlscy5nZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXIoJ3Bvc3RhbGFkZHJlc3MnKQogICAgICAgICksCiAgICAgICAgcGhvbmVfbnVtYmVyOiB1dGlscy5nZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXIoJ3RlbGVwaG9uZW51bWJlcicpCiAgICB9KTsKCiAgICAvLyBDTEFJTSBQUk9DRVNTSU5HIFVUSUxJVElFUwoKICAgIC8qKgogICAgICogQHJldHVybnMge29iamVjdH0gQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgcmV1c2FibGUgY2xhaW0gcHJvY2Vzc2luZyB1dGlsaXRpZXMuCiAgICAgKiBAc2VlIFBVQkxJQyBNRVRIT0RTIHNlY3Rpb24gYW5kIHRoZSByZXR1cm4gc3RhdGVtZW50IGZvciB0aGUgbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFV0aWxzICgpIHsKICAgICAgICAvLyBJTVBPUlQgSkFWQQoKICAgICAgICAvKioKICAgICAgICAgKiBQcm92aWRlcyBKYXZhIHNjcmlwdGluZyBmdW5jdGlvbmFsaXR5LgogICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvTW96aWxsYS9Qcm9qZWN0cy9SaGluby9TY3JpcHRpbmdfSmF2YSNqYXZhaW1wb3J0ZXJfY29uc3RydWN0b3J9LgogICAgICAgICAqLwogICAgICAgIHZhciBmckphdmEgPSBKYXZhSW1wb3J0ZXIoCiAgICAgICAgICAgIG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiwKICAgICAgICAgICAgb3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5Vc2VySW5mb0NsYWltcywKICAgICAgICAgICAgb3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltLAoKICAgICAgICAgICAgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAsCiAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QKICAgICAgICApOwoKICAgICAgICAvLyBTRVQgVVAgQ09ORklHVVJBVElPTgoKICAgICAgICAvKioKICAgICAgICAgKiBQbGFjZWhvbGRlciBmb3IgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB0aGF0IGNvbnRhaW5zCiAgICAgICAgICogYW4gb2JqZWN0IHRoYXQgbWFwcyB0aGUgc3VwcG9ydGVkIHNjb3BlIHZhbHVlcyAoc2NvcGVzKQogICAgICAgICAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjbGFpbSBuYW1lcyBmb3IgZWFjaCBzY29wZSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB2YXIgc2NvcGVDbGFpbXNNYXA7CgogICAgICAgIC8qKgogICAgICAgICAqIFBsYWNlaG9sZGVyIGZvciBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRoYXQgY29udGFpbnMKICAgICAgICAgKiBhbiBvYmplY3QgdGhhdCBtYXBzIHRoZSBzdXBwb3J0ZWQgY2xhaW0gbmFtZXMKICAgICAgICAgKiBhbmQgdGhlIHJlc29sdmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdGhlIGNsYWltIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIHZhciBjbGFpbVJlc29sdmVyczsKCiAgICAgICAgLyoqCiAgICAgICAgICogQSAocHVibGljKSBtZXRob2QgdGhhdCBhY2NlcHRzIGFuIG9iamVjdCB0aGF0IG1hcHMgdGhlIHN1cHBvcnRlZCBzY29wZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYWltIG5hbWVzLAogICAgICAgICAqIGFuZCBhc3NpZ25zIGl0IHRvIGEgKHByaXZhdGUpIHZhcmlhYmxlIHRoYXQgc2VydmVzIGFzIGEgY29uZmlndXJhdGlvbiBvcHRpb24uCiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyAtIEFuIG9iamVjdCB0aGF0IG1hcHMgZWFjaCBzdXBwb3J0ZWQgc2NvcGUgdmFsdWUgdG8gYW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMsCiAgICAgICAgICogaW4gb3JkZXIgdG8gc3BlY2lmeSB3aGljaCBjbGFpbXMgbmVlZCB0byBiZSBwcm9jZXNzZWQgZm9yIHRoZSByZXF1ZXN0ZWQgc2NvcGVzLgogICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI1Njb3BlQ2xhaW1zfSBmb3IgZGV0YWlscy4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcGFyYW1zLnByb2ZpbGVdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIHByb2ZpbGUgc2NvcGUgaXMgcmVxdWVzdGVkLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtwYXJhbXMuZW1haWxdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIGVtYWlsIHNjb3BlIGlzIHJlcXVlc3RlZC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcGFyYW1zLmFkZHJlc3NdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIGFkZHJlc3Mgc2NvcGUgaXMgcmVxdWVzdGVkLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtwYXJhbXMucGhvbmVdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIHBob25lIHNjb3BlIGlzIHJlcXVlc3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNldFNjb3BlQ2xhaW1zTWFwKHBhcmFtcykgewogICAgICAgICAgICBzY29wZUNsYWltc01hcCA9IHBhcmFtczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEEgKHB1YmxpYykgbWV0aG9kIHRoYXQgYWNjZXB0cyBhbiBvYmplY3QgdGhhdCBtYXBzIHRoZSBzdXBwb3J0ZWQgY2xhaW0gbmFtZXMKICAgICAgICAgKiBhbmQgdGhlIHJlc29sdmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdGhlIGNsYWltIHZhbHVlLAogICAgICAgICAqIGFuZCBhc3NpZ25zIGl0IHRvIGEgKHByaXZhdGUpIHZhcmlhYmxlIHRoYXQgc2VydmVzIGFzIGEgY29uZmlndXJhdGlvbiBvcHRpb24uCiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyAtIEFuIG9iamVjdCB0aGF0IG1hcHMKICAgICAgICAgKiBlYWNoIHN1cHBvcnRlZCBjbGFpbSBuYW1lIHRvIGEgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgY2xhaW0gdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc2V0Q2xhaW1SZXNvbHZlcnMocGFyYW1zKSB7CiAgICAgICAgICAgIGNsYWltUmVzb2x2ZXJzID0gcGFyYW1zOwogICAgICAgIH0KCiAgICAgICAgLy8gQ0xBSU0gUkVTT0xWRVJTCgogICAgICAgIC8qKgogICAgICAgICAqIENsYWltIHJlc29sdmVycyBhcmUgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGEgY2xhaW0gdmFsdWUuCiAgICAgICAgICogQHBhcmFtIHsqfQogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGEgY2xhaW0gcmVzb2x2ZXIgYmFzZWQgb24gYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gTmFtZSBvZiB0aGUgdXNlciBwcm9maWxlIGF0dHJpYnV0ZS4KICAgICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGRldGVybWluZSB0aGUgY2xhaW0gdmFsdWUKICAgICAgICAgKiBiYXNlZCBvbiB0aGUgdXNlciBwcm9maWxlIGF0dHJpYnV0ZSBhbmQgdGhlIChyZXF1ZXN0ZWQpIGNsYWltIHByb3BlcnRpZXMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyIChhdHRyaWJ1dGVOYW1lKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZXNvbHZlcyBhIGNsYWltIHdpdGggYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlLgogICAgICAgICAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgaWRlbnRpdHkgYXR0cmlidXRlIGlzIG5vdCBwb3B1bGF0ZWQsCiAgICAgICAgICAgICAqIE9SIGlmIHRoZSBjbGFpbSBoYXMgcmVxdWVzdGVkIHZhbHVlcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZSBpZGVudGl0eSBhdHRyaWJ1dGUgdmFsdWUuCiAgICAgICAgICAgICAqIEFUVEVOVElPTjogdGhlIGFmb3JlbWVudGlvbmVkIGNvbXBhcmlzb24gaXMgY2FzZS1zZW5zaXRpdmUuCiAgICAgICAgICAgICAqIEBwYXJhbSB7b3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltfSBjbGFpbQogICAgICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG9idGFpbiBpbmZvcm1hdGlvbi9yZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhaW0uCiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuaWRjb25uZWN0L0NsYWltLmh0bWx9IGZvciBkZXRhaWxzLgogICAgICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfEhhc2hTZXR8dW5kZWZpbmVkfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZUNsYWltKGNsYWltKSB7CiAgICAgICAgICAgICAgICB2YXIgdXNlclByb2ZpbGVWYWx1ZTsKCiAgICAgICAgICAgICAgICBpZiAoaWRlbnRpdHkpIHsKICAgICAgICAgICAgICAgICAgICB1c2VyUHJvZmlsZVZhbHVlID0gZ2V0Q2xhaW1WYWx1ZUZyb21TZXQoY2xhaW0sIGlkZW50aXR5LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSk7CgogICAgICAgICAgICAgICAgICAgIGlmICh1c2VyUHJvZmlsZVZhbHVlICYmICF1c2VyUHJvZmlsZVZhbHVlLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsYWltLmdldFZhbHVlcygpIHx8IGNsYWltLmdldFZhbHVlcygpLmlzRW1wdHkoKSB8fCBjbGFpbS5nZXRWYWx1ZXMoKS5jb250YWlucyh1c2VyUHJvZmlsZVZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJQcm9maWxlVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhaW07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGFkZHJlc3MgY2xhaW0gcmVzb2x2ZXIgYmFzZWQgb24gYSBjbGFpbSB2YWx1ZSBvYnRhaW5lZCB3aXRoIGFub3RoZXIgY2xhaW0gcmVzb2x2ZXIuCiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZUNsYWltIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBjbGFpbSB2YWx1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGFjY2VwdCBhIGNsYWltIGFzIGFuIGFyZ3VtZW50LAogICAgICAgICAqIHJ1biB0aGUgY2xhaW0gcmVzb2x2ZXIgZnVuY3Rpb24gZm9yIHRoZSBjbGFpbSBhbmQgb2J0YWluIHRoZSBjbGFpbSB2YWx1ZSwKICAgICAgICAgKiBhbmQgYXBwbHkgYWRkaXRpb25hbCBmb3JtYXR0aW5nIHRvIHRoZSB2YWx1ZSBiZWZvcmUgcmV0dXJuaW5nIGl0LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldEFkZHJlc3NDbGFpbVJlc29sdmVyIChyZXNvbHZlQ2xhaW0pIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENyZWF0ZXMgYW4gYWRkcmVzcyBjbGFpbSBvYmplY3QgZnJvbSBhIHZhbHVlIHJldHVybmVkIGJ5IGEgY2xhaW0gcmVzb2x2ZXIsCiAgICAgICAgICAgICAqIGFuZCByZXR1cm5zIHRoZSBhZGRyZXNzIGNsYWltIG9iamVjdCBhcyB0aGUgY2xhaW0gdmFsdWUuCiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI0FkZHJlc3NDbGFpbX0uCiAgICAgICAgICAgICAqIFRoZSBjbGFpbSB2YWx1ZSBpcyBvYnRhaW5lZCB3aXRoIGEgY2xhaW0gcmVzb2x2aW5nIGZ1bmN0aW9uIGF2YWlsYWJsZSBmcm9tIHRoZSBjbG9zdXJlLgogICAgICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBvYnRhaW4gaW5mb3JtYXRpb24vcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIGNsYWltLgogICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmlkY29ubmVjdC9DbGFpbS5odG1sfSBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICogQHJldHVybnMge2phdmEudXRpbC5MaW5rZWRIYXNoTWFwfHVuZGVmaW5lZH0gVGhlIGFkZHJlc3MgY2xhaW0gb2JqZWN0IGNyZWF0ZWQgZnJvbSBhIGNsYWltIHZhbHVlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZUFkZHJlc3NDbGFpbShjbGFpbSkgewogICAgICAgICAgICAgICAgdmFyIGNsYWltVmFsdWUgPSByZXNvbHZlQ2xhaW0oY2xhaW0pOwogICAgICAgICAgICAgICAgdmFyIGFkZHJlc3NPYmplY3Q7CgogICAgICAgICAgICAgICAgaWYgKGlzQ2xhaW1WYWx1ZVZhbGlkKGNsYWltVmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgYWRkcmVzc09iamVjdCA9IG5ldyBmckphdmEuTGlua2VkSGFzaE1hcCgpOwoKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzT2JqZWN0LnB1dCgnZm9ybWF0dGVkJywgY2xhaW1WYWx1ZSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRyZXNzT2JqZWN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFkZHJlc3NDbGFpbTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gZXNzZW50aWFsIGNsYWltIHJlc29sdmVyIGJhc2VkIG9uIGEgY2xhaW0gdmFsdWUgb2J0YWluZWQgd2l0aCBhbm90aGVyIGNsYWltIHJlc29sdmVyLgogICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlc29sdmVDbGFpbSAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgY2xhaW0gdmFsdWUuCiAgICAgICAgICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBhY2NlcHQgYSBjbGFpbSBhcyBhbiBhcmd1bWVudCwKICAgICAgICAgKiBydW4gdGhlIGNsYWltIHJlc29sdmVyIGZ1bmN0aW9uIGZvciB0aGUgY2xhaW0gYW5kIG9idGFpbiB0aGUgY2xhaW0gdmFsdWUsCiAgICAgICAgICogYW5kIGFwcGx5IGFkZGl0aW9uYWwgbG9naWMgZm9yIGVzc2VudGlhbCBjbGFpbXMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0RXNzZW50aWFsQ2xhaW1SZXNvbHZlciAocmVzb2x2ZUNsYWltKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZXR1cm5zIGEgY2xhaW0gdmFsdWUgb3IgdGhyb3dzIGFuIGVycm9yLgogICAgICAgICAgICAgKiBUaGUgY2xhaW0gdmFsdWUgaXMgb2J0YWluZWQgd2l0aCBhIGNsYWltIHJlc29sdmluZyBmdW5jdGlvbiBhdmFpbGFibGUgZnJvbSB0aGUgY2xvc3VyZS4KICAgICAgICAgICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgY2xhaW0gaXMgZXNzZW50aWFsIGFuZCBubyB2YWx1ZSBpcyByZXR1cm5lZCBmb3IgdGhlIGNsYWltLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBVc2Ugb2YgdGhpcyByZXNvbHZlciBpcyBvcHRpb25hbC4KICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9vcGVuaWQubmV0L3NwZWNzL29wZW5pZC1jb25uZWN0LWNvcmUtMV8wLmh0bWwjSW5kaXZpZHVhbENsYWltc1JlcXVlc3RzfSBzdGF0aW5nOgogICAgICAgICAgICAgKiAiTm90ZSB0aGF0IGV2ZW4gaWYgdGhlIENsYWltcyBhcmUgbm90IGF2YWlsYWJsZSBiZWNhdXNlIHRoZSBFbmQtVXNlciBkaWQgbm90IGF1dGhvcml6ZSB0aGVpciByZWxlYXNlIG9yIHRoZXkgYXJlIG5vdCBwcmVzZW50LAogICAgICAgICAgICAgKiB0aGUgQXV0aG9yaXphdGlvbiBTZXJ2ZXIgTVVTVCBOT1QgZ2VuZXJhdGUgYW4gZXJyb3Igd2hlbiBDbGFpbXMgYXJlIG5vdCByZXR1cm5lZCwgd2hldGhlciB0aGV5IGFyZSBFc3NlbnRpYWwgb3IgVm9sdW50YXJ5LAogICAgICAgICAgICAgKiB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNwZWNpZmljIGNsYWltLiIKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtvcmcuZm9yZ2Vyb2NrLm9wZW5pZGNvbm5lY3QuQ2xhaW19IGNsYWltCiAgICAgICAgICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgdG8gb2J0YWluIGluZm9ybWF0aW9uL3JlcXVpcmVtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBjbGFpbS4KICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbH0gZm9yIGRldGFpbHMuCiAgICAgICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAgICAgKiBAdGhyb3dzIHtvcmcuZm9yZ2Vyb2NrLm9hdXRoMi5jb3JlLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb259CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiByZXNvbHZlRXNzZW50aWFsQ2xhaW0oY2xhaW0pIHsKICAgICAgICAgICAgICAgIHZhciBjbGFpbVZhbHVlID0gcmVzb2x2ZUNsYWltKGNsYWltKTsKCiAgICAgICAgICAgICAgICBpZiAoY2xhaW0uaXNFc3NlbnRpYWwoKSAmJiAhaXNDbGFpbVZhbHVlVmFsaWQoY2xhaW1WYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZnJKYXZhLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCdDb3VsZCBub3QgcHJvdmlkZSB2YWx1ZSBmb3IgZXNzZW50aWFsIGNsYWltOiAnICsgY2xhaW0uZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1WYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVFc3NlbnRpYWxDbGFpbTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGRlZmF1bHQgcmVzb2x1dGlvbiBmb3IgYSBjbGFpbS4KICAgICAgICAgKiBVc2UgaXQgaWYgYSBjbGFpbS1zcGVjaWZpYyByZXNvbHZlciBpcyBub3QgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG9idGFpbiBpbmZvcm1hdGlvbi9yZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhaW0uCiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbH0gZm9yIGRldGFpbHMuCiAgICAgICAgICogQHJldHVybnMgeyp9IEEgc2luZ2xlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYWltLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHJlc29sdmVBbnlDbGFpbSAoY2xhaW0pIHsKICAgICAgICAgICAgaWYgKGNsYWltLmdldFZhbHVlcygpLnNpemUoKSA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNsYWltLmdldFZhbHVlcygpLnRvQXJyYXkoKVswXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVVRJTElUSUVTCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgY2xhaW0gdmFsdWUgZnJvbSBhIHNldC4KICAgICAgICAgKiBJZiB0aGUgc2V0IGNvbnRhaW5zIGEgc2luZ2xlIHZhbHVlLCByZXR1cm5zIHRoZSB2YWx1ZS4KICAgICAgICAgKiBJZiB0aGUgc2V0IGNvbnRhaW5zIG11bHRpcGxlIHZhbHVlcywgcmV0dXJucyB0aGUgc2V0LgogICAgICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyB1bmRlZmluZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG9idGFpbiBpbmZvcm1hdGlvbi9yZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhaW0uCiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbH0gZm9yIGRldGFpbHMuCiAgICAgICAgICogQHBhcmFtIHtqYXZhLnV0aWwuSGFzaFNldH0gc2V0IFRoZSBzZXTigJRmb3IgZXhhbXBsZSwgYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd8amF2YS51dGlsLkhhc2hTZXR8dW5kZWZpbmVkfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldENsYWltVmFsdWVGcm9tU2V0IChjbGFpbSwgc2V0KSB7CiAgICAgICAgICAgIGlmIChzZXQgJiYgc2V0LnNpemUoKSkgewogICAgICAgICAgICAgICAgaWYgKHNldC5zaXplKCkgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0LnRvQXJyYXkoKVswXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChsb2dnZXIud2FybmluZ0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ09JREMgQ2xhaW1zIHNjcmlwdC4gR290IGFuIGVtcHR5IHNldCBmb3IgY2xhaW06ICcgKyBjbGFpbS5nZXROYW1lKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBpc0NsYWltVmFsdWVWYWxpZCAoY2xhaW1WYWx1ZSkgewogICAgICAgICAgICBpZiAodHlwZW9mIGNsYWltVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IGNsYWltVmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBDTEFJTSBQUk9DRVNTSU5HCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHBvcHVsYXRlZCB3aXRoIHRoZSBjb21wdXRlZCBjbGFpbSB2YWx1ZXMKICAgICAgICAgKiBhbmQgdGhlIHJlcXVlc3RlZCBzY29wZXMgbWFwcGVkIHRvIHRoZSBjbGFpbSBuYW1lcy4KICAgICAgICAgKiBAcmV0dXJucyB7b3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5Vc2VySW5mb0NsYWltc30gVGhlIG9iamVjdCB0byBiZSByZXR1cm5lZCB0byB0aGUgYXV0aG9yaXphdGlvbiBzZXJ2ZXIuCiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29hdXRoMi9jb3JlL1VzZXJJbmZvQ2xhaW1zLmh0bWx9LgogICAgICAgICAqIEBzZWUgUkVTVUxUUyBzZWN0aW9uIGZvciB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0VXNlckluZm9DbGFpbXMgKCkgewogICAgICAgICAgICByZXR1cm4gbmV3IGZySmF2YS5Vc2VySW5mb0NsYWltcyhnZXRDb21wdXRlZENsYWltcygpLCBnZXRDb21wb3NpdGVTY29wZXMoKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbWFwIG9mIChyZXF1ZXN0ZWQpIGNsYWltIG5hbWVzIHBvcHVsYXRlZCB3aXRoIHRoZSBjb21wdXRlZCBjbGFpbSB2YWx1ZXMuCiAgICAgICAgICogQHJldHVybnMge2phdmEudXRpbC5MaW5rZWRIYXNoTWFwfQogICAgICAgICAqIEEgbWFwIG9mIHRoZSByZXF1ZXN0ZWQgY2xhaW0gbmFtZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYWltIHZhbHVlcy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRDb21wdXRlZENsYWltcyAoKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDcmVhdGVzIGEgY29tcGxldGUgbGlzdCBvZiBjbGFpbSBvYmplY3RzIGZyb206CiAgICAgICAgICAgICAqIHRoZSBjbGFpbXMgZGVyaXZlZCBmcm9tIHRoZSBzY29wZXMsCiAgICAgICAgICAgICAqIHRoZSBjbGFpbXMgcHJvdmlkZWQgYnkgdGhlIGF1dGhvcml6YXRpb24gc2VydmVyLAogICAgICAgICAgICAgKiBhbmQgdGhlIGNsYWltcyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4KICAgICAgICAgICAgICogQHJldHVybnMge2phdmEudXRpbC5BcnJheUxpc3R9CiAgICAgICAgICAgICAqIFJldHVybnMgYSBjb21wbGV0ZSBsaXN0IG9mIG9yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbSBvYmplY3RzIGF2YWlsYWJsZSB0byB0aGUgc2NyaXB0LgogICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmlkY29ubmVjdC9DbGFpbS5odG1sfSBmb3IgdGhlIGNsYWltIG9iamVjdCBkZXRhaWxzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0Q2xhaW1zKCkgewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBjbGFpbSBvYmplY3RzIGZvciB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICAgICAgICAgICAgICAgICAqIFVzZXMgdGhlIHNjb3BlQ2xhaW1zTWFwIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGRlcml2ZSB0aGUgY2xhaW0gbmFtZXM7CiAgICAgICAgICAgICAgICAgKiBubyBvdGhlciBwcm9wZXJ0aWVzIG9mIGEgY2xhaW0gZGVyaXZlZCBmcm9tIGEgc2NvcGUgYXJlIHBvcHVsYXRlZC4KICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtqYXZhLnV0aWwuQXJyYXlMaXN0fQogICAgICAgICAgICAgICAgICogQSBsaXN0IG9mIG9yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbSBvYmplY3RzIGRlcml2ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICAgICAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuaWRjb25uZWN0L0NsYWltLmh0bWx9IGZvciB0aGUgY2xhaW0gb2JqZWN0IGRldGFpbHMuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnZlcnRTY29wZVRvQ2xhaW1zKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjbGFpbXMgPSBuZXcgZnJKYXZhLkFycmF5TGlzdCgpOwoKICAgICAgICAgICAgICAgICAgICBzY29wZXMudG9BcnJheSgpLmZvckVhY2goZnVuY3Rpb24gKHNjb3BlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoc2NvcGUpICE9PSAnb3BlbmlkJyAmJiBzY29wZUNsYWltc01hcFtzY29wZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlQ2xhaW1zTWFwW3Njb3BlXS5mb3JFYWNoKGZ1bmN0aW9uIChjbGFpbU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFpbXMuYWRkKG5ldyBmckphdmEuQ2xhaW0oY2xhaW1OYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBjbGFpbXMgPSBuZXcgZnJKYXZhLkFycmF5TGlzdCgpOwoKICAgICAgICAgICAgICAgIGNsYWltcy5hZGRBbGwoY29udmVydFNjb3BlVG9DbGFpbXMoKSk7CiAgICAgICAgICAgICAgICBjbGFpbXMuYWRkQWxsKGNsYWltT2JqZWN0cyk7CiAgICAgICAgICAgICAgICBjbGFpbXMuYWRkQWxsKHJlcXVlc3RlZFR5cGVkQ2xhaW1zKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBjbGFpbSB2YWx1ZS4KICAgICAgICAgICAgICogVG8gb2J0YWluIHRoZSBjbGFpbSB2YWx1ZSwgdXNlcyB0aGUgcmVzb2x2ZXIgZnVuY3Rpb24gc3BlY2lmaWVkIGZvciB0aGUgY2xhaW0gaW4gdGhlIGNsYWltUmVzb2x2ZXJzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LgogICAgICAgICAgICAgKiBAc2VlIGNsYWltUmVzb2x2ZXJzCiAgICAgICAgICAgICAqIElmIG5vIHJlc29sdmVyIGZ1bmN0aW9uIGlzIGZvdW5kLCB1c2VzIHRoZSBkZWZhdWx0IGNsYWltIHJlc29sdmVyIGZ1bmN0aW9uLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBvYnRhaW4gaW5mb3JtYXRpb24vcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIGNsYWltLgogICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmlkY29ubmVjdC9DbGFpbS5odG1sfSBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICogQHJldHVybnMgeyp9IENsYWltIHZhbHVlLgogICAgICAgICAgICAgKiBAdGhyb3dzIHtvcmcuZm9yZ2Vyb2NrLm9hdXRoMi5jb3JlLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb259CiAgICAgICAgICAgICAqIFJldGhyb3dzIHRoaXMgZXhjZXB0aW9uIGlmIGEgY2xhaW0gcmVzb2x2ZXIgdGhyb3dzIGl0LgogICAgICAgICAgICAgKiBZb3UgY2FuIHRocm93IG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBmcm9tIHlvdXIgY3VzdG9tIGNsYWltIHJlc29sdmVyCiAgICAgICAgICAgICAqIGlmIHlvdSB3YW50IHRvIHRlcm1pbmF0ZSB0aGUgY2xhaW0gcHJvY2Vzc2luZy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXB1dGVDbGFpbShjbGFpbSkgewogICAgICAgICAgICAgICAgdmFyIHJlc29sdmVDbGFpbTsKICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNsYWltID0gY2xhaW1SZXNvbHZlcnNbY2xhaW0uZ2V0TmFtZSgpXSB8fCByZXNvbHZlQW55Q2xhaW07CgogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhaW0oY2xhaW0pOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnT0lEQyBDbGFpbXMgc2NyaXB0IGV4Y2VwdGlvbi4gVW5hYmxlIHRvIHJlc29sdmUgT0lEQyBDbGFpbS4gJyArIGU7CgogICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoZSkuaW5kZXhPZignb3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLndhcm5pbmdFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcobWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY29tcHV0ZWRDbGFpbXMgPSBuZXcgZnJKYXZhLkxpbmtlZEhhc2hNYXAoKTsKCiAgICAgICAgICAgIGdldENsYWltcygpLnRvQXJyYXkoKS5mb3JFYWNoKGZ1bmN0aW9uIChjbGFpbSkgewogICAgICAgICAgICAgICAgdmFyIGNsYWltVmFsdWUgPSBjb21wdXRlQ2xhaW0oY2xhaW0pOwoKICAgICAgICAgICAgICAgIGlmIChpc0NsYWltVmFsdWVWYWxpZChjbGFpbVZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkQ2xhaW1zLnB1dChjbGFpbS5nZXROYW1lKCksIGNsYWltVmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBJZiBhIGNsYWltIGhhcyBiZWVuIHByb2Nlc3NlZCwgYnV0IGFwcGVhcnMgaW4gdGhlIGxpc3QgYWdhaW4sCiAgICAgICAgICAgICAgICAgICAgICogYW5kIGl0cyB2YWx1ZSBjYW5ub3QgYmUgY29tcHV0ZWQgdW5kZXIgdGhlIG5ldyBjb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAqIHRoZSBjbGFpbSBpcyByZW1vdmVkIGZyb20gdGhlIGZpbmFsIHJlc3VsdC4KICAgICAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICAgICAqIEZvciBleGFtcGxlLCBhIGNsYWltIGNvdWxkIGJlIG1hcHBlZCB0byBhIHNjb3BlIGFuZCBmb3VuZCBpbiB0aGUgdXNlciBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAqIGJ1dCBhbHNvIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50IHdpdGggcmVxdWlyZWQgdmFsdWVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGNvbXB1dGVkIG9uZS4KICAgICAgICAgICAgICAgICAgICAgKiBAc2VlIHtsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI0luZGl2aWR1YWxDbGFpbXNSZXF1ZXN0c30uCiAgICAgICAgICAgICAgICAgICAgICogZm9yIHRoZSByZWxldmFudCBPSURDIHNwZWNpZmljYXRpb24gZGV0YWlscy4KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBjb21wdXRlZENsYWltcy5yZW1vdmUoY2xhaW0uZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gY29tcHV0ZWRDbGFpbXM7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbWFwIG9mIHJlcXVlc3RlZCBzY29wZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYWltIG5hbWVzLgogICAgICAgICAqIEByZXR1cm5zIHtqYXZhLnV0aWwuTGlua2VkSGFzaE1hcH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRDb21wb3NpdGVTY29wZXMgKCkgewogICAgICAgICAgICB2YXIgY29tcG9zaXRlU2NvcGVzID0gbmV3IGZySmF2YS5MaW5rZWRIYXNoTWFwKCk7CgogICAgICAgICAgICBzY29wZXMudG9BcnJheSgpLmZvckVhY2goZnVuY3Rpb24gKHNjb3BlKSB7CiAgICAgICAgICAgICAgICB2YXIgc2NvcGVDbGFpbXMgPSBuZXcgZnJKYXZhLkFycmF5TGlzdCgpOwoKICAgICAgICAgICAgICAgIGlmIChzY29wZUNsYWltc01hcFtzY29wZV0pIHsKICAgICAgICAgICAgICAgICAgICBzY29wZUNsYWltc01hcFtzY29wZV0uZm9yRWFjaChmdW5jdGlvbiAoY2xhaW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlQ2xhaW1zLmFkZChjbGFpbU5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzY29wZUNsYWltcy5zaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVTY29wZXMucHV0KHNjb3BlLCBzY29wZUNsYWltcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZVNjb3BlczsKICAgICAgICB9CgogICAgICAgIC8vIFBVQkxJQyBNRVRIT0RTCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHNldFNjb3BlQ2xhaW1zTWFwOiBzZXRTY29wZUNsYWltc01hcCwKICAgICAgICAgICAgc2V0Q2xhaW1SZXNvbHZlcnM6IHNldENsYWltUmVzb2x2ZXJzLAogICAgICAgICAgICBnZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXI6IGdldFVzZXJQcm9maWxlQ2xhaW1SZXNvbHZlciwKICAgICAgICAgICAgZ2V0QWRkcmVzc0NsYWltUmVzb2x2ZXI6IGdldEFkZHJlc3NDbGFpbVJlc29sdmVyLAogICAgICAgICAgICBnZXRFc3NlbnRpYWxDbGFpbVJlc29sdmVyOiBnZXRFc3NlbnRpYWxDbGFpbVJlc29sdmVyLAogICAgICAgICAgICBnZXRVc2VySW5mb0NsYWltczogZ2V0VXNlckluZm9DbGFpbXMKICAgICAgICB9OwogICAgfQoKICAgIC8vIFJFU1VMVFMKCiAgICAvKioKICAgICAqIFRoaXMgc2NyaXB0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuVXNlckluZm9DbGFpbXMgY2xhc3MKICAgICAqIHBvcHVsYXRlZCB3aXRoIHRoZSBjb21wdXRlZCBjbGFpbSB2YWx1ZXMgYW5kCiAgICAgKiB0aGUgcmVxdWVzdGVkIHNjb3BlcyBtYXBwZWQgdG8gdGhlIGNsYWltIG5hbWVzLgogICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29hdXRoMi9jb3JlL1VzZXJJbmZvQ2xhaW1zLmh0bWx9LgogICAgICoKICAgICAqIEFzc2lnbmluZyBpdCB0byBhIHZhcmlhYmxlIGdpdmVzIHlvdSBhbiBvcHBvcnR1bml0eQogICAgICogdG8gbG9nIHRoZSBjb250ZW50IG9mIHRoZSByZXR1cm5lZCB2YWx1ZSBkdXJpbmcgZGV2ZWxvcG1lbnQuCiAgICAgKi8KICAgIHZhciB1c2VySW5mb0NsYWltcyA9IHV0aWxzLmdldFVzZXJJbmZvQ2xhaW1zKCk7CgogICAgLyoKICAgIGxvZ2dlci5lcnJvcihzY3JpcHROYW1lICsgJyByZXN1bHRzOicpCiAgICBsb2dnZXIuZXJyb3IoJ1ZhbHVlczogJyArIHVzZXJJbmZvQ2xhaW1zLmdldFZhbHVlcygpKQogICAgbG9nZ2VyLmVycm9yKCdTY29wZXM6ICcgKyB1c2VySW5mb0NsYWltcy5nZXRDb21wb3NpdGVTY29wZXMoKSkKICAgICovCgogICAgcmV0dXJuIHVzZXJJbmZvQ2xhaW1zOwp9KCkpOwo=\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"OIDC_CLAIMS\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"312e951f-70c5-49d2-a9ae-93aef909d5df\",\"name\":\"Salesforce Profile Normalization\",\"description\":\"Normalizes raw profile data from Salesforce\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLnVzZXJfaWQpLAogICAgICAgIGZpZWxkKCJkaXNwbGF5TmFtZSIsIHJhd1Byb2ZpbGUubmFtZSksCiAgICAgICAgZmllbGQoImdpdmVuTmFtZSIsIHJhd1Byb2ZpbGUuZ2l2ZW5fbmFtZSksCiAgICAgICAgZmllbGQoImZhbWlseU5hbWUiLCByYXdQcm9maWxlLmZhbWlseV9uYW1lKSwKICAgICAgICBmaWVsZCgicGhvdG9VcmwiLCByYXdQcm9maWxlLnBpY3R1cmUpLAogICAgICAgIGZpZWxkKCJlbWFpbCIsIHJhd1Byb2ZpbGUuZW1haWwpLAogICAgICAgIGZpZWxkKCJ1c2VybmFtZSIsIHJhd1Byb2ZpbGUuZW1haWwpLAogICAgICAgIGZpZWxkKCJsb2NhbGUiLCByYXdQcm9maWxlLnpvbmVJbmZvKSkp\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"424da748-82cc-4b54-be6f-82bd64d82a74\",\"name\":\"Yahoo Profile Normalization\",\"description\":\"Normalizes raw profile data from Yahoo\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLnN1YiksCiAgICAgICAgZmllbGQoImRpc3BsYXlOYW1lIiwgcmF3UHJvZmlsZS5uYW1lKSwKICAgICAgICBmaWVsZCgiZ2l2ZW5OYW1lIiwgcmF3UHJvZmlsZS5naXZlbl9uYW1lKSwKICAgICAgICBmaWVsZCgiZmFtaWx5TmFtZSIsIHJhd1Byb2ZpbGUuZmFtaWx5X25hbWUpLAogICAgICAgIGZpZWxkKCJwaG90b1VybCIsIHJhd1Byb2ZpbGUucGljdHVyZSksCiAgICAgICAgZmllbGQoImVtYWlsIiwgcmF3UHJvZmlsZS5lbWFpbCksCiAgICAgICAgZmllbGQoInVzZXJuYW1lIiwgcmF3UHJvZmlsZS5lbWFpbCksCiAgICAgICAgZmllbGQoImxvY2FsZSIsIHJhd1Byb2ZpbGUubG9jYWxlKSkp\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"d2dc1ae7-ca1b-4ce4-81b8-5d58dfba73b1\",\"name\":\"Saml2 IDP Adapter Always Auth - imported (1)\",\"description\":\"Always redirect browser pre-auth\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjEtMjAyMiBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgovKgogKiBUaGUgc2NyaXB0IGhhcyB0aGVzZSB0b3AgbGV2ZWwgZnVuY3Rpb25zIHRoYXQgY291bGQgYmUgZXhlY3V0ZWQgZHVyaW5nIGEgU0FNTDIgZmxvdy4KICogICAgICAtIHByZVNpbmdsZVNpZ25PbgogKiAgICAgIC0gcHJlQXV0aGVudGljYXRpb24KICogICAgICAtIHByZVNlbmRSZXNwb25zZQogKiAgICAgIC0gcHJlU2lnblJlc3BvbnNlCiAqICAgICAgLSBwcmVTZW5kRmFpbHVyZVJlc3BvbnNlCiAqCiAqIFBsZWFzZSBzZWUgdGhlIGphdmFkb2MgZm9yIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBhbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBtZXRob2RzLgogKiBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4yL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9wbHVnaW5zL1NBTUwySWRlbnRpdHlQcm92aWRlckFkYXB0ZXIuaHRtbAogKiBOb3RlIHRoYXQgdGhlIGluaXRpYWxpemUgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIHNjcmlwdHMuCiAqCiAqIERlZmluZWQgdmFyaWFibGVzLiBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgcmVzcGVjdGl2ZSBmdW5jdGlvbnMgZm9yIHRoZSB2YXJpYWJsZXMgYXZhaWxhYmxlIHRvIGl0LgogKgogKiBob3N0ZWRFbnRpdHlJZCAtIFN0cmluZwogKiAgICAgRW50aXR5IElEIGZvciB0aGUgaG9zdGVkIElEUAogKiByZWFsbSAtIFN0cmluZwogKiAgICAgUmVhbG0gb2YgdGhlIGhvc3RlZCBJRFAKICogaWRwQWRhcHRlclNjcmlwdEhlbHBlciAtIElkcEFkYXB0ZXJTY3JpcHRIZWxwZXIgKDEpCiAqICAgICBBbiBpbnN0YW5jZSBvZiBJZHBBZGFwdGVyU2NyaXB0SGVscGVyIGNvbnRhaW5pbmcgaGVscGVyIG1ldGhvZHMuIFNlZSBKYXZhZG9jIGZvciBtb3JlIGRldGFpbHMuCiAqIHJlcXVlc3QgLSBIdHRwU2VydmxldFJlcXVlc3QgKDIpCiAqICAgICBTZXJ2bGV0IHJlcXVlc3Qgb2JqZWN0CiAqIHJlc3BvbnNlIC0gSHR0cFNlcnZsZXRSZXNwb25zZSAoMykKICogICAgIFNlcnZsZXQgcmVzcG9uc2Ugb2JqZWN0CiAqIGF1dGhuUmVxdWVzdCAtIEF1dGhuUmVxdWVzdCAoNCkKICogICAgIFRoZSBvcmlnaW5hbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IHNlbnQgZnJvbSBTUAogKiByZXFJZCAtIFN0cmluZwogKiAgICAgVGhlIGlkIHRvIHVzZSBmb3IgY29udGludWF0aW9uIG9mIHByb2Nlc3NpbmcgaWYgdGhlIGFkYXB0ZXIgcmVkaXJlY3RzCiAqIHJlcyAtIFJlc3BvbnNlICg1KQogKiAgICAgVGhlIFNBTUwgUmVzcG9uc2UKICogc2Vzc2lvbiAtIFNTT1Rva2VuICg2KQogKiAgICAgVGhlIHNpbmdsZSBzaWduLW9uIHNlc3Npb24uIFRoZSByZWZlcmVuY2UgdHlwZSBvZiB0aGlzIGlzIE9iamVjdCBhbmQgd291bGQgbmVlZCB0byBiZSBjYXN0ZWQgdG8gU1NPVG9rZW4uCiAqIHJlbGF5U3RhdGUgLSBTdHJpbmcKICogICAgIFRoZSByZWxheVN0YXRlIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSByZWRpcmVjdAogKiBmYXVsdENvZGUgLSBTdHJpbmcKICogICAgIHRoZSBmYXVsdCBjb2RlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgU0FNTCByZXNwb25zZQogKiBmYXVsdERldGFpbCAtIFN0cmluZwogKiAgICAgdGhlIGZhdWx0IGRldGFpbCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIFNBTUwgcmVzcG9uc2UKICogbG9nZ2VyIC0gTG9nZ2VyIGluc3RhbmNlCiAqICAgICBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9zY3JpcHRpbmctZ3VpZGUvc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLmh0bWwjc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLgogKiAgICAgQ29ycmVzcG9uZGluZyBsb2cgZmlsZXMgd2lsbCBiZSBwcmVmaXhlZCB3aXRoOiBzY3JpcHRzLjxzY3JpcHQgbmFtZT4KICoKICogVGhyb3dzIFNBTUwyRXhjZXB0aW9uICg3KToKICogICAgIGZvciBhbnkgZXhjZXB0aW9ucyBvY2N1cnJpbmcgaW4gdGhlIGFkYXB0ZXIuIFRoZSBmZWRlcmF0aW9uIHByb2Nlc3Mgd2lsbCBjb250aW51ZQogKgogKiBDbGFzcyByZWZlcmVuY2U6CiAqICgxKSBpZHBBZGFwdGVyU2NyaXB0SGVscGVyIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMi9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcGx1Z2lucy9zY3JpcHRlZC9JZHBBZGFwdGVyU2NyaXB0SGVscGVyLmh0bWwuCiAqICgyKSBIdHRwU2VydmxldFJlcXVlc3QgLSBodHRwczovL3RvbWNhdC5hcGFjaGUub3JnL3RvbWNhdC03LjAtZG9jL3NlcnZsZXRhcGkvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdC5odG1sLgogKiAoMykgSHR0cFNlcnZsZXRSZXNwb25zZSAtIGh0dHBzOi8vdG9tY2F0LmFwYWNoZS5vcmcvdG9tY2F0LTcuMC1kb2Mvc2VydmxldGFwaS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZS5odG1sLgogKiAoNCkgQXV0aG5SZXF1ZXN0IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMi9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvQXV0aG5SZXF1ZXN0Lmh0bWwuCiAqICg1KSBSZXNwb25zZSAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjIvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL3Byb3RvY29sL1Jlc3BvbnNlLmh0bWwuCiAqICg2KSBTU09Ub2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjIvYXBpZG9jcy9jb20vaXBsYW5ldC9zc28vU1NPVG9rZW4uaHRtbC4KICogKDcpIFNBTUwyRXhjZXB0aW9uIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMi9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvY29tbW9uL1NBTUwyRXhjZXB0aW9uLmh0bWwuCiAqLwoKLyoKICogVGVtcGxhdGUvZGVmYXVsdCBzY3JpcHQgZm9yIFNBTUwyIElEUCBBZGFwdGVyIHNjcmlwdGVkIHBsdWdpbi4KICovCgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwcmVTaW5nbGVTaWduT246CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIGlkcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIHJlcXVlc3QKICogICAgIGF1dGhuUmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIHJlcUlkCiAqICAgICBsb2dnZXIKICoKICogUmV0dXJuIC0gdHJ1ZSBpZiBicm93c2VyIHJlZGlyZWN0aW9uIGlzIGhhcHBlbmluZyBhZnRlciBwcm9jZXNzaW5nLCBmYWxzZSBvdGhlcndpc2UuIERlZmF1bHQgdG8gZmFsc2UuCiAqLwpmdW5jdGlvbiBwcmVTaW5nbGVTaWduT24gKCkgewogICAgICBsb2dnZXIuZXJyb3IoIkNoaWNhZ286IHByZVNpbmdsZVNpZ25PbiIpOwogICAgcmV0dXJuIHRydWU7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZUF1dGhlbnRpY2F0aW9uOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICBpZHBBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICByZXF1ZXN0CiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICByZXFJZAogKiAgICAgc2Vzc2lvbgogKiAgICAgcmVsYXlTdGF0ZQogKiAgICAgbG9nZ2VyCiAqCiAqIFJldHVybiAtIHRydWUgaWYgYnJvd3NlciByZWRpcmVjdGlvbiBpcyBoYXBwZW5pbmcgYWZ0ZXIgcHJvY2Vzc2luZywgZmFsc2Ugb3RoZXJ3aXNlLiBEZWZhdWx0IHRvIGZhbHNlLgogKi8KZnVuY3Rpb24gcHJlQXV0aGVudGljYXRpb24gKCkgewogICAgICBsb2dnZXIuZXJyb3IoIkNoaWNhZ286IHByZUF1dGhlbnRpY2F0aW9uIik7CiAgICByZXR1cm4gdHJ1ZTsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcHJlU2VuZFJlc3BvbnNlOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICBpZHBBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICByZXF1ZXN0CiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICByZXFJZAogKiAgICAgc2Vzc2lvbgogKiAgICAgcmVsYXlTdGF0ZQogKiAgICAgbG9nZ2VyCiAqCiAqIFJldHVybiAtIHRydWUgaWYgYnJvd3NlciByZWRpcmVjdGlvbiBoYXBwZW5lZCBhZnRlciBwcm9jZXNzaW5nLCBmYWxzZSBvdGhlcndpc2UuIERlZmF1bHQgdG8gZmFsc2UuCiAqLwpmdW5jdGlvbiBwcmVTZW5kUmVzcG9uc2UgKCkgewogICAgICBsb2dnZXIuZXJyb3IoIkNoaWNhZ286IHByZVNlbmRSZXNwb25zZSIpOwogICAgICBsb2dnZXIuZXJyb3IoIkNoaWNhZ286IGF1dGhuUmVxdWVzdDogIithdXRoblJlcXVlc3QpOwogICAgICByZXNwb25zZS5zZW5kUmVkaXJlY3QoImh0dHBzOi8vaWRjLnNjaGV1YmVyLmlvL2FtL1hVSS8/cmVhbG09YWxwaGEmYXV0aEluZGV4VHlwZT1zZXJ2aWNlJmF1dGhJbmRleFZhbHVlPURpc3BhdGNoZXImRm9yY2VBdXRoPXRydWUmZ290bz0iK3JlbGF5U3RhdGUpOwogICAgcmV0dXJuIHRydWU7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZVNpZ25SZXNwb25zZToKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgaWRwQWRhcHRlclNjcmlwdEhlbHBlcgogKiAgICAgcmVxdWVzdAogKiAgICAgYXV0aG5SZXF1ZXN0CiAqICAgICBzZXNzaW9uCiAqICAgICByZWxheVN0YXRlCiAqICAgICByZXMKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcHJlU2lnblJlc3BvbnNlICgpIHsKICAgICAgbG9nZ2VyLmVycm9yKCJDaGljYWdvOiBwcmVTaWduUmVzcG9uc2UiKTsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcHJlU2VuZEZhaWx1cmVSZXNwb25zZToKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgaWRwQWRhcHRlclNjcmlwdEhlbHBlcgogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIGZhdWx0Q29kZQogKiAgICAgZmF1bHREZXRhaWwKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcHJlU2VuZEZhaWx1cmVSZXNwb25zZSAoKSB7CiAgICAgIGxvZ2dlci5lcnJvcigiQ2hpY2FnbzogcHJlU2VuZEZhaWx1cmVSZXNwb25zZSIpOwp9\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"SAML2_IDP_ADAPTER\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"9535446c-0ff6-4a76-8576-616599119d64\",\"name\":\"Remove Button\",\"description\":\"Remove button from page.\",\"script\":\"LyogUmVtb3ZlIEJ1dHRvbgogKgogKiBBdXRob3I6IHZvbGtlci5zY2hldWJlckBmb3JnZXJvY2suY29tCiAqIAogKiBIaWRlIGJ1dHRvbnMgb24gdGhlIGpvdXJuZXkgcGFnZS4KICogCiAqIFRoaXMgc2NyaXB0IGRvZXMgbm90IG5lZWQgdG8gYmUgcGFyYW1ldHJpemVkLiBJdCB3aWxsIHdvcmsgcHJvcGVybHkgYXMgaXMuCiAqIAogKiBUaGUgU2NyaXB0ZWQgRGVjaXNpb24gTm9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIG91dGNvbWVzIGRlZmluZWQ6CiAqIC0gdHJ1ZQogKi8KKGZ1bmN0aW9uICgpIHsKICAgIHZhciBzY3JpcHQgPSAiQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnfSkiCiAgICB2YXIgZnIgPSBKYXZhSW1wb3J0ZXIoCiAgICAgICAgb3JnLmZvcmdlcm9jay5vcGVuYW0uYXV0aC5ub2RlLmFwaS5BY3Rpb24sCiAgICAgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5UZXh0T3V0cHV0Q2FsbGJhY2ssCiAgICAgICAgY29tLnN1bi5pZGVudGl0eS5hdXRoZW50aWNhdGlvbi5jYWxsYmFja3MuU2NyaXB0VGV4dE91dHB1dENhbGxiYWNrCiAgICApCiAgICB2YXIgbWVzc2FnZSA9ICIgIgogICAgaWYgKGNhbGxiYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICBhY3Rpb24gPSBmci5BY3Rpb24uc2VuZCgKICAgICAgICAgICAgbmV3IGZyLlRleHRPdXRwdXRDYWxsYmFjaygKICAgICAgICAgICAgICAgIGZyLlRleHRPdXRwdXRDYWxsYmFjay5JTkZPUk1BVElPTiwKICAgICAgICAgICAgICAgIG1lc3NhZ2UKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbmV3IGZyLlNjcmlwdFRleHRPdXRwdXRDYWxsYmFjayhzY3JpcHQpCiAgICAgICAgKS5idWlsZCgpCiAgICB9Cn0oKSk7\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"157298c0-7d31-4059-a95b-eeb08473b7e5\",\"name\":\"Device Id (Match) - Client Side\",\"description\":\"Default global script for client side Device Id (Match) Authentication Module\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjMgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKdmFyIGZvbnREZXRlY3RvciA9IChmdW5jdGlvbiAoKSB7CiAgICAvKioKICAgICAqIEphdmFTY3JpcHQgY29kZSB0byBkZXRlY3QgYXZhaWxhYmxlIGF2YWlsYWJpbGl0eSBvZiBhCiAgICAgKiBwYXJ0aWN1bGFyIGZvbnQgaW4gYSBicm93c2VyIHVzaW5nIEphdmFTY3JpcHQgYW5kIENTUy4KICAgICAqCiAgICAgKiBBdXRob3IgOiBMYWxpdCBQYXRlbAogICAgICogV2Vic2l0ZTogaHR0cDovL3d3dy5sYWxpdC5vcmcvbGFiL2phdmFzY3JpcHQtY3NzLWZvbnQtZGV0ZWN0LwogICAgICogTGljZW5zZTogQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wCiAgICAgKiAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAgICAqIFZlcnNpb246IDAuMTUgKDIxIFNlcCAyMDA5KQogICAgICogICAgICAgICAgQ2hhbmdlZCBjb21wYXJpc2lvbiBmb250IHRvIGRlZmF1bHQgZnJvbSBzYW5zLWRlZmF1bHQtZGVmYXVsdCwKICAgICAqICAgICAgICAgIGFzIGluIEZGMy4wIGZvbnQgb2YgY2hpbGQgZWxlbWVudCBkaWRuJ3QgZmFsbGJhY2sKICAgICAqICAgICAgICAgIHRvIHBhcmVudCBlbGVtZW50IGlmIHRoZSBmb250IGlzIG1pc3NpbmcuCiAgICAgKiBWZXJzaW9uOiAwLjIgKDA0IE1hciAyMDEyKQogICAgICogICAgICAgICAgQ29tcGFyaW5nIGZvbnQgYWdhaW5zdCBhbGwgdGhlIDMgZ2VuZXJpYyBmb250IGZhbWlsaWVzIGllLAogICAgICogICAgICAgICAgJ21vbm9zcGFjZScsICdzYW5zLXNlcmlmJyBhbmQgJ3NhbnMnLiBJZiBpdCBkb2Vzbid0IG1hdGNoIGFsbCAzCiAgICAgKiAgICAgICAgICB0aGVuIHRoYXQgZm9udCBpcyAxMDAlIG5vdCBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbQogICAgICogVmVyc2lvbjogMC4zICgyNCBNYXIgMjAxMikKICAgICAqICAgICAgICAgIFJlcGxhY2VkIHNhbnMgd2l0aCBzZXJpZiBpbiB0aGUgbGlzdCBvZiBiYXNlRm9udHMKICAgICAqLwogICAgLyoKICAgICAqIFBvcnRpb25zIENvcHlyaWdodGVkIDIwMTMgRm9yZ2VSb2NrIEFTLgogICAgICovCiAgICB2YXIgZGV0ZWN0b3IgPSB7fSwgYmFzZUZvbnRzLCB0ZXN0U3RyaW5nLCB0ZXN0U2l6ZSwgaCwgcywgZGVmYXVsdFdpZHRoID0ge30sIGRlZmF1bHRIZWlnaHQgPSB7fSwgaW5kZXg7CgogICAgLy8gYSBmb250IHdpbGwgYmUgY29tcGFyZWQgYWdhaW5zdCBhbGwgdGhlIHRocmVlIGRlZmF1bHQgZm9udHMuCiAgICAvLyBhbmQgaWYgaXQgZG9lc24ndCBtYXRjaCBhbGwgMyB0aGVuIHRoYXQgZm9udCBpcyBub3QgYXZhaWxhYmxlLgogICAgYmFzZUZvbnRzID0gWydtb25vc3BhY2UnLCAnc2Fucy1zZXJpZicsICdzZXJpZiddOwoKICAgIC8vd2UgdXNlIG0gb3IgdyBiZWNhdXNlIHRoZXNlIHR3byBjaGFyYWN0ZXJzIHRha2UgdXAgdGhlIG1heGltdW0gd2lkdGguCiAgICAvLyBBbmQgd2UgdXNlIGEgTExpIHNvIHRoYXQgdGhlIHNhbWUgbWF0Y2hpbmcgZm9udHMgY2FuIGdldCBzZXBhcmF0ZWQKICAgIHRlc3RTdHJpbmcgPSAibW1tbW1tbW1tbWxsaSI7CgogICAgLy93ZSB0ZXN0IHVzaW5nIDcycHggZm9udCBzaXplLCB3ZSBtYXkgdXNlIGFueSBzaXplLiBJIGd1ZXNzIGxhcmdlciB0aGUgYmV0dGVyLgogICAgdGVzdFNpemUgPSAnNzJweCc7CgogICAgaCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07CgogICAgLy8gY3JlYXRlIGEgU1BBTiBpbiB0aGUgZG9jdW1lbnQgdG8gZ2V0IHRoZSB3aWR0aCBvZiB0aGUgdGV4dCB3ZSB1c2UgdG8gdGVzdAogICAgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgIHMuc3R5bGUuZm9udFNpemUgPSB0ZXN0U2l6ZTsKICAgIHMuaW5uZXJIVE1MID0gdGVzdFN0cmluZzsKICAgIGZvciAoaW5kZXggaW4gYmFzZUZvbnRzKSB7CiAgICAgICAgLy9nZXQgdGhlIGRlZmF1bHQgd2lkdGggZm9yIHRoZSB0aHJlZSBiYXNlIGZvbnRzCiAgICAgICAgcy5zdHlsZS5mb250RmFtaWx5ID0gYmFzZUZvbnRzW2luZGV4XTsKICAgICAgICBoLmFwcGVuZENoaWxkKHMpOwogICAgICAgIGRlZmF1bHRXaWR0aFtiYXNlRm9udHNbaW5kZXhdXSA9IHMub2Zmc2V0V2lkdGg7IC8vd2lkdGggZm9yIHRoZSBkZWZhdWx0IGZvbnQKICAgICAgICBkZWZhdWx0SGVpZ2h0W2Jhc2VGb250c1tpbmRleF1dID0gcy5vZmZzZXRIZWlnaHQ7IC8vaGVpZ2h0IGZvciB0aGUgZGVmdWFsdCBmb250CiAgICAgICAgaC5yZW1vdmVDaGlsZChzKTsKICAgIH0KCiAgICBkZXRlY3Rvci5kZXRlY3QgPSBmdW5jdGlvbihmb250KSB7CiAgICAgICAgdmFyIGRldGVjdGVkID0gZmFsc2UsIGluZGV4LCBtYXRjaGVkOwogICAgICAgIGZvciAoaW5kZXggaW4gYmFzZUZvbnRzKSB7CiAgICAgICAgICAgIHMuc3R5bGUuZm9udEZhbWlseSA9IGZvbnQgKyAnLCcgKyBiYXNlRm9udHNbaW5kZXhdOyAvLyBuYW1lIG9mIHRoZSBmb250IGFsb25nIHdpdGggdGhlIGJhc2UgZm9udCBmb3IgZmFsbGJhY2suCiAgICAgICAgICAgIGguYXBwZW5kQ2hpbGQocyk7CiAgICAgICAgICAgIG1hdGNoZWQgPSAocy5vZmZzZXRXaWR0aCAhPT0gZGVmYXVsdFdpZHRoW2Jhc2VGb250c1tpbmRleF1dIHx8IHMub2Zmc2V0SGVpZ2h0ICE9PSBkZWZhdWx0SGVpZ2h0W2Jhc2VGb250c1tpbmRleF1dKTsKICAgICAgICAgICAgaC5yZW1vdmVDaGlsZChzKTsKICAgICAgICAgICAgZGV0ZWN0ZWQgPSBkZXRlY3RlZCB8fCBtYXRjaGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGV0ZWN0ZWQ7CiAgICB9OwoKICAgIHJldHVybiBkZXRlY3RvcjsKfSgpKTsKLyoKICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICoKICogQ29weXJpZ2h0IChjKSAyMDA5IFN1biBNaWNyb3N5c3RlbXMgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zCiAqIG9mIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlCiAqICh0aGUgTGljZW5zZSkuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCiAqIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICoKICogWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHBzOi8vb3BlbnNzby5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwgb3IKICogb3BlbnNzby9sZWdhbC9DRERMdjEuMC50eHQKICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCiAqIHBlcm1pc3Npb24gYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiBXaGVuIGRpc3RyaWJ1dGluZyBDb3ZlcmVkIENvZGUsIGluY2x1ZGUgdGhpcyBDRERMCiAqIEhlYWRlciBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUKICogYXQgb3BlbnNzby9sZWdhbC9DRERMdjEuMC50eHQuCiAqIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBDRERMIEhlYWRlciwKICogd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdIHJlcGxhY2VkIGJ5CiAqIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgogKiAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCiAqCiAqLwovKgogKiBQb3J0aW9ucyBDb3B5cmlnaHRlZCAyMDEzIFN5bnRlZ3JpdHkuCiAqIFBvcnRpb25zIENvcHlyaWdodGVkIDIwMTMtMjAxNCBGb3JnZVJvY2sgQVMuCiAqLwoKdmFyIGNvbGxlY3RTY3JlZW5JbmZvID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBzY3JlZW5JbmZvID0ge307CiAgICAgICAgaWYgKHNjcmVlbikgewogICAgICAgICAgICBpZiAoc2NyZWVuLndpZHRoKSB7CiAgICAgICAgICAgICAgICBzY3JlZW5JbmZvLnNjcmVlbldpZHRoID0gc2NyZWVuLndpZHRoOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2NyZWVuLmhlaWdodCkgewogICAgICAgICAgICAgICAgc2NyZWVuSW5mby5zY3JlZW5IZWlnaHQgPSBzY3JlZW4uaGVpZ2h0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2NyZWVuLnBpeGVsRGVwdGgpIHsKICAgICAgICAgICAgICAgIHNjcmVlbkluZm8uc2NyZWVuQ29sb3VyRGVwdGggPSBzY3JlZW4ucGl4ZWxEZXB0aDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybigiQ2Fubm90IGNvbGxlY3Qgc2NyZWVuIGluZm9ybWF0aW9uLiBzY3JlZW4gaXMgbm90IGRlZmluZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzY3JlZW5JbmZvOwogICAgfSwKICAgIGNvbGxlY3RUaW1lem9uZUluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHRpbWV6b25lSW5mbyA9ICB7fSwgb2Zmc2V0ID0gbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpOwoKICAgICAgICBpZiAob2Zmc2V0KSB7CiAgICAgICAgICAgIHRpbWV6b25lSW5mby50aW1lem9uZSA9IG9mZnNldDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLndhcm4oIkNhbm5vdCBjb2xsZWN0IHRpbWV6b25lIGluZm9ybWF0aW9uLiB0aW1lem9uZSBpcyBub3QgZGVmaW5lZC4iKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0aW1lem9uZUluZm87CiAgICB9LAogICAgY29sbGVjdEJyb3dzZXJQbHVnaW5zSW5mbyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgaWYgKG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IucGx1Z2lucykgewogICAgICAgICAgICB2YXIgcGx1Z2luc0luZm8gPSB7fSwgaSwgcGx1Z2lucyA9IG5hdmlnYXRvci5wbHVnaW5zOwogICAgICAgICAgICBwbHVnaW5zSW5mby5pbnN0YWxsZWRQbHVnaW5zID0gIiI7CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgcGx1Z2luc0luZm8uaW5zdGFsbGVkUGx1Z2lucyA9IHBsdWdpbnNJbmZvLmluc3RhbGxlZFBsdWdpbnMgKyBwbHVnaW5zW2ldLmZpbGVuYW1lICsgIjsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGx1Z2luc0luZm87CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJDYW5ub3QgY29sbGVjdCBicm93c2VyIHBsdWdpbiBpbmZvcm1hdGlvbi4gbmF2aWdhdG9yLnBsdWdpbnMgaXMgbm90IGRlZmluZWQuIik7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CgogICAgfSwKLy8gR2V0dGluZyBnZW9sb2NhdGlvbiB0YWtlcyBzb21lIHRpbWUgYW5kIGlzIGRvbmUgYXN5bmNocm9ub3VzbHksIGhlbmNlIG5lZWQgYSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgb25jZSBnZW9sb2NhdGlvbiBpcyByZXRyaWV2ZWQuCiAgICBjb2xsZWN0R2VvbG9jYXRpb25JbmZvID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGdlb2xvY2F0aW9uSW5mbyA9IHt9LAogICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbihwb3NpdGlvbikgewogICAgICAgICAgICAgICAgZ2VvbG9jYXRpb25JbmZvLmxvbmdpdHVkZSA9IHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGU7CiAgICAgICAgICAgICAgICBnZW9sb2NhdGlvbkluZm8ubGF0aXR1ZGUgPSBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGU7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhnZW9sb2NhdGlvbkluZm8pOwogICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24oZXJyb3IpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybigiQ2Fubm90IGNvbGxlY3QgZ2VvbG9jYXRpb24gaW5mb3JtYXRpb24uICIgKyBlcnJvci5jb2RlICsgIjogIiArIGVycm9yLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soZ2VvbG9jYXRpb25JbmZvKTsKICAgICAgICAgICAgfTsKICAgICAgICBpZiAobmF2aWdhdG9yICYmIG5hdmlnYXRvci5nZW9sb2NhdGlvbikgewogICAgICAgICAgICAvLyBOQjogSWYgdXNlciBjaG9vc2VzICdOb3Qgbm93JyBvbiBGaXJlZm94IG5laXRoZXIgY2FsbGJhY2sgZ2V0cyBjYWxsZWQKICAgICAgICAgICAgLy8gICAgIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NTUzMwogICAgICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJDYW5ub3QgY29sbGVjdCBnZW9sb2NhdGlvbiBpbmZvcm1hdGlvbi4gbmF2aWdhdG9yLmdlb2xvY2F0aW9uIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgICAgICAgICBjYWxsYmFjayhnZW9sb2NhdGlvbkluZm8pOwogICAgICAgIH0KICAgIH0sCiAgICBjb2xsZWN0QnJvd3NlckZvbnRzSW5mbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgZm9udHNJbmZvID0ge30sIGksIGZvbnRzTGlzdCA9IFsiY3Vyc2l2ZSIsIm1vbm9zcGFjZSIsInNlcmlmIiwic2Fucy1zZXJpZiIsImZhbnRhc3kiLCJkZWZhdWx0IiwiQXJpYWwiLCJBcmlhbCBCbGFjayIsCiAgICAgICAgICAgICJBcmlhbCBOYXJyb3ciLCJBcmlhbCBSb3VuZGVkIE1UIEJvbGQiLCJCb29rbWFuIE9sZCBTdHlsZSIsIkJyYWRsZXkgSGFuZCBJVEMiLCJDZW50dXJ5IiwiQ2VudHVyeSBHb3RoaWMiLAogICAgICAgICAgICAiQ29taWMgU2FucyBNUyIsIkNvdXJpZXIiLCJDb3VyaWVyIE5ldyIsIkdlb3JnaWEiLCJHZW50aXVtIiwiSW1wYWN0IiwiS2luZyIsIkx1Y2lkYSBDb25zb2xlIiwiTGFsaXQiLAogICAgICAgICAgICAiTW9kZW5hIiwiTW9ub3R5cGUgQ29yc2l2YSIsIlBhcHlydXMiLCJUYWhvbWEiLCJUZVgiLCJUaW1lcyIsIlRpbWVzIE5ldyBSb21hbiIsIlRyZWJ1Y2hldCBNUyIsIlZlcmRhbmEiLAogICAgICAgICAgICAiVmVyb25hIl07CiAgICAgICAgZm9udHNJbmZvLmluc3RhbGxlZEZvbnRzID0gIiI7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBmb250c0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGZvbnREZXRlY3Rvci5kZXRlY3QoZm9udHNMaXN0W2ldKSkgewogICAgICAgICAgICAgICAgZm9udHNJbmZvLmluc3RhbGxlZEZvbnRzID0gZm9udHNJbmZvLmluc3RhbGxlZEZvbnRzICsgZm9udHNMaXN0W2ldICsgIjsiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmb250c0luZm87CiAgICB9LAogICAgZGV2aWNlUHJpbnQgPSB7fTsKCmRldmljZVByaW50LnNjcmVlbiA9IGNvbGxlY3RTY3JlZW5JbmZvKCk7CmRldmljZVByaW50LnRpbWV6b25lID0gY29sbGVjdFRpbWV6b25lSW5mbygpOwpkZXZpY2VQcmludC5wbHVnaW5zID0gY29sbGVjdEJyb3dzZXJQbHVnaW5zSW5mbygpOwpkZXZpY2VQcmludC5mb250cyA9IGNvbGxlY3RCcm93c2VyRm9udHNJbmZvKCk7CgppZiAobmF2aWdhdG9yLnVzZXJBZ2VudCkgewogICAgZGV2aWNlUHJpbnQudXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsKfQppZiAobmF2aWdhdG9yLmFwcE5hbWUpIHsKICAgIGRldmljZVByaW50LmFwcE5hbWUgPSBuYXZpZ2F0b3IuYXBwTmFtZTsKfQppZiAobmF2aWdhdG9yLmFwcENvZGVOYW1lKSB7CiAgICBkZXZpY2VQcmludC5hcHBDb2RlTmFtZSA9IG5hdmlnYXRvci5hcHBDb2RlTmFtZTsKfQppZiAobmF2aWdhdG9yLmFwcFZlcnNpb24pIHsKICAgIGRldmljZVByaW50LmFwcFZlcnNpb24gPSBuYXZpZ2F0b3IuYXBwVmVyc2lvbjsKfQppZiAobmF2aWdhdG9yLmFwcE1pbm9yVmVyc2lvbikgewogICAgZGV2aWNlUHJpbnQuYXBwTWlub3JWZXJzaW9uID0gbmF2aWdhdG9yLmFwcE1pbm9yVmVyc2lvbjsKfQppZiAobmF2aWdhdG9yLmJ1aWxkSUQpIHsKICAgIGRldmljZVByaW50LmJ1aWxkSUQgPSBuYXZpZ2F0b3IuYnVpbGRJRDsKfQppZiAobmF2aWdhdG9yLnBsYXRmb3JtKSB7CiAgICBkZXZpY2VQcmludC5wbGF0Zm9ybSA9IG5hdmlnYXRvci5wbGF0Zm9ybTsKfQppZiAobmF2aWdhdG9yLmNwdUNsYXNzKSB7CiAgICBkZXZpY2VQcmludC5jcHVDbGFzcyA9IG5hdmlnYXRvci5jcHVDbGFzczsKfQppZiAobmF2aWdhdG9yLm9zY3B1KSB7CiAgICBkZXZpY2VQcmludC5vc2NwdSA9IG5hdmlnYXRvci5vc2NwdTsKfQppZiAobmF2aWdhdG9yLnByb2R1Y3QpIHsKICAgIGRldmljZVByaW50LnByb2R1Y3QgPSBuYXZpZ2F0b3IucHJvZHVjdDsKfQppZiAobmF2aWdhdG9yLnByb2R1Y3RTdWIpIHsKICAgIGRldmljZVByaW50LnByb2R1Y3RTdWIgPSBuYXZpZ2F0b3IucHJvZHVjdFN1YjsKfQppZiAobmF2aWdhdG9yLnZlbmRvcikgewogICAgZGV2aWNlUHJpbnQudmVuZG9yID0gbmF2aWdhdG9yLnZlbmRvcjsKfQppZiAobmF2aWdhdG9yLnZlbmRvclN1YikgewogICAgZGV2aWNlUHJpbnQudmVuZG9yU3ViID0gbmF2aWdhdG9yLnZlbmRvclN1YjsKfQppZiAobmF2aWdhdG9yLmxhbmd1YWdlKSB7CiAgICBkZXZpY2VQcmludC5sYW5ndWFnZSA9IG5hdmlnYXRvci5sYW5ndWFnZTsKfQppZiAobmF2aWdhdG9yLnVzZXJMYW5ndWFnZSkgewogICAgZGV2aWNlUHJpbnQudXNlckxhbmd1YWdlID0gbmF2aWdhdG9yLnVzZXJMYW5ndWFnZTsKfQppZiAobmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZSkgewogICAgZGV2aWNlUHJpbnQuYnJvd3Nlckxhbmd1YWdlID0gbmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZTsKfQppZiAobmF2aWdhdG9yLnN5c3RlbUxhbmd1YWdlKSB7CiAgICBkZXZpY2VQcmludC5zeXN0ZW1MYW5ndWFnZSA9IG5hdmlnYXRvci5zeXN0ZW1MYW5ndWFnZTsKfQoKLy8gQXR0ZW1wdCB0byBjb2xsZWN0IGdlby1sb2NhdGlvbiBpbmZvcm1hdGlvbiBhbmQgcmV0dXJuIHRoaXMgd2l0aCB0aGUgZGF0YSBjb2xsZWN0ZWQgc28gZmFyLgovLyBPdGhlcndpc2UsIGlmIGdlby1sb2NhdGlvbiBmYWlscyBvciB0YWtlcyBsb25nZXIgdGhhbiAzMCBzZWNvbmRzLCBhdXRvLXN1Ym1pdCB0aGUgZGF0YSBjb2xsZWN0ZWQgc28gZmFyLgphdXRvU3VibWl0RGVsYXkgPSAzMDAwMDsKb3V0cHV0LnZhbHVlID0gSlNPTi5zdHJpbmdpZnkoZGV2aWNlUHJpbnQpOwpjb2xsZWN0R2VvbG9jYXRpb25JbmZvKGZ1bmN0aW9uKGdlb2xvY2F0aW9uSW5mbykgewogICAgZGV2aWNlUHJpbnQuZ2VvbG9jYXRpb24gPSBnZW9sb2NhdGlvbkluZm87CiAgICBvdXRwdXQudmFsdWUgPSBKU09OLnN0cmluZ2lmeShkZXZpY2VQcmludCk7CiAgICBzdWJtaXQoKTsKfSk7Cg==\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_CLIENT_SIDE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"b4f3facb-c754-4e7f-b1c0-f4d46f592126\",\"name\":\"LinkedIn Profile Normalization\",\"description\":\"Normalizes raw profile data from LinkedIn\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjQgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5maWVsZAppbXBvcnQgc3RhdGljIG9yZy5mb3JnZXJvY2suanNvbi5Kc29uVmFsdWUuanNvbgppbXBvcnQgc3RhdGljIG9yZy5mb3JnZXJvY2suanNvbi5Kc29uVmFsdWUub2JqZWN0CgpyZXR1cm4ganNvbihvYmplY3QoCiAgICAgICAgZmllbGQoImlkIiwgcmF3UHJvZmlsZS5zdWIpLAogICAgICAgIGZpZWxkKCJkaXNwbGF5TmFtZSIsIHJhd1Byb2ZpbGUubmFtZSksCiAgICAgICAgZmllbGQoImdpdmVuTmFtZSIsIHJhd1Byb2ZpbGUuZ2l2ZW5fbmFtZSksCiAgICAgICAgZmllbGQoImZhbWlseU5hbWUiLCByYXdQcm9maWxlLmZhbWlseV9uYW1lKSwKICAgICAgICBmaWVsZCgicGhvdG9VcmwiLCByYXdQcm9maWxlLnBpY3R1cmUpLAogICAgICAgIGZpZWxkKCJlbWFpbCIsIHJhd1Byb2ZpbGUuZW1haWwpLAogICAgICAgIGZpZWxkKCJlbWFpbFZlcmlmaWVkIiwgcmF3UHJvZmlsZS5lbWFpbF92ZXJpZmllZCksCiAgICAgICAgZmllbGQoInVzZXJuYW1lIiwgcmF3UHJvZmlsZS5lbWFpbCkpKQ==\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"id=dsameuser,ou=user,dc=openam,dc=forgerock,dc=org\",\"creationDate\":1433147666269,\"lastModifiedBy\":\"id=dsameuser,ou=user,dc=openam,dc=forgerock,dc=org\",\"lastModifiedDate\":1433147666269,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"a7a78773-445b-4eca-bb93-409e86bced81\",\"name\":\"GitHub Profile Normalization\",\"description\":\"Normalizes raw profile data from GitHub\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjIgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLmlkKSwKICAgICAgICBmaWVsZCgiZGlzcGxheU5hbWUiLCByYXdQcm9maWxlLm5hbWUpLAogICAgICAgIGZpZWxkKCJ1c2VybmFtZSIsIHJhd1Byb2ZpbGUubG9naW4pKSk=\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"23143919-6b78-40c3-b25e-beca19b229e0\",\"name\":\"GitHub Profile Normalization (VS)\",\"description\":\"Normalizes raw profile data from GitHub\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCmxvZ2dlci53YXJuaW5nKCJHaXRIdWIgcmF3UHJvZmlsZTogIityYXdQcm9maWxlKQoKcmV0dXJuIGpzb24ob2JqZWN0KAogICAgICAgIGZpZWxkKCJpZCIsIHJhd1Byb2ZpbGUuaWQpLAogICAgICAgIGZpZWxkKCJkaXNwbGF5TmFtZSIsIHJhd1Byb2ZpbGUubmFtZSksCiAgICAgICAgZmllbGQoImdpdmVuTmFtZSIsIHJhd1Byb2ZpbGUuZmlyc3RfbmFtZSksCiAgICAgICAgZmllbGQoImZhbWlseU5hbWUiLCByYXdQcm9maWxlLmxhc3RfbmFtZSksCiAgICAgICAgZmllbGQoInBob3RvVXJsIiwgcmF3UHJvZmlsZS5waWN0dXJlLmRhdGEudXJsKSwKICAgICAgICBmaWVsZCgiZW1haWwiLCByYXdQcm9maWxlLmVtYWlsKSwKICAgICAgICBmaWVsZCgidXNlcm5hbWUiLCByYXdQcm9maWxlLmVtYWlsKSkp\",\"default\":false,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"60609c1a-4cef-4729-a417-354aafdebf3f\",\"name\":\"LINE Profile Normalization\",\"description\":\"Normalizes raw profile data from LINE\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjQgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCi8vIExJTkUgZG9lcyBub3QgcmV0dXJuIHRoZSBlbWFpbCBmcm9tIHRoZSB1c2VySW5mbyBlbmRwb2ludCBidXQgc2hvdWxkIHJldHVybiBpdCBmcm9tIHRoZSB0b2tlbiBlbmRwb2ludCBhbmQgdGhlcmVmb3JlCi8vIGl0IHNob3VsZCBiZSBzZXQgaW4gdGhlIHNoYXJlZCBzdGF0ZQp2YXIgZW1haWwgPSAiY2hhbmdlQG1lLmNvbSIKdmFyIHN1YmplY3RJZCA9IHJhd1Byb2ZpbGUuc3ViCnZhciB1c2VybmFtZSA9IHN1YmplY3RJZAp2YXIgZmlyc3ROYW1lID0gIiAiCnZhciBsYXN0TmFtZSA9ICIgIgoKaWYgKHNoYXJlZFN0YXRlLmdldCgiY2xhaW1zX3NldCIpICE9IG51bGwgJiYgc2hhcmVkU3RhdGUuZ2V0KCJjbGFpbXNfc2V0IikuZW1haWwgIT0gbnVsbCkgewogICAgZW1haWwgPSBzaGFyZWRTdGF0ZS5nZXQoImNsYWltc19zZXQiKS5lbWFpbAogICAgdXNlcm5hbWUgPSBlbWFpbAp9CgppZiAocmF3UHJvZmlsZS5pc0RlZmluZWQoIm5hbWUiKSAmJiByYXdQcm9maWxlLm5hbWUuaXNOb3ROdWxsKCkpIHsKICAgIHZhciBzcGxpdE5hbWUgPSByYXdQcm9maWxlLm5hbWUuYXNTdHJpbmcoKS5zcGxpdCgiICIpCiAgICBmaXJzdE5hbWUgPSBzcGxpdE5hbWVbMF0KICAgIGxhc3ROYW1lID0gc3BsaXROYW1lWy0xXQp9CgpyZXR1cm4ganNvbihvYmplY3QoCiAgICAgICAgZmllbGQoImlkIiwgcmF3UHJvZmlsZS5zdWIpLAogICAgICAgIGZpZWxkKCJkaXNwbGF5TmFtZSIsIHJhd1Byb2ZpbGUubmFtZSksCiAgICAgICAgZmllbGQoInBob3RvVXJsIiwgcmF3UHJvZmlsZS5waWN0dXJlKSwKICAgICAgICBmaWVsZCgiZW1haWwiLCBlbWFpbCksCiAgICAgICAgZmllbGQoImdpdmVuTmFtZSIsIGZpcnN0TmFtZSksCiAgICAgICAgZmllbGQoImZhbWlseU5hbWUiLCBsYXN0TmFtZSksCiAgICAgICAgZmllbGQoInVzZXJuYW1lIiwgdXNlcm5hbWUpKSk=\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"id=dsameuser,ou=user,dc=openam,dc=forgerock,dc=org\",\"creationDate\":1433147666269,\"lastModifiedBy\":\"id=dsameuser,ou=user,dc=openam,dc=forgerock,dc=org\",\"lastModifiedDate\":1433147666269,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"739bdc48-fd24-4c52-b353-88706d75558a\",\"name\":\"Check Username\",\"description\":\"Check if username has already been collected.\",\"script\":\"LyogQ2hlY2sgVXNlcm5hbWUKICoKICogQXV0aG9yOiB2b2xrZXIuc2NoZXViZXJAZm9yZ2Vyb2NrLmNvbQogKiAKICogQ2hlY2sgaWYgdXNlcm5hbWUgaGFzIGFscmVhZHkgYmVlbiBjb2xsZWN0ZWQuCiAqIFJldHVybiAia25vd24iIGlmIHllcywgInVua25vd24iIG90aGVyd2lzZS4KICogCiAqIFRoaXMgc2NyaXB0IGRvZXMgbm90IG5lZWQgdG8gYmUgcGFyYW1ldHJpemVkLiBJdCB3aWxsIHdvcmsgcHJvcGVybHkgYXMgaXMuCiAqIAogKiBUaGUgU2NyaXB0ZWQgRGVjaXNpb24gTm9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIG91dGNvbWVzIGRlZmluZWQ6CiAqIC0ga25vd24KICogLSB1bmtub3duCiAqLwooZnVuY3Rpb24gKCkgewogICAgaWYgKG51bGwgIT0gc2hhcmVkU3RhdGUuZ2V0KCJ1c2VybmFtZSIpKSB7CiAgICAgICAgb3V0Y29tZSA9ICJrbm93biI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBvdXRjb21lID0gInVua25vd24iOwogICAgfQp9KCkpOw==\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"41c24257-d7fc-4654-8b46-c2666dc5b56d\",\"name\":\"level\",\"description\":\"set per level shared state variable\",\"script\":\"KGZ1bmN0aW9uICgpIHsKICBvdXRjb21lID0gJ3RydWUnOwogIHZhciBsZXZlbCA9IG5vZGVTdGF0ZS5nZXQoJ2xldmVsJykuYXNJbnRlZ2VyKCk7CiAgc2hhcmVkU3RhdGUucHV0KCdsZXZlbCcgKyBsZXZlbCArICdWYWx1ZScsICdMZXZlbCAnICsgbGV2ZWwgKyAnOiBUaGlzIGlzIGEgbG9uZ2VyIHN0cmluZyB2YWx1ZSBzZXQgYXQgZWFjaCBsZXZlbCBvZiB0aGUgbmVzdGVkIGpvdXJuZXlzLiBJdCBjb250YWlucyBhbiBpbmRpY2F0b3IgaW4gd2hpY2ggbGV2ZWwgaXQgd2FzIHNldC4nKTsKfSgpKTs=\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"07ee6240-d106-4e25-a781-5fcabc477d22\",\"name\":\"FrodoSPAdapter\",\"description\":\"null\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjMgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKLyoKICogVGhlIHNjcmlwdCBoYXMgdGhlc2UgdG9wIGxldmVsIGZ1bmN0aW9ucyB0aGF0IGNvdWxkIGJlIGV4ZWN1dGVkIGR1cmluZyBhIFNBTUwyIGZsb3cuCiAqICAgICAgLSBwcmVTaW5nbGVTaWduT25SZXF1ZXN0CiAqICAgICAgLSBwcmVTaW5nbGVTaWduT25Qcm9jZXNzCiAqICAgICAgLSBwb3N0U2luZ2xlU2lnbk9uU3VjY2VzcwogKiAgICAgIC0gcG9zdFNpbmdsZVNpZ25PbkZhaWx1cmUKICogICAgICAtIHBvc3ROZXdOYW1lSURTdWNjZXNzCiAqICAgICAgLSBwb3N0VGVybWluYXRlTmFtZUlEU3VjY2VzcwogKiAgICAgIC0gcHJlU2luZ2xlTG9nb3V0UHJvY2VzcwogKiAgICAgIC0gcG9zdFNpbmdsZUxvZ291dFN1Y2Nlc3MKICoKICogUGxlYXNlIHNlZSB0aGUgSmF2YURvYyBmb3IgdGhlIGludGVyZmFjZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBtZXRob2RzLgogKiBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmFtL3NhbWwyL3BsdWdpbnMvU1BBZGFwdGVyLmh0bWwKICogTm90ZSB0aGF0IHRoZSBpbml0aWFsaXplIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBzY3JpcHRzLgogKgogKiBEZWZpbmVkIHZhcmlhYmxlcy4gQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlIHJlc3BlY3RpdmUgZnVuY3Rpb25zIGZvciB0aGUgdmFyaWFibGVzIGF2YWlsYWJsZSB0byBpdC4KICoKICogaG9zdGVkRW50aXR5SWQgLSBTdHJpbmcKICogICAgIEVudGl0eSBJRCBmb3IgdGhlIGhvc3RlZCBJRFAKICogcmVhbG0gLSBTdHJpbmcKICogICAgIFJlYWxtIG9mIHRoZSBob3N0ZWQgSURQCiAqIGlkcEVudGl0eUlkIC0gU3RyaW5nCiAqICAgICBUaGUgZW50aXR5IElEIGZvciB0aGUgSWRlbnRpdHkgUHJvdmlkZXIgZm9yIHdoaWNoIHRoZSBzaWduLW9uIHJlcXVlc3Qgd2lsbCBiZSBzZW50LgogKiByZXF1ZXN0IC0gSHR0cFNlcnZsZXRSZXF1ZXN0ICgxKQogKiAgICAgU2VydmxldCByZXF1ZXN0IG9iamVjdAogKiByZXNwb25zZSAtIEh0dHBTZXJ2bGV0UmVzcG9uc2UgKDIpCiAqICAgICBTZXJ2bGV0IHJlc3BvbnNlIG9iamVjdAogKiBhdXRoblJlcXVlc3QgLSBBdXRoblJlcXVlc3QgKDMpCiAqICAgICBUaGUgYXV0aGVudGljYXRpb24gcmVxdWVzdCBzZW50IHRoYXQgaXMgc2VudCBmcm9tIHRoZSBTZXJ2aWNlIFByb3ZpZGVyLgogKiBzZXNzaW9uIC0gU1NPVG9rZW4gKDQpCiAqICAgICBUaGUgc2luZ2xlIHNpZ24tb24gc2Vzc2lvbi4gVGhlIHJlZmVyZW5jZSB0eXBlIG9mIHRoaXMgaXMgT2JqZWN0IGFuZCB3b3VsZCBuZWVkIHRvIGJlIGNhc3RlZCB0byBTU09Ub2tlbi4KICogcmVzIC0gUmVzcG9uc2UgKDUpCiAqICAgICBUaGUgU1NPIFJlc3BvbnNlIHJlY2VpdmVkIGZyb20gdGhlIElkZW50aXR5IFByb3ZpZGVyLgogKiBwcm9maWxlIC0gU3RyaW5nCiAqICAgICBUaGUgcHJvdG9jb2wgcHJvZmlsZSB0aGF0IGlzIHVzZWQsIHRoaXMgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZnJvbSBTQU1MMkNvbnN0YW50cyAoNik6CiAqICAgICAgICAgIC0gU0FNTDJDb25zdGFudHMuSFRUUF9QT1NUCiAqICAgICAgICAgIC0gU0FNTDJDb25zdGFudHMuSFRUUF9BUlRJRkFDVAogKiAgICAgICAgICAtIFNBTUwyQ29uc3RhbnRzLlBBT1MKICogb3V0IC0gUHJpbnRXcml0ZXIgKDcpCiAqICAgICBUaGUgUHJpbnRXcml0ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSB0by4KICogaXNGZWRlcmF0aW9uIC0gYm9vbGVhbgogKiAgICAgU2V0IHRvIHRydWUgaWYgdXNpbmcgZmVkZXJhdGlvbiwgb3RoZXJ3aXNlIGZhbHNlLgogKiBmYWlsdXJlQ29kZSAtIGludAogKiAgICAgQW4gaW50ZWdlciBob2xkaW5nIHRoZSBmYWlsdXJlIGNvZGUgd2hlbiBhbiBlcnJvciBoYXMgb2NjdXJyZWQuIEZvciBwb3RlbnRpYWwgdmFsdWVzIHNlZSBTUEFkYXB0ZXIuCiAqIHVzZXJJZCAtIFN0cmluZwogKiAgICAgVGhlIHVuaXF1ZSB1bml2ZXJzYWwgSUQgb2YgdGhlIHVzZXIgd2l0aCB3aG9tIHRoZSBuZXcgbmFtZSBpZGVudGlmaWVyIHJlcXVlc3Qgd2FzIHBlcmZvcm1lZC4KICogaWRSZXF1ZXN0IC0gTWFuYWdlTmFtZUlEUmVxdWVzdCAoOCkKICogICAgIFRoZSBuZXcgbmFtZSBpZGVudGlmaWVyIHJlcXVlc3QsIHRoaXMgd2lsbCBiZSBudWxsIGlmIHRoZSByZXF1ZXN0IG9iamVjdCBpcyBub3QgYXZhaWxhYmxlCiAqIGlkUmVzcG9uc2UgLSBNYW5hZ2VOYW1lSURSZXNwb25zZSAoOSkKICogICAgIFRoZSBuZXcgbmFtZSBpZGVudGlmaWVyIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmUgbnVsbCBpZiB0aGUgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUKICogYmluZGluZyAtIFN0cmluZwogKiAgICAgVGhlIGJpbmRpbmcgdXNlZCBmb3IgdGhlIG5ldyBuYW1lIGlkZW50aWZpZXIgcmVxdWVzdC4gVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICogICAgICAgICAgLSBTQU1MMkNvbnN0YW50cy5TT0FQCiAqICAgICAgICAgIC0gU0FNTDJDb25zdGFudHMuSFRUUF9SRURJUkVDVAogKiBsb2dvdXRSZXF1ZXN0IC0gTG9nb3V0UmVxdWVzdCAoMTApCiAqICAgICBUaGUgc2luZ2xlIGxvZ291dCByZXF1ZXN0LgogKiBsb2dvdXRSZXNwb25zZSAtIExvZ291dFJlc3BvbnNlICgxMSkKICogICAgIFRoZSBzaW5nbGUgbG9nb3V0IHJlc3BvbnNlLgogKiBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIgLSBTcEFkYXB0ZXJTY3JpcHRIZWxwZXIgKDEyKQogKiAgICAgQW4gaW5zdGFuY2Ugb2YgU3BBZGFwdGVyU2NyaXB0SGVscGVyIGNvbnRhaW5pbmcgaGVscGVyIG1ldGhvZHMuIFNlZSBKYXZhZG9jIGZvciBtb3JlIGRldGFpbHMuCiAqIGxvZ2dlciAtIExvZ2dlciBpbnN0YW5jZQogKiAgICAgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvc2NyaXB0aW5nLWd1aWRlL3NjcmlwdGluZy1hcGktZ2xvYmFsLWxvZ2dlci5odG1sI3NjcmlwdGluZy1hcGktZ2xvYmFsLWxvZ2dlci4KICogICAgIENvcnJlc3BvbmRpbmcgbG9nIGZpbGVzIHdpbGwgYmUgcHJlZml4ZWQgd2l0aDogc2NyaXB0cy48c2NyaXB0IG5hbWU+CiAqCiAqIFRocm93cyBTQU1MMkV4Y2VwdGlvbiAoMTMpOgogKiAgICAgZm9yIGFueSBleGNlcHRpb25zIG9jY3VycmluZyBpbiB0aGUgYWRhcHRlci4gVGhlIGZlZGVyYXRpb24gcHJvY2VzcyB3aWxsIGNvbnRpbnVlCiAqCiAqIENsYXNzIHJlZmVyZW5jZToKICogKDEpIEh0dHBTZXJ2bGV0UmVxdWVzdCAtIGh0dHBzOi8vdG9tY2F0LmFwYWNoZS5vcmcvdG9tY2F0LTcuMC1kb2Mvc2VydmxldGFwaS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0Lmh0bWwuCiAqICgyKSBIdHRwU2VydmxldFJlc3BvbnNlIC0gaHR0cHM6Ly90b21jYXQuYXBhY2hlLm9yZy90b21jYXQtNy4wLWRvYy9zZXJ2bGV0YXBpL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlLmh0bWwuCiAqICgzKSBBdXRoblJlcXVlc3QgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvQXV0aG5SZXF1ZXN0Lmh0bWwuCiAqICg0KSBTU09Ub2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL2lwbGFuZXQvc3NvL1NTT1Rva2VuLmh0bWwuCiAqICg1KSBSZXNwb25zZSAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9wcm90b2NvbC9SZXNwb25zZS5odG1sCiAqICg2KSBTQU1MMkNvbnN0YW50cyAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9jb21tb24vU0FNTDJDb25zdGFudHMuaHRtbAogKiAoNykgUHJpbnRXcml0ZXIgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9pby9QcmludFdyaXRlci5odG1sCiAqICg4KSBNYW5hZ2VOYW1lSURSZXF1ZXN0IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMy9fYXR0YWNobWVudHMvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL3Byb3RvY29sL01hbmFnZU5hbWVJRFJlcXVlc3QuaHRtbAogKiAoOSkgTWFuYWdlTmFtZUlEUmVzcG9uc2UgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvTWFuYWdlTmFtZUlEUmVzcG9uc2UuaHRtbAogKiAoMTApIExvZ291dFJlcXVlc3QgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvTG9nb3V0UmVxdWVzdC5odG1sCiAqICgxMSkgTG9nb3V0UmVzcG9uc2UgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvTG9nb3V0UmVzcG9uc2UuaHRtbAogKiAoMTIpIFNwQWRhcHRlclNjcmlwdEhlbHBlciAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9wbHVnaW5zL3NjcmlwdGVkL1NwQWRhcHRlclNjcmlwdEhlbHBlci5odG1sLgogKiAoMTMpIFNBTUwyRXhjZXB0aW9uIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMy9fYXR0YWNobWVudHMvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL2NvbW1vbi9TQU1MMkV4Y2VwdGlvbi5odG1sLgogKi8KCi8qCiAqIFRlbXBsYXRlL2RlZmF1bHQgc2NyaXB0IGZvciBTQU1MMiBTUCBBZGFwdGVyIHNjcmlwdGVkIHBsdWdpbi4KICovCgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwcmVTaW5nbGVTaWduT25SZXF1ZXN0OgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIGlkcEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIGF1dGhuUmVxdWVzdAogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICovCmZ1bmN0aW9uIHByZVNpbmdsZVNpZ25PblJlcXVlc3QoKSB7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZVNpbmdsZVNpZ25PblByb2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlcwogKiAgICAgcHJvZmlsZQogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICovCmZ1bmN0aW9uIHByZVNpbmdsZVNpZ25PblByb2Nlc3MoKSB7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHBvc3RTaW5nbGVTaWduT25TdWNjZXNzOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICByZXF1ZXN0CiAqICAgICByZXNwb25zZQogKiAgICAgb3V0CiAqICAgICBzZXNzaW9uCiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlcwogKiAgICAgcHJvZmlsZQogKiAgICAgaXNGZWRlcmF0aW9uCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKgogKiBSZXR1cm4gLSB0cnVlIGlmIHJlc3BvbnNlIGlzIGJlaW5nIHJlZGlyZWN0ZWQsIGZhbHNlIGlmIG5vdC4gRGVmYXVsdCB0byBmYWxzZS4KICovCmZ1bmN0aW9uIHBvc3RTaW5nbGVTaWduT25TdWNjZXNzKCkgewogICAgcmV0dXJuIGZhbHNlOwp9CgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwb3N0U2luZ2xlU2lnbk9uRmFpbHVyZToKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIGF1dGhuUmVxdWVzdAogKiAgICAgcmVzCiAqICAgICBwcm9maWxlCiAqICAgICBmYWlsdXJlQ29kZQogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICoKICogUmV0dXJuIC0gdHJ1ZSBpZiByZXNwb25zZSBpcyBiZWluZyByZWRpcmVjdGVkLCBmYWxzZSBpZiBub3QuIERlZmF1bHQgdG8gZmFsc2UuCiAqLwpmdW5jdGlvbiBwb3N0U2luZ2xlU2lnbk9uRmFpbHVyZSgpIHsKICAgIHJldHVybiBmYWxzZTsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcG9zdE5ld05hbWVJRFN1Y2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICB1c2VySWQKICogICAgIGlkUmVxdWVzdAogKiAgICAgaWRSZXNwb25zZQogKiAgICAgYmluZGluZwogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICovCmZ1bmN0aW9uIHBvc3ROZXdOYW1lSURTdWNjZXNzKCkgewp9CgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwb3N0VGVybWluYXRlTmFtZUlEU3VjY2VzczoKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIHVzZXJJZAogKiAgICAgaWRSZXF1ZXN0CiAqICAgICBpZFJlc3BvbnNlCiAqICAgICBiaW5kaW5nCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcG9zdFRlcm1pbmF0ZU5hbWVJRFN1Y2Nlc3MoKSB7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZVNpbmdsZUxvZ291dFByb2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICB1c2VySWQKICogICAgIGxvZ291dFJlcXVlc3QKICogICAgIGxvZ291dFJlc3BvbnNlCiAqICAgICBiaW5kaW5nCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcHJlU2luZ2xlTG9nb3V0UHJvY2VzcygpIHsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcG9zdFNpbmdsZUxvZ291dFN1Y2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICB1c2VySWQKICogICAgIGxvZ291dFJlcXVlc3QKICogICAgIGxvZ291dFJlc3BvbnNlCiAqICAgICBiaW5kaW5nCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcG9zdFNpbmdsZUxvZ291dFN1Y2Nlc3MoKSB7Cn0=\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"SAML2_SP_ADAPTER\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"6002c349-f1d0-4317-baa2-a18590fc3cff\",\"name\":\"Okta Profile Normalization - imported (1)\",\"description\":\"Normalizes raw profile data from GitHub\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjIgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCmxvZ2dlci53YXJuaW5nKCJPa3RhIHJhd1Byb2ZpbGU6ICIrcmF3UHJvZmlsZSkKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLmlkKSwKICAgICAgICBmaWVsZCgiZGlzcGxheU5hbWUiLCByYXdQcm9maWxlLm5hbWUpLAogICAgICAgIGZpZWxkKCJnaXZlbk5hbWUiLCByYXdQcm9maWxlLmZpcnN0X25hbWUpLAogICAgICAgIGZpZWxkKCJmYW1pbHlOYW1lIiwgcmF3UHJvZmlsZS5sYXN0X25hbWUpLAogICAgICAgIGZpZWxkKCJwaG90b1VybCIsIHJhd1Byb2ZpbGUucGljdHVyZS5kYXRhLnVybCksCiAgICAgICAgZmllbGQoImVtYWlsIiwgcmF3UHJvZmlsZS5lbWFpbCksCiAgICAgICAgZmllbGQoInVzZXJuYW1lIiwgcmF3UHJvZmlsZS5wcmVmZXJyZWRfdXNlcm5hbWUpKSk=\",\"default\":false,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"5bbdaeff-ddee-44b9-b608-8d413d7d65a6\",\"name\":\"mode\",\"description\":\"Check if mode has already been set.\",\"script\":\"LyogbW9kZQogKgogKiBBdXRob3I6IHZvbGtlci5zY2hldWJlckBmb3JnZXJvY2suY29tCiAqIAogKiBDb2xsZWN0IG1vZGUgaWYgbm90IGFscmVhZHkgc2V0IGFuZCBzZXQgb3V0Y29tZSB0byBtb2RlLgogKiAKICogVGhpcyBzY3JpcHQgZG9lcyBub3QgbmVlZCB0byBiZSBwYXJhbWV0cml6ZWQuIEl0IHdpbGwgd29yayBwcm9wZXJseSBhcyBpcy4KICogCiAqIFRoZSBTY3JpcHRlZCBEZWNpc2lvbiBOb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgb3V0Y29tZXMgZGVmaW5lZDoKICogLSAnc2hhcmVkIGFuZCBsZXZlbCcKICogLSAnc2hhcmVkIG9ubHknCiAqIC0gJ2xldmVsIG9ubHknCiAqIC0gJ25vbmUnCiAqLwooZnVuY3Rpb24gKCkgewogIHZhciBtb2RlID0gbm9kZVN0YXRlLmdldCgnbW9kZScpOwogIGlmIChtb2RlKSB7CiAgICBvdXRjb21lID0gbW9kZS5hc1N0cmluZygpOwogICAgdmFyIGxldmVsID0gbm9kZVN0YXRlLmdldCgnbGV2ZWwnKS5hc0ludGVnZXIoKSArIDE7CiAgICBsb2dnZXIuZXJyb3IoJ21vZGU6IG1vZGU9JyArIG1vZGUuYXNTdHJpbmcoKSArICcsIGxldmVsPScgKyBsZXZlbCk7CiAgICBzaGFyZWRTdGF0ZS5wdXQoJ2xldmVsJywgbGV2ZWwpOwogIH0KICBlbHNlIHsKICAgIHZhciBjaG9pY2VzID0gWydzaGFyZWQgYW5kIGxldmVsJywgJ3NoYXJlZCBvbmx5JywgJ2xldmVsIG9ubHknLCAnbm9uZSddOwogIAogICAgdmFyIGZyID0gSmF2YUltcG9ydGVyKAogICAgICBvcmcuZm9yZ2Vyb2NrLm9wZW5hbS5hdXRoLm5vZGUuYXBpLkFjdGlvbiwKICAgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DaG9pY2VDYWxsYmFjawogICAgKQoKICAgIGlmIChjYWxsYmFja3MuaXNFbXB0eSgpKSB7CiAgICAgIGFjdGlvbiA9IGZyLkFjdGlvbi5zZW5kKFsKICAgICAgICBuZXcgZnIuQ2hvaWNlQ2FsbGJhY2soJ0Nob29zZSB0ZXN0IG1vZGUnLCBjaG9pY2VzLCAwLCBmYWxzZSkKICAgICAgXSkuYnVpbGQoKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBjaG9pY2UgPSBwYXJzZUludChjYWxsYmFja3MuZ2V0KDApLmdldFNlbGVjdGVkSW5kZXhlcygpWzBdKTsKICAgICAgbm9kZVN0YXRlLnB1dFNoYXJlZCgnbW9kZScsIGNob2ljZXNbY2hvaWNlXSk7CiAgICAgIG5vZGVTdGF0ZS5wdXRTaGFyZWQoJ2xldmVsJywgMCk7CiAgICAgIGFjdGlvbiA9IGZyLkFjdGlvbi5nb1RvKGNob2ljZXNbY2hvaWNlXSkuYnVpbGQoKTsKICAgIH0KICB9Cn0oKSk7\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"c234ba0b-58a1-4cfd-9567-09edde980745\",\"name\":\"ForgeRock Internal: OAuth2 Access Token Modification Script\",\"description\":\"Internal token modification script\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjMgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwovLyBTY3JpcHQgaXMgaW50ZW50aW9uYWxseSBlbXB0eQo=\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"OAUTH2_ACCESS_TOKEN_MODIFICATION\",\"createdBy\":\"null\",\"creationDate\":1433147666269,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"7e3d7067-d50f-4674-8c76-a3e13a810c33\",\"name\":\"Scripted Module - Server Side\",\"description\":\"Default global script for server side Scripted Authentication Module\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMTUtMjAyMyBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgp2YXIgU1RBUlRfVElNRSA9IDk7ICAvLyA5YW0KdmFyIEVORF9USU1FICAgPSAxNzsgLy8gNXBtCnZhciBsb25naXR1ZGUsIGxhdGl0dWRlOwp2YXIgbG9jYWxUaW1lOwoKbG9nZ2VyLm1lc3NhZ2UoIlN0YXJ0aW5nIHNjcmlwdGVkIGF1dGhlbnRpY2F0aW9uIik7CmxvZ2dlci5tZXNzYWdlKCJVc2VyOiAiICsgdXNlcm5hbWUpOwoKdmFyIHVzZXJQb3N0YWxBZGRyZXNzID0gZ2V0VXNlclBvc3RhbEFkZHJlc3MoKTsKbG9nZ2VyLm1lc3NhZ2UoIlVzZXIgYWRkcmVzczogIiArIHVzZXJQb3N0YWxBZGRyZXNzKTsKCmdldExvbmdpdHVkZUxhdGl0dWRlRnJvbVVzZXJQb3N0YWxBZGRyZXNzKCk7CmdldExvY2FsVGltZSgpOwoKbG9nZ2VyLm1lc3NhZ2UoIkN1cnJlbnQgdGltZSBhdCB0aGUgdXNlcnMgbG9jYXRpb246ICIgKyBsb2NhbFRpbWUuZ2V0SG91cnMoKSk7CmlmIChsb2NhbFRpbWUuZ2V0SG91cnMoKSA8IFNUQVJUX1RJTUUgfHwgbG9jYWxUaW1lLmdldEhvdXJzKCkgPiBFTkRfVElNRSkgewogICAgbG9nZ2VyLmVycm9yKCJMb2dpbiBmb3JiaWRkZW4gb3V0c2lkZSB3b3JrIGhvdXJzISIpOwogICAgYXV0aFN0YXRlID0gRkFJTEVEOwp9IGVsc2UgewogICAgbG9nZ2VyLm1lc3NhZ2UoIkF1dGhlbnRpY2F0aW9uIGFsbG93ZWQhIik7CiAgICBhdXRoU3RhdGUgPSBTVUNDRVNTOwp9CgpmdW5jdGlvbiBnZXRMb25naXR1ZGVMYXRpdHVkZUZyb21Vc2VyUG9zdGFsQWRkcmVzcygpIHsKCiAgICB2YXIgcmVxdWVzdCA9IG5ldyBvcmcuZm9yZ2Vyb2NrLmh0dHAucHJvdG9jb2wuUmVxdWVzdCgpOwogICAgcmVxdWVzdC5zZXRVcmkoImh0dHA6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2dlb2NvZGUvanNvbj9hZGRyZXNzPSIgKyBlbmNvZGVVUklDb21wb25lbnQodXNlclBvc3RhbEFkZHJlc3MpKTsKICAgICAgcmVxdWVzdC5zZXRNZXRob2QoIkdFVCIpOwogICAgICAvL3RoZSBhYm92ZSBVUkkgaGFzIHRvIGJlIGV4dGVuZGVkIHdpdGggYW4gQVBJX0tFWSBpZiB1c2VkIGluIGEgZnJlcXVlbnQgbWFubmVyCiAgICAgIC8vc2VlIGRvY3VtZW50YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvZG9jdW1lbnRhdGlvbi9nZW9jb2RpbmcvaW50cm8KCiAgICB2YXIgcmVzcG9uc2UgPSBodHRwQ2xpZW50LnNlbmQocmVxdWVzdCkuZ2V0KCk7CiAgICBsb2dSZXNwb25zZShyZXNwb25zZSk7CgogICAgdmFyIGdlb2NvZGUgPSBKU09OLnBhcnNlKHJlc3BvbnNlLmdldEVudGl0eSgpLmdldFN0cmluZygpKTsKICAgIHZhciBpOwogICAgZm9yIChpID0gMDsgaSA8IGdlb2NvZGUucmVzdWx0cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciByZXN1bHQgPSBnZW9jb2RlLnJlc3VsdHNbaV07CiAgICAgICAgbGF0aXR1ZGUgPSByZXN1bHQuZ2VvbWV0cnkubG9jYXRpb24ubGF0OwogICAgICAgIGxvbmdpdHVkZSA9IHJlc3VsdC5nZW9tZXRyeS5sb2NhdGlvbi5sbmc7CgogICAgICAgICAgIGxvZ2dlci5tZXNzYWdlKCJsYXRpdHVkZToiICsgbGF0aXR1ZGUgKyAiIGxvbmdpdHVkZToiICsgbG9uZ2l0dWRlKTsKICAgIH0KfQoKZnVuY3Rpb24gZ2V0TG9jYWxUaW1lKCkgewoKICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDA7CiAgICB2YXIgbG9jYXRpb24gPSAibG9jYXRpb249IiArIGxhdGl0dWRlICsgIiwiICsgbG9uZ2l0dWRlOwogICAgdmFyIHRpbWVzdGFtcCA9ICJ0aW1lc3RhbXA9IiArIG5vdzsKCiAgICB2YXIgcmVxdWVzdCA9IG5ldyBvcmcuZm9yZ2Vyb2NrLmh0dHAucHJvdG9jb2wuUmVxdWVzdCgpOwogICAgcmVxdWVzdC5zZXRVcmkoImh0dHBzOi8vbWFwcy5nb29nbGVhcGlzLmNvbS9tYXBzL2FwaS90aW1lem9uZS9qc29uPyIgKyBsb2NhdGlvbiArICImIiArIHRpbWVzdGFtcCk7CiAgICAgIHJlcXVlc3Quc2V0TWV0aG9kKCJHRVQiKTsKICAgICAgLy90aGUgYWJvdmUgVVJJIGhhcyB0byBiZSBleHRlbmRlZCB3aXRoIGFuIEFQSV9LRVkgaWYgdXNlZCBpbiBhIGZyZXF1ZW50IG1hbm5lcgogICAgICAvL3NlZSBkb2N1bWVudGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vdGltZXpvbmUvaW50cm8KCiAgICB2YXIgcmVzcG9uc2UgPSBodHRwQ2xpZW50LnNlbmQocmVxdWVzdCkuZ2V0KCk7CiAgICBsb2dSZXNwb25zZShyZXNwb25zZSk7CgogICAgdmFyIHRpbWV6b25lID0gSlNPTi5wYXJzZShyZXNwb25zZS5nZXRFbnRpdHkoKS5nZXRTdHJpbmcoKSk7CiAgICB2YXIgbG9jYWxUaW1lc3RhbXAgPSBwYXJzZUludChub3cpICsgcGFyc2VJbnQodGltZXpvbmUuZHN0T2Zmc2V0KSArIHBhcnNlSW50KHRpbWV6b25lLnJhd09mZnNldCk7CiAgICBsb2NhbFRpbWUgPSBuZXcgRGF0ZShsb2NhbFRpbWVzdGFtcCoxMDAwKTsKfQoKZnVuY3Rpb24gZ2V0VXNlclBvc3RhbEFkZHJlc3MoKSB7CiAgICB2YXIgdXNlckFkZHJlc3NTZXQgPSBpZFJlcG9zaXRvcnkuZ2V0QXR0cmlidXRlKHVzZXJuYW1lLCAicG9zdGFsQWRkcmVzcyIpOwogICAgaWYgKHVzZXJBZGRyZXNzU2V0ID09IG51bGwgfHwgdXNlckFkZHJlc3NTZXQuaXNFbXB0eSgpKSB7CiAgICAgICAgbG9nZ2VyLndhcm5pbmcoIk5vIGFkZHJlc3Mgc3BlY2lmaWVkIGZvciB1c2VyOiAiICsgdXNlcm5hbWUpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB1c2VyQWRkcmVzc1NldC5pdGVyYXRvcigpLm5leHQoKQp9CgpmdW5jdGlvbiBsb2dSZXNwb25zZShyZXNwb25zZSkgewogICAgbG9nZ2VyLm1lc3NhZ2UoIlVzZXIgUkVTVCBDYWxsLiBTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSArICIsIEJvZHk6ICIgKyByZXNwb25zZS5nZXRFbnRpdHkoKS5nZXRTdHJpbmcoKSk7Cn0K\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_SERVER_SIDE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"484e6246-dbc6-4288-97e6-54e55431402e\",\"name\":\"Apple Profile Normalization\",\"description\":\"Normalizes raw profile data from Apple\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjEtMjAyMiBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICoKICogSW4gc29tZSBjb21tb24gZGVmYXVsdCBjb25maWd1cmF0aW9ucywgdGhlIGZvbGxvd2luZyBrZXlzIGFyZSByZXF1aXJlZCB0byBiZSBub3QgZW1wdHk6CiAqIHVzZXJuYW1lLCBnaXZlbk5hbWUsIGZhbWlseU5hbWUsIGVtYWlsLgogKgogKiBGcm9tIFJGQzQ1MTc6IEEgdmFsdWUgb2YgdGhlIERpcmVjdG9yeSBTdHJpbmcgc3ludGF4IGlzIGEgc3RyaW5nIG9mIG9uZSBvciBtb3JlCiAqIGFyYml0cmFyeSBjaGFyYWN0ZXJzIGZyb20gdGhlIFVuaXZlcnNhbCBDaGFyYWN0ZXIgU2V0IChVQ1MpLgogKiBBIHplcm8tbGVuZ3RoIGNoYXJhY3RlciBzdHJpbmcgaXMgbm90IHBlcm1pdHRlZC4KICovCgppbXBvcnQgc3RhdGljIG9yZy5mb3JnZXJvY2suanNvbi5Kc29uVmFsdWUuZmllbGQKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmpzb24KaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLm9iamVjdAoKU3RyaW5nIGVtYWlsID0gImNoYW5nZUBtZS5jb20iClN0cmluZyBzdWJqZWN0SWQgPSByYXdQcm9maWxlLnN1YgpTdHJpbmcgZmlyc3ROYW1lID0gIiAiClN0cmluZyBsYXN0TmFtZSA9ICIgIgpTdHJpbmcgdXNlcm5hbWUgPSBzdWJqZWN0SWQKU3RyaW5nIG5hbWUKCmlmIChyYXdQcm9maWxlLmlzRGVmaW5lZCgiZW1haWwiKSAmJiByYXdQcm9maWxlLmVtYWlsLmlzTm90TnVsbCgpKXsgLy8gVXNlciBjYW4gZWxlY3QgdG8gbm90IHNoYXJlIHRoZWlyIGVtYWlsCiAgICBlbWFpbCA9IHJhd1Byb2ZpbGUuZW1haWwuYXNTdHJpbmcoKQogICAgdXNlcm5hbWUgPSBlbWFpbAp9CmlmIChyYXdQcm9maWxlLmlzRGVmaW5lZCgibmFtZSIpICYmIHJhd1Byb2ZpbGUubmFtZS5pc05vdE51bGwoKSkgewogICAgaWYgKHJhd1Byb2ZpbGUubmFtZS5pc0RlZmluZWQoImZpcnN0TmFtZSIpICYmIHJhd1Byb2ZpbGUubmFtZS5maXJzdE5hbWUuaXNOb3ROdWxsKCkpIHsKICAgICAgICBmaXJzdE5hbWUgPSByYXdQcm9maWxlLm5hbWUuZmlyc3ROYW1lLmFzU3RyaW5nKCkKICAgIH0KICAgIGlmIChyYXdQcm9maWxlLm5hbWUuaXNEZWZpbmVkKCJsYXN0TmFtZSIpICYmIHJhd1Byb2ZpbGUubmFtZS5sYXN0TmFtZS5pc05vdE51bGwoKSkgewogICAgICAgIGxhc3ROYW1lID0gcmF3UHJvZmlsZS5uYW1lLmxhc3ROYW1lLmFzU3RyaW5nKCkKICAgIH0KfQoKbmFtZSA9IChmaXJzdE5hbWU/LnRyaW0oKSA/IGZpcnN0TmFtZSA6ICIiKSArIChsYXN0TmFtZT8udHJpbSgpID8gKChmaXJzdE5hbWU/LnRyaW0oKSA/ICIgIiA6ICIiKSArIGxhc3ROYW1lKSA6ICIiKQpuYW1lID0gICghbmFtZT8udHJpbSgpKSA/ICIgIiA6IG5hbWUKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCBzdWJqZWN0SWQpLAogICAgICAgIGZpZWxkKCJkaXNwbGF5TmFtZSIsIG5hbWUpLAogICAgICAgIGZpZWxkKCJlbWFpbCIsIGVtYWlsKSwKICAgICAgICBmaWVsZCgiZ2l2ZW5OYW1lIiwgZmlyc3ROYW1lKSwKICAgICAgICBmaWVsZCgiZmFtaWx5TmFtZSIsIGxhc3ROYW1lKSwKICAgICAgICBmaWVsZCgidXNlcm5hbWUiLCB1c2VybmFtZSkpKQ==\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"da56fe60-8b38-4c46-a405-d6b306d4b336\",\"name\":\"OAuth2 Evaluate Scope Script\",\"description\":\"Default global script for OAuth2 Scope Evaluation\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjEgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKLyoKICogVGhpcyBzY3JpcHQgbGV0cyB5b3UgcG9wdWxhdGUgdGhlIHNjb3BlcyB3aXRoIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlcyB3aGVuIHRoZSB0b2tlbmluZm8gZW5kcG9pbnQgaXMgY2FsbGVkLgogKiBGb3IgZXhhbXBsZSwgaWYgb25lIG9mIHRoZSBzY29wZXMgaXMgbWFpbCwgQU0gc2V0cyBtYWlsIHRvIHRoZSByZXNvdXJjZSBvd25lcidzIGVtYWlsIGFkZHJlc3MgaW4gdGhlIHRva2VuIGluZm9ybWF0aW9uIHJldHVybmVkLgogKgogKiBEZWZpbmVkIHZhcmlhYmxlczoKICogYWNjZXNzVG9rZW4gLSBBY2Nlc3NUb2tlbiAoMSkuCiAqICAgICAgICAgICAgICAgVGhlIGFjY2VzcyB0b2tlbiB0byBiZSB1cGRhdGVkLgogKiAgICAgICAgICAgICAgIE11dGFibGUgb2JqZWN0LCBhbGwgY2hhbmdlcyB0byB0aGUgYWNjZXNzIHRva2VuIHdpbGwgYmUgcmVmbGVjdGVkLgogKiBpZGVudGl0eSAtIEFNSWRlbnRpdHkgKDIpLgogKiAgICAgICAgICAgIFRoZSBjbGllbnQncyBpZGVudGl0eSBpZiBwcmVzZW50IG9yIHRoZSByZXNvdXJjZSBvd25lcidzIGlkZW50aXR5LiBDYW4gYmUgbnVsbC4KICogc2NyaXB0TmFtZSAtIFN0cmluZyAocHJpbWl0aXZlKS4KICogICAgICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzY3JpcHQuCiAqIGxvZ2dlciAtIEFsd2F5cyBwcmVzZW50LCB0aGUgZGVidWcgbG9nZ2VyIGluc3RhbmNlOgogKiAgICAgICAgICBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9zY3JpcHRpbmctZ3VpZGUvc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLmh0bWwjc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLgogKiAgICAgICAgICBDb3JyZXNwb25kaW5nIGxvZyBmaWxlcyB3aWxsIGJlIHByZWZpeGVkIHdpdGg6IHNjcmlwdHMuT0FVVEgyX0VWQUxVQVRFX1NDT1BFCiAqIGh0dHBDbGllbnQgLSBIVFRQIENsaWVudCAoMykuCiAqICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIEhUVFAgQ2xpZW50IGluc3RhbmNlOgogKiAgICAgICAgICAgICAgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvc2NyaXB0aW5nLWd1aWRlL3NjcmlwdGluZy1hcGktZ2xvYmFsLWh0dHAtY2xpZW50Lmh0bWwjc2NyaXB0aW5nLWFwaS1nbG9iYWwtaHR0cC1jbGllbnQuCiAqCiAqIFJldHVybiAtIGEgTWFwPFN0cmluZywgT2JqZWN0PiBvZiB0aGUgYWNjZXNzIHRva2VuJ3MgaW5mb3JtYXRpb24gKDQpLgogKgogKiBDbGFzcyByZWZlcmVuY2U6CiAqICgxKSBBY2Nlc3NUb2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vYXV0aDIvY29yZS9BY2Nlc3NUb2tlbi5odG1sLgogKiAoMikgQU1JZGVudGl0eSAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9pZG0vQU1JZGVudGl0eS5odG1sLgogKiAoMykgQ2xpZW50IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL2h0dHAvQ2xpZW50Lmh0bWwuCiAqICg0KSBNYXAgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS91dGlsL0hhc2hNYXAuaHRtbC4KICovCgovKioKICogRGVmYXVsdCBldmFsdWF0ZSBzY29wZSBzY3JpcHQgdG8gdXNlIGFzIGEgdGVtcGxhdGUgZm9yIG5ldyBzY3JpcHRzLgogKi8KCihmdW5jdGlvbiAoKSB7CiAgICB2YXIgbWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7CiAgICBpZiAoaWRlbnRpdHkgIT09IG51bGwpIHsKICAgICAgICB2YXIgc2NvcGVzID0gYWNjZXNzVG9rZW4uZ2V0U2NvcGUoKS50b0FycmF5KCk7CiAgICAgICAgc2NvcGVzLmZvckVhY2goZnVuY3Rpb24gKHNjb3BlKSB7CiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gaWRlbnRpdHkuZ2V0QXR0cmlidXRlKHNjb3BlKS50b0FycmF5KCk7CiAgICAgICAgICAgIG1hcC5wdXQoc2NvcGUsIGF0dHJpYnV0ZXMuam9pbigiLCIpKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgICAgbG9nZ2VyLmVycm9yKCdpZGVudGl0eSBpcyBudWxsJyk7CiAgICB9CiAgICByZXR1cm4gbWFwOwp9KCkpOw==\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"OAUTH2_EVALUATE_SCOPE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"1f389a3d-21cf-417c-a6d3-42ea620071f0\",\"name\":\"ForgeRock Internal: OIDC Claims Script\",\"description\":\"Internal OIDC Claims script\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMTQtMjAyMyBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUwogKiBvciB3aXRoIG9uZSBvZiBpdHMgYWZmaWxpYXRlcy4gQWxsIHVzZSBzaGFsbCBiZSBleGNsdXNpdmVseSBzdWJqZWN0CiAqIHRvIHN1Y2ggbGljZW5zZSBiZXR3ZWVuIHRoZSBsaWNlbnNlZSBhbmQgRm9yZ2VSb2NrIEFTLgogKi8KCi8qCiAqIFRoaXMgc2NyaXB0IGNvbXB1dGVzIGNsYWltIHZhbHVlcyByZXR1cm5lZCBpbiBJRCB0b2tlbnMgYW5kL29yIGF0IHRoZSBVc2VySW5mbyBFbmRwb2ludC4KICogVGhlIGNsYWltIHZhbHVlcyBhcmUgY29tcHV0ZWQgZm9yOgogKiB0aGUgY2xhaW1zIGRlcml2ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHNjb3BlcywKICogdGhlIGNsYWltcyBwcm92aWRlZCBieSB0aGUgYXV0aG9yaXphdGlvbiBzZXJ2ZXIsCiAqIGFuZCB0aGUgY2xhaW1zIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50IHZpYSB0aGUgY2xhaW1zIHBhcmFtZXRlci4KICoKICogSW4gdGhlIENPTkZJR1VSQVRJT04gQU5EIENVU1RPTUlaQVRJT04gc2VjdGlvbiwgeW91IGNhbgogKiBkZWZpbmUgdGhlIHNjb3BlLXRvLWNsYWltcyBtYXBwaW5nLCBhbmQKICogYXNzaWduIHRvIGVhY2ggY2xhaW0gYSByZXNvbHZlciBmdW5jdGlvbiB0aGF0IHdpbGwgY29tcHV0ZSB0aGUgY2xhaW0gdmFsdWUuCiAqCiAqIERlZmluZWQgdmFyaWFibGVzIChjbGFzcyByZWZlcmVuY2VzIGFyZSBwcm92aWRlZCBiZWxvdyk6CiAqIHNjb3BlcyAtIFNldDxTdHJpbmc+ICg2KS4KICogICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSByZXF1ZXN0ZWQgc2NvcGVzLgogKiBjbGFpbXMgLSBNYXA8U3RyaW5nLCBPYmplY3Q+ICg1KS4KICogICAgICAgICAgQWx3YXlzIHByZXNlbnQsIGRlZmF1bHQgc2VydmVyIHByb3ZpZGVkIGNsYWltcy4KICogY2xhaW1PYmplY3RzIC0gTGlzdDxDbGFpbT4gKDcsIDIpLgogKiAgICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIGRlZmF1bHQgc2VydmVyIHByb3ZpZGVkIGNsYWltcy4KICogcmVxdWVzdGVkQ2xhaW1zIC0gTWFwPFN0cmluZywgU2V0PFN0cmluZz4+ICg1KS4KICogICAgICAgICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIG5vdCBlbXB0eSBpZiB0aGUgcmVxdWVzdCBjb250YWlucyB0aGUgY2xhaW1zIHBhcmFtZXRlciBhbmQgdGhlIHNlcnZlciBoYXMgZW5hYmxlZAogKiAgICAgICAgICAgICAgICAgICBjbGFpbXNfcGFyYW1ldGVyX3N1cHBvcnRlZC4gQSBtYXAgb2YgdGhlIHJlcXVlc3RlZCBjbGFpbXMgdG8gcG9zc2libGUgdmFsdWVzLCBvdGhlcndpc2UgZW1wdHk7CiAqICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBjbGFpbXMgd2l0aCBubyByZXF1ZXN0ZWQgdmFsdWVzIHdpbGwgaGF2ZSBhIGtleSBidXQgbm8gdmFsdWUgaW4gdGhlIG1hcC4gQSBrZXkgd2l0aAogKiAgICAgICAgICAgICAgICAgICBhIHNpbmdsZSB2YWx1ZSBpbiBpdHMgU2V0ICg2KSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiByZXF1ZXN0ZWRUeXBlZENsYWltcyAtIExpc3Q8Q2xhaW0+ICg3LCAyKS4KICogICAgICAgICAgICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIHJlcXVlc3RlZCBjbGFpbXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdGVkIGNsYWltcyB3aXRoIG5vIHJlcXVlc3RlZCB2YWx1ZXMgd2lsbCBoYXZlIGEgY2xhaW0gd2l0aCBubyB2YWx1ZXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgQSBjbGFpbSB3aXRoIGEgc2luZ2xlIHZhbHVlIGluZGljYXRlcyB0aGlzIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiBjbGFpbXNMb2NhbGVzIC0gTGlzdDxTdHJpbmc+ICg3KS4KICogICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgZnJvbSB0aGUgJ2NsYWltc19sb2NhbGVzJyBwYXJhbWV0ZXIuCiAqICAgICAgICAgICAgICAgICBTZWUgaHR0cHM6Ly9vcGVuaWQubmV0L3NwZWNzL29wZW5pZC1jb25uZWN0LWNvcmUtMV8wLmh0bWwjQ2xhaW1zTGFuZ3VhZ2VzQW5kU2NyaXB0cyBmb3IgdGhlIE9JREMgc3BlY2lmaWNhdGlvbiBkZXRhaWxzLgogKiByZXF1ZXN0UHJvcGVydGllcyAtIFVubW9kaWZpYWJsZSBNYXAgKDUpLgogKiAgICAgICAgICAgICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCBjb250YWlucyBhIG1hcCBvZiByZXF1ZXN0IHByb3BlcnRpZXM6CiAqICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVyaSAtIFRoZSByZXF1ZXN0IFVSSS4KICogICAgICAgICAgICAgICAgICAgICByZWFsbSAtIFRoZSByZWFsbSB0aGF0IHRoZSByZXF1ZXN0IHJlbGF0ZXMgdG8uCiAqICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhcmFtcyAtIEEgbWFwIG9mIHRoZSByZXF1ZXN0IHBhcmFtcyBhbmQvb3IgcG9zdGVkIGRhdGEuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVhY2ggdmFsdWUgaXMgYSBsaXN0IG9mIG9uZSBvciBtb3JlIHByb3BlcnRpZXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBub3RlIHRoYXQgdGhlc2Ugc2hvdWxkIGJlIGhhbmRsZWQgaW4gYWNjb3JkYW5jZSB3aXRoIE9XQVNQIGJlc3QgcHJhY3RpY2VzOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL293YXNwLm9yZy93d3ctY29tbXVuaXR5L3Z1bG5lcmFiaWxpdGllcy9VbnNhZmVfdXNlX29mX1JlZmxlY3Rpb24uCiAqIGNsaWVudFByb3BlcnRpZXMgLSBVbm1vZGlmaWFibGUgTWFwICg1KS4KICogICAgICAgICAgICAgICAgICAgIFByZXNlbnQgaWYgdGhlIGNsaWVudCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIGlkZW50aWZpZWQsIGNvbnRhaW5zIGEgbWFwIG9mIGNsaWVudCBwcm9wZXJ0aWVzOgogKiAgICAgICAgICAgICAgICAgICAgY2xpZW50SWQgLSBUaGUgY2xpZW50J3MgVVJJIGZvciB0aGUgcmVxdWVzdCBsb2NhbGUuCiAqICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JhbnRUeXBlcyAtIExpc3Qgb2YgdGhlIGFsbG93ZWQgZ3JhbnQgdHlwZXMgKG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuR3JhbnRUeXBlKSBmb3IgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgIGFsbG93ZWRSZXNwb25zZVR5cGVzIC0gTGlzdCBvZiB0aGUgYWxsb3dlZCByZXNwb25zZSB0eXBlcyBmb3IgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgIGFsbG93ZWRTY29wZXMgLSBMaXN0IG9mIHRoZSBhbGxvd2VkIHNjb3BlcyBmb3IgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgIGN1c3RvbVByb3BlcnRpZXMgLSBBIG1hcCBvZiB0aGUgY3VzdG9tIHByb3BlcnRpZXMgb2YgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0cyBvciBtYXBzIHdpbGwgYmUgaW5jbHVkZWQgYXMgc3ViLW1hcHM7IGZvciBleGFtcGxlOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbU1hcFtLZXkxXT1WYWx1ZTEgd2lsbCBiZSByZXR1cm5lZCBhcyBjdXN0b21NYXAgLT4gS2V5MSAtPiBWYWx1ZTEuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gYWRkIGN1c3RvbSBwcm9wZXJ0aWVzIHRvIGEgY2xpZW50LCB1cGRhdGUgdGhlIEN1c3RvbSBQcm9wZXJ0aWVzIGZpZWxkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQU0gQ29uc29sZSA+IFJlYWxtIE5hbWUgPiBBcHBsaWNhdGlvbnMgPiBPQXV0aCAyLjAgPiBDbGllbnRzID4gQ2xpZW50IElEID4gQWR2YW5jZWQuCiAqIGlkZW50aXR5IC0gQU1JZGVudGl0eSAoMykuCiAqICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBpZGVudGl0eSBvZiB0aGUgcmVzb3VyY2Ugb3duZXIuCiAqIHNlc3Npb24gLSBTU09Ub2tlbiAoNCkuCiAqICAgICAgICAgICBQcmVzZW50IGlmIHRoZSByZXF1ZXN0IGNvbnRhaW5zIHRoZSBzZXNzaW9uIGNvb2tpZSwgdGhlIHVzZXIncyBzZXNzaW9uIG9iamVjdC4KICogc2NyaXB0TmFtZSAtIFN0cmluZyAocHJpbWl0aXZlKS4KICogICAgICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzY3JpcHQuCiAqIGxvZ2dlciAtIEFsd2F5cyBwcmVzZW50LCB0aGUgIk9BdXRoMlByb3ZpZGVyIiBkZWJ1ZyBsb2dnZXIgaW5zdGFuY2U6CiAqICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuaHRtbCNzY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuCiAqICAgICAgICAgIENvcnJlc3BvbmRpbmcgZmlsZXMgd2lsbCBiZSBwcmVmaXhlZCB3aXRoOiBzY3JpcHRzLk9JRENfQ0xBSU1TLgogKiBodHRwQ2xpZW50IC0gSFRUUCBDbGllbnQgKDgpLgogKiAgICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBIVFRQIENsaWVudCBpbnN0YW5jZToKICogICAgICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHRpbmctYXBpLWdsb2JhbC1odHRwLWNsaWVudC5odG1sI3NjcmlwdGluZy1hcGktZ2xvYmFsLWh0dHAtY2xpZW50LgogKiAgICAgICAgICAgICAgSW4gb3JkZXIgdG8gdXNlIHRoZSBjbGllbnQsIHlvdSBtYXkgbmVlZCB0byBhZGQKICogICAgICAgICAgICAgIG9yZy5mb3JnZXJvY2suaHR0cC5DbGllbnQsCiAqICAgICAgICAgICAgICBvcmcuZm9yZ2Vyb2NrLmh0dHAucHJvdG9jb2wuKiwKICogICAgICAgICAgICAgIGFuZCBvcmcuZm9yZ2Vyb2NrLnV0aWwucHJvbWlzZS5Qcm9taXNlSW1wbAogKiAgICAgICAgICAgICAgdG8gdGhlIGFsbG93ZWQgSmF2YSBjbGFzc2VzIGluIHRoZSBzY3JpcHRpbmcgZW5naW5lIGNvbmZpZ3VyYXRpb24sIGFzIGRlc2NyaWJlZCBpbjoKICogICAgICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHQtZW5naW5lLXNlY3VyaXR5Lmh0bWwKICoKICogUmV0dXJuIC0gYSBuZXcgVXNlckluZm9DbGFpbXMoTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZXMsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gY29tcG9zaXRlU2NvcGVzKSAoMSkgb2JqZWN0LgogKiAgICAgICAgICBUaGUgcmVzdWx0IG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpbiB0aGUgc2NyaXB0IGlzIHJldHVybmVkIHRvIHRoZSBzZXJ2ZXIuCiAqICAgICAgICAgIEN1cnJlbnRseSwgdGhlIEltbWVkaWF0ZWx5IEludm9rZWQgRnVuY3Rpb24gRXhwcmVzc2lvbiAoYWxzbyBrbm93biBhcyBTZWxmLUV4ZWN1dGluZyBBbm9ueW1vdXMgRnVuY3Rpb24pCiAqICAgICAgICAgIGlzIHRoZSBsYXN0IChhbmQgb25seSkgc3RhdGVtZW50IGluIHRoaXMgc2NyaXB0LCBhbmQgaXRzIHJldHVybiB2YWx1ZSB3aWxsIGJlY29tZSB0aGUgc2NyaXB0IHJlc3VsdC4KICogICAgICAgICAgRG8gbm90IHVzZSAicmV0dXJuIHZhcmlhYmxlIiBzdGF0ZW1lbnQgb3V0c2lkZSBvZiBhIGZ1bmN0aW9uIGRlZmluaXRpb24uCiAqICAgICAgICAgIFNlZSBSRVNVTFRTIHNlY3Rpb24gZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KICoKICogQ2xhc3MgcmVmZXJlbmNlOgogKiAoMSkgVXNlckluZm9DbGFpbXMgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb2F1dGgyL2NvcmUvVXNlckluZm9DbGFpbXMuaHRtbC4KICogKDIpIENsYWltIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbCkuCiAqICAgICAgICAgQW4gaW5zdGFuY2Ugb2Ygb3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltIGhhcyBtZXRob2RzIHRvIGFjY2VzcwogKiAgICAgICAgIHRoZSBjbGFpbSBuYW1lLCByZXF1ZXN0ZWQgdmFsdWVzLCBsb2NhbGUsIGFuZCB3aGV0aGVyIHRoZSBjbGFpbSBpcyBlc3NlbnRpYWwuCiAqICgzKSBBTUlkZW50aXR5IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L2lkbS9BTUlkZW50aXR5Lmh0bWwuCiAqICg0KSBTU09Ub2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3MvY29tL2lwbGFuZXQvc3NvL1NTT1Rva2VuLmh0bWwuCiAqICg1KSBNYXAgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS91dGlsL0hhc2hNYXAuaHRtbCwKICogICAgICAgICAgIG9yIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL3V0aWwvTGlua2VkSGFzaE1hcC5odG1sLgogKiAoNikgU2V0IC0gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9IYXNoU2V0Lmh0bWwuCiAqICg3KSBMaXN0IC0gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9BcnJheUxpc3QuaHRtbC4KICogKDgpIENsaWVudCAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9odHRwL0NsaWVudC5odG1sLgoqLwoKKGZ1bmN0aW9uICgpIHsKICAgIC8vIFNFVFVQCgogICAgLyoqCiAgICAgKiBDbGFpbSBwcm9jZXNzaW5nIHV0aWxpdGllcy4KICAgICAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHJldXNhYmxlIGZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyBjbGFpbXMuCiAgICAgKiBAc2VlIENMQUlNIFBST0NFU1NJTkcgVVRJTElUSUVTIHNlY3Rpb24gZm9yIGRldGFpbHMuCiAgICAgKi8KICAgIHZhciB1dGlscyA9IGdldFV0aWxzKCk7CgogICAgLy8gQ09ORklHVVJBVElPTiBBTkQgQ1VTVE9NSVpBVElPTgoKICAgIC8qKgogICAgICogT0F1dGggMi4wIHNjb3BlIHZhbHVlcyAoc2NvcGVzKSBjYW4gYmUgdXNlZCBieSB0aGUgQ2xpZW50IHRvIHJlcXVlc3QgT0lEQyBjbGFpbXMuCiAgICAgKgogICAgICogQ2FsbCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kLCBhbmQgcGFzcyBpbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAqIGFuIG9iamVjdCB0aGF0IG1hcHMgYSBzY29wZSB2YWx1ZSB0byBhbiBhcnJheSBvZiBjbGFpbSBuYW1lcwogICAgICogdG8gc3BlY2lmeSB3aGljaCBjbGFpbXMgbmVlZCB0byBiZSBwcm9jZXNzZWQgYW5kIHJldHVybmVkIGZvciB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI1Njb3BlQ2xhaW1zfQogICAgICogZm9yIHRoZSBzY29wZSB2YWx1ZXMgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlcXVlc3QgY2xhaW1zIGFzIGRlZmluZWQgaW4gdGhlIE9JREMgc3BlY2lmaWNhdGlvbi4KICAgICAqCiAgICAgKiBCZWxvdywgZmluZCBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0aGF0IGlzIGV4cGVjdGVkIHRvIHdvcmsgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCiAgICAgKgogICAgICogQ1VTVE9NSVpBVElPTgogICAgICogWW91IGNhbiBjaG9vc2UgdGhlIGNsYWltIG5hbWVzIHJldHVybmVkIGZvciBhIHNjb3BlLgogICAgICovCiAgICB1dGlscy5zZXRTY29wZUNsYWltc01hcCh7CiAgICAgICAgcHJvZmlsZTogWwogICAgICAgICAgICAnbmFtZScsCiAgICAgICAgICAgICdmYW1pbHlfbmFtZScsCiAgICAgICAgICAgICdnaXZlbl9uYW1lJywKICAgICAgICAgICAgJ3pvbmVpbmZvJywKICAgICAgICAgICAgJ2xvY2FsZScKICAgICAgICBdLAogICAgICAgIGVtYWlsOiBbJ2VtYWlsJ10sCiAgICAgICAgYWRkcmVzczogWydhZGRyZXNzJ10sCiAgICAgICAgcGhvbmU6IFsncGhvbmVfbnVtYmVyJ10KICAgIH0pOwoKICAgIC8qKgogICAgICogSW4gdGhpcyBzY3JpcHQsIGVhY2ggY2xhaW0KICAgICAqIGRlcml2ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHNjb3BlcywKICAgICAqIHByb3ZpZGVkIGJ5IHRoZSBhdXRob3JpemF0aW9uIHNlcnZlciwgYW5kCiAgICAgKiByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCB2aWEgdGhlIGNsYWltcyBwYXJhbWV0ZXIKICAgICAqIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IGEgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGFpbSBuYW1lLgogICAgICoKICAgICAqIENhbGwgdGhpcyBjb25maWd1cmF0aW9uIG1ldGhvZCwgYW5kIHBhc3MgaW4gYXMgdGhlIGZpcnN0IGFyZ3VtZW50CiAgICAgKiBhbiBvYmplY3QgdGhhdCBtYXBzIGEgY2xhaW0gbmFtZSB0byBhIHJlc29sdmVyIGZ1bmN0aW9uLAogICAgICogd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGV4ZWN1dGVkIGZvciBlYWNoIGNsYWltIHByb2Nlc3NlZCBieSB0aGUgc2NyaXB0LgogICAgICoKICAgICAqIFRoZSBjbGFpbSByZXNvbHZlciBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgdGhlIHJlcXVlc3RlZCBjbGFpbSBpbmZvcm1hdGlvbgogICAgICogaW4gYW4gaW5zdGFuY2Ugb2Ygb3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuaWRjb25uZWN0L0NsYWltLmh0bWx9CiAgICAgKiBmb3IgZGV0YWlscyBvbiB0aGUgQ2xhaW0gY2xhc3MuCiAgICAgKgogICAgICogSWYgdGhlIGNsYWltIHJlc29sdmVyIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSwKICAgICAqIG90aGVyIHRoYW4gdW5kZWZpbmVkIG9yIG51bGwsCiAgICAgKiB0aGUgY2xhaW0gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgc2NyaXB0J3MgcmVzdWx0cy4KICAgICAqCiAgICAgKiBUaGUgQ2xhaW0gaW5zdGFuY2UgcHJvdmlkZXMgbWV0aG9kcyB0byBjaGVjawogICAgICogd2hhdCB0aGUgbmFtZSBvZiB0aGUgY2xhaW0gaXMsCiAgICAgKiB3aGljaCB2YWx1ZXMgdGhlIGNsYWltIHJlcXVlc3QgY29udGFpbnMsCiAgICAgKiB3aGV0aGVyIHRoZSBjbGFpbSBpcyBlc3NlbnRpYWwsIGFuZAogICAgICogd2hpY2ggbG9jYWxlIHRoZSBjbGFpbSBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgKiBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gY2FuIGNvbnNpZGVyIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjb21wdXRpbmcgYW5kIHJldHVybmluZyB0aGUgY2xhaW0gdmFsdWUuCiAgICAgKgogICAgICogQmVsb3csIGZpbmQgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdGhhdCBpcyBleHBlY3RlZCB0byB3b3JrIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LgogICAgICogQSByZXVzYWJsZSBmdW5jdGlvbiwgdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKFN0cmluZyBhdHRyaWJ1dGUtbmFtZSksCiAgICAgKiBpcyBjYWxsZWQgdG8gcmV0dXJuIGEgY2xhaW0gcmVzb2x2ZXIgZnVuY3Rpb24gYmFzZWQgb24gYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlLgogICAgICogQHNlZSBDTEFJTSBSRVNPTFZFUlMgc2VjdGlvbiBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIGV4YW1wbGVzLgogICAgICogRm9yIHRoZSBhZGRyZXNzIGNsYWltLCBhbiBleGFtcGxlIG9mIGEgY2xhaW0gcmVzb2x2ZXIgdGhhdCB1c2VzIGFub3RoZXIgY2xhaW0gcmVzb2x2ZXIgaXMgcHJvdmlkZWQuCiAgICAgKgogICAgICogQ1VTVE9NSVpBVElPTgogICAgICogWW91IGNhbiByZXVzZSB0aGUgcHJlZGVmaW5lZCB1dGlscyBtZXRob2RzIHdpdGggeW91ciBjdXN0b20gYXJndW1lbnRzLgogICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBjdXN0b20gcmVzb2x2ZXIgZnVuY3Rpb24gZm9yIGEgY2xhaW0gbmFtZSwKICAgICAqIHRoYXQgd2lsbCBjb21wdXRlIGFuZCByZXR1cm4gdGhlIGNsYWltIHZhbHVl4oCUYXMgc2hvd24gaW4gdGhlIGNvbW1lbnRlZCBvdXQgZXhhbXBsZSBiZWxvdy4KICAgICAqLwogICAgdXRpbHMuc2V0Q2xhaW1SZXNvbHZlcnMoewogICAgICAgIC8qCiAgICAgICAgLy8gQW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBjbGFpbSByZXNvbHZlciBmdW5jdGlvbiB0aGF0IGlzIGRlZmluZWQgZm9yIGEgY2xhaW0KICAgICAgICAvLyBkaXJlY3RseSBpbiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3Q6CiAgICAgICAgY3VzdG9tLWNsYWltLW5hbWU6IGZ1bmN0aW9uIChyZXF1ZXN0ZWRDbGFpbSkgewogICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGluaXRpYWxseSwgdGhlIGNsYWltIHZhbHVlIGNvbWVzIHN0cmFpZ2h0IGZyb20gYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlOgogICAgICAgICAgICB2YXIgY2xhaW1WYWx1ZSA9IGlkZW50aXR5LmdldEF0dHJpYnV0ZSgnY3VzdG9tLWF0dHJpYnV0ZS1uYW1lJykudG9BcnJheSgpWzBdCgogICAgICAgICAgICAvLyBPcHRpb25hbGx5LCBwcm92aWRlIGFkZGl0aW9uYWwgbG9naWMgZm9yIHByb2Nlc3NpbmcgKGZpbHRlcmluZywgZm9ybWF0dGluZywgZXRjLikgdGhlIGNsYWltIHZhbHVlLgogICAgICAgICAgICAvLyBZb3UgY2FuIHVzZToKICAgICAgICAgICAgLy8gcmVxdWVzdGVkQ2xhaW0uZ2V0TmFtZSgpCiAgICAgICAgICAgIC8vIHJlcXVlc3RlZENsYWltLmdldFZhbHVlcygpCiAgICAgICAgICAgIC8vIHJlcXVlc3RlZENsYWltLmdldExvY2FsZSgpCiAgICAgICAgICAgIC8vIHJlcXVlc3RlZENsYWltLmlzRXNzZW50aWFsKCkKCiAgICAgICAgICAgIHJldHVybiBjbGFpbVZhbHVlCiAgICAgICAgfSwKICAgICAgICAqLwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB1c2Ugb2YgdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyIHNob3dzIGhvdwogICAgICAgICAqIGFuIGFyZ3VtZW50IHBhc3NlZCB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYWltIHJlc29sdmVyCiAgICAgICAgICogYmVjb21lcyBhdmFpbGFibGUgdG8gdGhlIHJlc29sdmVyIGZ1bmN0aW9uICh2aWEgaXRzIGxleGljYWwgY29udGV4dCkuCiAgICAgICAgICovCiAgICAgICAgbmFtZTogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdjbicpLAogICAgICAgIGZhbWlseV9uYW1lOiB1dGlscy5nZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXIoJ3NuJyksCiAgICAgICAgZ2l2ZW5fbmFtZTogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdnaXZlbm5hbWUnKSwKICAgICAgICB6b25laW5mbzogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdwcmVmZXJyZWR0aW1lem9uZScpLAogICAgICAgIGxvY2FsZTogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdwcmVmZXJyZWRsb2NhbGUnKSwKICAgICAgICBlbWFpbDogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdtYWlsJyksCiAgICAgICAgYWRkcmVzczogdXRpbHMuZ2V0QWRkcmVzc0NsYWltUmVzb2x2ZXIoCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgcGFzc2VkIGluIHVzZXIgcHJvZmlsZSBjbGFpbSByZXNvbHZlciBmdW5jdGlvbgogICAgICAgICAgICAgKiBjYW4gYmUgdXNlZCBieSB0aGUgYWRkcmVzcyBjbGFpbSByZXNvbHZlciBmdW5jdGlvbgogICAgICAgICAgICAgKiB0byBvYnRhaW4gdGhlIGNsYWltIHZhbHVlIHRvIGJlIGZvcm1hdHRlZCBhcyBwZXIgdGhlIE9JREMgc3BlY2lmaWNhdGlvbjoKICAgICAgICAgICAgICogQHNlZSBodHRwczovL29wZW5pZC5uZXQvc3BlY3Mvb3BlbmlkLWNvbm5lY3QtY29yZS0xXzAuaHRtbCNBZGRyZXNzQ2xhaW0uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB1dGlscy5nZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXIoJ3Bvc3RhbGFkZHJlc3MnKQogICAgICAgICksCiAgICAgICAgcGhvbmVfbnVtYmVyOiB1dGlscy5nZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXIoJ3RlbGVwaG9uZW51bWJlcicpCiAgICB9KTsKCiAgICAvLyBDTEFJTSBQUk9DRVNTSU5HIFVUSUxJVElFUwoKICAgIC8qKgogICAgICogQHJldHVybnMge29iamVjdH0gQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgcmV1c2FibGUgY2xhaW0gcHJvY2Vzc2luZyB1dGlsaXRpZXMuCiAgICAgKiBAc2VlIFBVQkxJQyBNRVRIT0RTIHNlY3Rpb24gYW5kIHRoZSByZXR1cm4gc3RhdGVtZW50IGZvciB0aGUgbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFV0aWxzICgpIHsKICAgICAgICAvLyBJTVBPUlQgSkFWQQoKICAgICAgICAvKioKICAgICAgICAgKiBQcm92aWRlcyBKYXZhIHNjcmlwdGluZyBmdW5jdGlvbmFsaXR5LgogICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvTW96aWxsYS9Qcm9qZWN0cy9SaGluby9TY3JpcHRpbmdfSmF2YSNqYXZhaW1wb3J0ZXJfY29uc3RydWN0b3J9LgogICAgICAgICAqLwogICAgICAgIHZhciBmckphdmEgPSBKYXZhSW1wb3J0ZXIoCiAgICAgICAgICAgIG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiwKICAgICAgICAgICAgb3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5Vc2VySW5mb0NsYWltcywKICAgICAgICAgICAgb3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltLAoKICAgICAgICAgICAgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAsCiAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QKICAgICAgICApOwoKICAgICAgICAvLyBTRVQgVVAgQ09ORklHVVJBVElPTgoKICAgICAgICAvKioKICAgICAgICAgKiBQbGFjZWhvbGRlciBmb3IgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB0aGF0IGNvbnRhaW5zCiAgICAgICAgICogYW4gb2JqZWN0IHRoYXQgbWFwcyB0aGUgc3VwcG9ydGVkIHNjb3BlIHZhbHVlcyAoc2NvcGVzKQogICAgICAgICAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjbGFpbSBuYW1lcyBmb3IgZWFjaCBzY29wZSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB2YXIgc2NvcGVDbGFpbXNNYXA7CgogICAgICAgIC8qKgogICAgICAgICAqIFBsYWNlaG9sZGVyIGZvciBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRoYXQgY29udGFpbnMKICAgICAgICAgKiBhbiBvYmplY3QgdGhhdCBtYXBzIHRoZSBzdXBwb3J0ZWQgY2xhaW0gbmFtZXMKICAgICAgICAgKiBhbmQgdGhlIHJlc29sdmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdGhlIGNsYWltIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIHZhciBjbGFpbVJlc29sdmVyczsKCiAgICAgICAgLyoqCiAgICAgICAgICogQSAocHVibGljKSBtZXRob2QgdGhhdCBhY2NlcHRzIGFuIG9iamVjdCB0aGF0IG1hcHMgdGhlIHN1cHBvcnRlZCBzY29wZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYWltIG5hbWVzLAogICAgICAgICAqIGFuZCBhc3NpZ25zIGl0IHRvIGEgKHByaXZhdGUpIHZhcmlhYmxlIHRoYXQgc2VydmVzIGFzIGEgY29uZmlndXJhdGlvbiBvcHRpb24uCiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyAtIEFuIG9iamVjdCB0aGF0IG1hcHMgZWFjaCBzdXBwb3J0ZWQgc2NvcGUgdmFsdWUgdG8gYW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMsCiAgICAgICAgICogaW4gb3JkZXIgdG8gc3BlY2lmeSB3aGljaCBjbGFpbXMgbmVlZCB0byBiZSBwcm9jZXNzZWQgZm9yIHRoZSByZXF1ZXN0ZWQgc2NvcGVzLgogICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI1Njb3BlQ2xhaW1zfSBmb3IgZGV0YWlscy4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcGFyYW1zLnByb2ZpbGVdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIHByb2ZpbGUgc2NvcGUgaXMgcmVxdWVzdGVkLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtwYXJhbXMuZW1haWxdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIGVtYWlsIHNjb3BlIGlzIHJlcXVlc3RlZC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcGFyYW1zLmFkZHJlc3NdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIGFkZHJlc3Mgc2NvcGUgaXMgcmVxdWVzdGVkLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtwYXJhbXMucGhvbmVdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIHBob25lIHNjb3BlIGlzIHJlcXVlc3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNldFNjb3BlQ2xhaW1zTWFwKHBhcmFtcykgewogICAgICAgICAgICBzY29wZUNsYWltc01hcCA9IHBhcmFtczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEEgKHB1YmxpYykgbWV0aG9kIHRoYXQgYWNjZXB0cyBhbiBvYmplY3QgdGhhdCBtYXBzIHRoZSBzdXBwb3J0ZWQgY2xhaW0gbmFtZXMKICAgICAgICAgKiBhbmQgdGhlIHJlc29sdmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdGhlIGNsYWltIHZhbHVlLAogICAgICAgICAqIGFuZCBhc3NpZ25zIGl0IHRvIGEgKHByaXZhdGUpIHZhcmlhYmxlIHRoYXQgc2VydmVzIGFzIGEgY29uZmlndXJhdGlvbiBvcHRpb24uCiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyAtIEFuIG9iamVjdCB0aGF0IG1hcHMKICAgICAgICAgKiBlYWNoIHN1cHBvcnRlZCBjbGFpbSBuYW1lIHRvIGEgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgY2xhaW0gdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc2V0Q2xhaW1SZXNvbHZlcnMocGFyYW1zKSB7CiAgICAgICAgICAgIGNsYWltUmVzb2x2ZXJzID0gcGFyYW1zOwogICAgICAgIH0KCiAgICAgICAgLy8gQ0xBSU0gUkVTT0xWRVJTCgogICAgICAgIC8qKgogICAgICAgICAqIENsYWltIHJlc29sdmVycyBhcmUgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGEgY2xhaW0gdmFsdWUuCiAgICAgICAgICogQHBhcmFtIHsqfQogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGEgY2xhaW0gcmVzb2x2ZXIgYmFzZWQgb24gYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gTmFtZSBvZiB0aGUgdXNlciBwcm9maWxlIGF0dHJpYnV0ZS4KICAgICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGRldGVybWluZSB0aGUgY2xhaW0gdmFsdWUKICAgICAgICAgKiBiYXNlZCBvbiB0aGUgdXNlciBwcm9maWxlIGF0dHJpYnV0ZSBhbmQgdGhlIChyZXF1ZXN0ZWQpIGNsYWltIHByb3BlcnRpZXMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyIChhdHRyaWJ1dGVOYW1lKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZXNvbHZlcyBhIGNsYWltIHdpdGggYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlLgogICAgICAgICAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgaWRlbnRpdHkgYXR0cmlidXRlIGlzIG5vdCBwb3B1bGF0ZWQsCiAgICAgICAgICAgICAqIE9SIGlmIHRoZSBjbGFpbSBoYXMgcmVxdWVzdGVkIHZhbHVlcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZSBpZGVudGl0eSBhdHRyaWJ1dGUgdmFsdWUuCiAgICAgICAgICAgICAqIEFUVEVOVElPTjogdGhlIGFmb3JlbWVudGlvbmVkIGNvbXBhcmlzb24gaXMgY2FzZS1zZW5zaXRpdmUuCiAgICAgICAgICAgICAqIEBwYXJhbSB7b3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltfSBjbGFpbQogICAgICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG9idGFpbiBpbmZvcm1hdGlvbi9yZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhaW0uCiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuaWRjb25uZWN0L0NsYWltLmh0bWx9IGZvciBkZXRhaWxzLgogICAgICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfEhhc2hTZXR8dW5kZWZpbmVkfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZUNsYWltKGNsYWltKSB7CiAgICAgICAgICAgICAgICB2YXIgdXNlclByb2ZpbGVWYWx1ZTsKCiAgICAgICAgICAgICAgICBpZiAoaWRlbnRpdHkpIHsKICAgICAgICAgICAgICAgICAgICB1c2VyUHJvZmlsZVZhbHVlID0gZ2V0Q2xhaW1WYWx1ZUZyb21TZXQoY2xhaW0sIGlkZW50aXR5LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSk7CgogICAgICAgICAgICAgICAgICAgIGlmICh1c2VyUHJvZmlsZVZhbHVlICYmICF1c2VyUHJvZmlsZVZhbHVlLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsYWltLmdldFZhbHVlcygpIHx8IGNsYWltLmdldFZhbHVlcygpLmlzRW1wdHkoKSB8fCBjbGFpbS5nZXRWYWx1ZXMoKS5jb250YWlucyh1c2VyUHJvZmlsZVZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJQcm9maWxlVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhaW07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGFkZHJlc3MgY2xhaW0gcmVzb2x2ZXIgYmFzZWQgb24gYSBjbGFpbSB2YWx1ZSBvYnRhaW5lZCB3aXRoIGFub3RoZXIgY2xhaW0gcmVzb2x2ZXIuCiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZUNsYWltIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBjbGFpbSB2YWx1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGFjY2VwdCBhIGNsYWltIGFzIGFuIGFyZ3VtZW50LAogICAgICAgICAqIHJ1biB0aGUgY2xhaW0gcmVzb2x2ZXIgZnVuY3Rpb24gZm9yIHRoZSBjbGFpbSBhbmQgb2J0YWluIHRoZSBjbGFpbSB2YWx1ZSwKICAgICAgICAgKiBhbmQgYXBwbHkgYWRkaXRpb25hbCBmb3JtYXR0aW5nIHRvIHRoZSB2YWx1ZSBiZWZvcmUgcmV0dXJuaW5nIGl0LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldEFkZHJlc3NDbGFpbVJlc29sdmVyIChyZXNvbHZlQ2xhaW0pIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENyZWF0ZXMgYW4gYWRkcmVzcyBjbGFpbSBvYmplY3QgZnJvbSBhIHZhbHVlIHJldHVybmVkIGJ5IGEgY2xhaW0gcmVzb2x2ZXIsCiAgICAgICAgICAgICAqIGFuZCByZXR1cm5zIHRoZSBhZGRyZXNzIGNsYWltIG9iamVjdCBhcyB0aGUgY2xhaW0gdmFsdWUuCiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI0FkZHJlc3NDbGFpbX0uCiAgICAgICAgICAgICAqIFRoZSBjbGFpbSB2YWx1ZSBpcyBvYnRhaW5lZCB3aXRoIGEgY2xhaW0gcmVzb2x2aW5nIGZ1bmN0aW9uIGF2YWlsYWJsZSBmcm9tIHRoZSBjbG9zdXJlLgogICAgICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBvYnRhaW4gaW5mb3JtYXRpb24vcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIGNsYWltLgogICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmlkY29ubmVjdC9DbGFpbS5odG1sfSBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICogQHJldHVybnMge2phdmEudXRpbC5MaW5rZWRIYXNoTWFwfHVuZGVmaW5lZH0gVGhlIGFkZHJlc3MgY2xhaW0gb2JqZWN0IGNyZWF0ZWQgZnJvbSBhIGNsYWltIHZhbHVlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZUFkZHJlc3NDbGFpbShjbGFpbSkgewogICAgICAgICAgICAgICAgdmFyIGNsYWltVmFsdWUgPSByZXNvbHZlQ2xhaW0oY2xhaW0pOwogICAgICAgICAgICAgICAgdmFyIGFkZHJlc3NPYmplY3Q7CgogICAgICAgICAgICAgICAgaWYgKGlzQ2xhaW1WYWx1ZVZhbGlkKGNsYWltVmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgYWRkcmVzc09iamVjdCA9IG5ldyBmckphdmEuTGlua2VkSGFzaE1hcCgpOwoKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzT2JqZWN0LnB1dCgnZm9ybWF0dGVkJywgY2xhaW1WYWx1ZSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRyZXNzT2JqZWN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFkZHJlc3NDbGFpbTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gZXNzZW50aWFsIGNsYWltIHJlc29sdmVyIGJhc2VkIG9uIGEgY2xhaW0gdmFsdWUgb2J0YWluZWQgd2l0aCBhbm90aGVyIGNsYWltIHJlc29sdmVyLgogICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlc29sdmVDbGFpbSAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgY2xhaW0gdmFsdWUuCiAgICAgICAgICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBhY2NlcHQgYSBjbGFpbSBhcyBhbiBhcmd1bWVudCwKICAgICAgICAgKiBydW4gdGhlIGNsYWltIHJlc29sdmVyIGZ1bmN0aW9uIGZvciB0aGUgY2xhaW0gYW5kIG9idGFpbiB0aGUgY2xhaW0gdmFsdWUsCiAgICAgICAgICogYW5kIGFwcGx5IGFkZGl0aW9uYWwgbG9naWMgZm9yIGVzc2VudGlhbCBjbGFpbXMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0RXNzZW50aWFsQ2xhaW1SZXNvbHZlciAocmVzb2x2ZUNsYWltKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZXR1cm5zIGEgY2xhaW0gdmFsdWUgb3IgdGhyb3dzIGFuIGVycm9yLgogICAgICAgICAgICAgKiBUaGUgY2xhaW0gdmFsdWUgaXMgb2J0YWluZWQgd2l0aCBhIGNsYWltIHJlc29sdmluZyBmdW5jdGlvbiBhdmFpbGFibGUgZnJvbSB0aGUgY2xvc3VyZS4KICAgICAgICAgICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgY2xhaW0gaXMgZXNzZW50aWFsIGFuZCBubyB2YWx1ZSBpcyByZXR1cm5lZCBmb3IgdGhlIGNsYWltLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBVc2Ugb2YgdGhpcyByZXNvbHZlciBpcyBvcHRpb25hbC4KICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9vcGVuaWQubmV0L3NwZWNzL29wZW5pZC1jb25uZWN0LWNvcmUtMV8wLmh0bWwjSW5kaXZpZHVhbENsYWltc1JlcXVlc3RzfSBzdGF0aW5nOgogICAgICAgICAgICAgKiAiTm90ZSB0aGF0IGV2ZW4gaWYgdGhlIENsYWltcyBhcmUgbm90IGF2YWlsYWJsZSBiZWNhdXNlIHRoZSBFbmQtVXNlciBkaWQgbm90IGF1dGhvcml6ZSB0aGVpciByZWxlYXNlIG9yIHRoZXkgYXJlIG5vdCBwcmVzZW50LAogICAgICAgICAgICAgKiB0aGUgQXV0aG9yaXphdGlvbiBTZXJ2ZXIgTVVTVCBOT1QgZ2VuZXJhdGUgYW4gZXJyb3Igd2hlbiBDbGFpbXMgYXJlIG5vdCByZXR1cm5lZCwgd2hldGhlciB0aGV5IGFyZSBFc3NlbnRpYWwgb3IgVm9sdW50YXJ5LAogICAgICAgICAgICAgKiB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNwZWNpZmljIGNsYWltLiIKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtvcmcuZm9yZ2Vyb2NrLm9wZW5pZGNvbm5lY3QuQ2xhaW19IGNsYWltCiAgICAgICAgICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgdG8gb2J0YWluIGluZm9ybWF0aW9uL3JlcXVpcmVtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBjbGFpbS4KICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbH0gZm9yIGRldGFpbHMuCiAgICAgICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAgICAgKiBAdGhyb3dzIHtvcmcuZm9yZ2Vyb2NrLm9hdXRoMi5jb3JlLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb259CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiByZXNvbHZlRXNzZW50aWFsQ2xhaW0oY2xhaW0pIHsKICAgICAgICAgICAgICAgIHZhciBjbGFpbVZhbHVlID0gcmVzb2x2ZUNsYWltKGNsYWltKTsKCiAgICAgICAgICAgICAgICBpZiAoY2xhaW0uaXNFc3NlbnRpYWwoKSAmJiAhaXNDbGFpbVZhbHVlVmFsaWQoY2xhaW1WYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZnJKYXZhLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCdDb3VsZCBub3QgcHJvdmlkZSB2YWx1ZSBmb3IgZXNzZW50aWFsIGNsYWltOiAnICsgY2xhaW0uZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1WYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVFc3NlbnRpYWxDbGFpbTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGRlZmF1bHQgcmVzb2x1dGlvbiBmb3IgYSBjbGFpbS4KICAgICAgICAgKiBVc2UgaXQgaWYgYSBjbGFpbS1zcGVjaWZpYyByZXNvbHZlciBpcyBub3QgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG9idGFpbiBpbmZvcm1hdGlvbi9yZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhaW0uCiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbH0gZm9yIGRldGFpbHMuCiAgICAgICAgICogQHJldHVybnMgeyp9IEEgc2luZ2xlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYWltLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHJlc29sdmVBbnlDbGFpbSAoY2xhaW0pIHsKICAgICAgICAgICAgaWYgKGNsYWltLmdldFZhbHVlcygpLnNpemUoKSA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNsYWltLmdldFZhbHVlcygpLnRvQXJyYXkoKVswXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVVRJTElUSUVTCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgY2xhaW0gdmFsdWUgZnJvbSBhIHNldC4KICAgICAgICAgKiBJZiB0aGUgc2V0IGNvbnRhaW5zIGEgc2luZ2xlIHZhbHVlLCByZXR1cm5zIHRoZSB2YWx1ZS4KICAgICAgICAgKiBJZiB0aGUgc2V0IGNvbnRhaW5zIG11bHRpcGxlIHZhbHVlcywgcmV0dXJucyB0aGUgc2V0LgogICAgICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyB1bmRlZmluZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG9idGFpbiBpbmZvcm1hdGlvbi9yZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhaW0uCiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbH0gZm9yIGRldGFpbHMuCiAgICAgICAgICogQHBhcmFtIHtqYXZhLnV0aWwuSGFzaFNldH0gc2V0IFRoZSBzZXTigJRmb3IgZXhhbXBsZSwgYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd8amF2YS51dGlsLkhhc2hTZXR8dW5kZWZpbmVkfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldENsYWltVmFsdWVGcm9tU2V0IChjbGFpbSwgc2V0KSB7CiAgICAgICAgICAgIGlmIChzZXQgJiYgc2V0LnNpemUoKSkgewogICAgICAgICAgICAgICAgaWYgKHNldC5zaXplKCkgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0LnRvQXJyYXkoKVswXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChsb2dnZXIud2FybmluZ0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ09JREMgQ2xhaW1zIHNjcmlwdC4gR290IGFuIGVtcHR5IHNldCBmb3IgY2xhaW06ICcgKyBjbGFpbS5nZXROYW1lKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBpc0NsYWltVmFsdWVWYWxpZCAoY2xhaW1WYWx1ZSkgewogICAgICAgICAgICBpZiAodHlwZW9mIGNsYWltVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IGNsYWltVmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBDTEFJTSBQUk9DRVNTSU5HCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHBvcHVsYXRlZCB3aXRoIHRoZSBjb21wdXRlZCBjbGFpbSB2YWx1ZXMKICAgICAgICAgKiBhbmQgdGhlIHJlcXVlc3RlZCBzY29wZXMgbWFwcGVkIHRvIHRoZSBjbGFpbSBuYW1lcy4KICAgICAgICAgKiBAcmV0dXJucyB7b3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5Vc2VySW5mb0NsYWltc30gVGhlIG9iamVjdCB0byBiZSByZXR1cm5lZCB0byB0aGUgYXV0aG9yaXphdGlvbiBzZXJ2ZXIuCiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29hdXRoMi9jb3JlL1VzZXJJbmZvQ2xhaW1zLmh0bWx9LgogICAgICAgICAqIEBzZWUgUkVTVUxUUyBzZWN0aW9uIGZvciB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0VXNlckluZm9DbGFpbXMgKCkgewogICAgICAgICAgICByZXR1cm4gbmV3IGZySmF2YS5Vc2VySW5mb0NsYWltcyhnZXRDb21wdXRlZENsYWltcygpLCBnZXRDb21wb3NpdGVTY29wZXMoKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbWFwIG9mIChyZXF1ZXN0ZWQpIGNsYWltIG5hbWVzIHBvcHVsYXRlZCB3aXRoIHRoZSBjb21wdXRlZCBjbGFpbSB2YWx1ZXMuCiAgICAgICAgICogQHJldHVybnMge2phdmEudXRpbC5MaW5rZWRIYXNoTWFwfQogICAgICAgICAqIEEgbWFwIG9mIHRoZSByZXF1ZXN0ZWQgY2xhaW0gbmFtZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYWltIHZhbHVlcy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRDb21wdXRlZENsYWltcyAoKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDcmVhdGVzIGEgY29tcGxldGUgbGlzdCBvZiBjbGFpbSBvYmplY3RzIGZyb206CiAgICAgICAgICAgICAqIHRoZSBjbGFpbXMgZGVyaXZlZCBmcm9tIHRoZSBzY29wZXMsCiAgICAgICAgICAgICAqIHRoZSBjbGFpbXMgcHJvdmlkZWQgYnkgdGhlIGF1dGhvcml6YXRpb24gc2VydmVyLAogICAgICAgICAgICAgKiBhbmQgdGhlIGNsYWltcyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4KICAgICAgICAgICAgICogQHJldHVybnMge2phdmEudXRpbC5BcnJheUxpc3R9CiAgICAgICAgICAgICAqIFJldHVybnMgYSBjb21wbGV0ZSBsaXN0IG9mIG9yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbSBvYmplY3RzIGF2YWlsYWJsZSB0byB0aGUgc2NyaXB0LgogICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmlkY29ubmVjdC9DbGFpbS5odG1sfSBmb3IgdGhlIGNsYWltIG9iamVjdCBkZXRhaWxzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0Q2xhaW1zKCkgewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBjbGFpbSBvYmplY3RzIGZvciB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICAgICAgICAgICAgICAgICAqIFVzZXMgdGhlIHNjb3BlQ2xhaW1zTWFwIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGRlcml2ZSB0aGUgY2xhaW0gbmFtZXM7CiAgICAgICAgICAgICAgICAgKiBubyBvdGhlciBwcm9wZXJ0aWVzIG9mIGEgY2xhaW0gZGVyaXZlZCBmcm9tIGEgc2NvcGUgYXJlIHBvcHVsYXRlZC4KICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtqYXZhLnV0aWwuQXJyYXlMaXN0fQogICAgICAgICAgICAgICAgICogQSBsaXN0IG9mIG9yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbSBvYmplY3RzIGRlcml2ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICAgICAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuaWRjb25uZWN0L0NsYWltLmh0bWx9IGZvciB0aGUgY2xhaW0gb2JqZWN0IGRldGFpbHMuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnZlcnRTY29wZVRvQ2xhaW1zKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjbGFpbXMgPSBuZXcgZnJKYXZhLkFycmF5TGlzdCgpOwoKICAgICAgICAgICAgICAgICAgICBzY29wZXMudG9BcnJheSgpLmZvckVhY2goZnVuY3Rpb24gKHNjb3BlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoc2NvcGUpICE9PSAnb3BlbmlkJyAmJiBzY29wZUNsYWltc01hcFtzY29wZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlQ2xhaW1zTWFwW3Njb3BlXS5mb3JFYWNoKGZ1bmN0aW9uIChjbGFpbU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFpbXMuYWRkKG5ldyBmckphdmEuQ2xhaW0oY2xhaW1OYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBjbGFpbXMgPSBuZXcgZnJKYXZhLkFycmF5TGlzdCgpOwoKICAgICAgICAgICAgICAgIGNsYWltcy5hZGRBbGwoY29udmVydFNjb3BlVG9DbGFpbXMoKSk7CiAgICAgICAgICAgICAgICBjbGFpbXMuYWRkQWxsKGNsYWltT2JqZWN0cyk7CiAgICAgICAgICAgICAgICBjbGFpbXMuYWRkQWxsKHJlcXVlc3RlZFR5cGVkQ2xhaW1zKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBjbGFpbSB2YWx1ZS4KICAgICAgICAgICAgICogVG8gb2J0YWluIHRoZSBjbGFpbSB2YWx1ZSwgdXNlcyB0aGUgcmVzb2x2ZXIgZnVuY3Rpb24gc3BlY2lmaWVkIGZvciB0aGUgY2xhaW0gaW4gdGhlIGNsYWltUmVzb2x2ZXJzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LgogICAgICAgICAgICAgKiBAc2VlIGNsYWltUmVzb2x2ZXJzCiAgICAgICAgICAgICAqIElmIG5vIHJlc29sdmVyIGZ1bmN0aW9uIGlzIGZvdW5kLCB1c2VzIHRoZSBkZWZhdWx0IGNsYWltIHJlc29sdmVyIGZ1bmN0aW9uLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBvYnRhaW4gaW5mb3JtYXRpb24vcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIGNsYWltLgogICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmlkY29ubmVjdC9DbGFpbS5odG1sfSBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICogQHJldHVybnMgeyp9IENsYWltIHZhbHVlLgogICAgICAgICAgICAgKiBAdGhyb3dzIHtvcmcuZm9yZ2Vyb2NrLm9hdXRoMi5jb3JlLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb259CiAgICAgICAgICAgICAqIFJldGhyb3dzIHRoaXMgZXhjZXB0aW9uIGlmIGEgY2xhaW0gcmVzb2x2ZXIgdGhyb3dzIGl0LgogICAgICAgICAgICAgKiBZb3UgY2FuIHRocm93IG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBmcm9tIHlvdXIgY3VzdG9tIGNsYWltIHJlc29sdmVyCiAgICAgICAgICAgICAqIGlmIHlvdSB3YW50IHRvIHRlcm1pbmF0ZSB0aGUgY2xhaW0gcHJvY2Vzc2luZy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXB1dGVDbGFpbShjbGFpbSkgewogICAgICAgICAgICAgICAgdmFyIHJlc29sdmVDbGFpbTsKICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNsYWltID0gY2xhaW1SZXNvbHZlcnNbY2xhaW0uZ2V0TmFtZSgpXSB8fCByZXNvbHZlQW55Q2xhaW07CgogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhaW0oY2xhaW0pOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnT0lEQyBDbGFpbXMgc2NyaXB0IGV4Y2VwdGlvbi4gVW5hYmxlIHRvIHJlc29sdmUgT0lEQyBDbGFpbS4gJyArIGU7CgogICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoZSkuaW5kZXhPZignb3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLndhcm5pbmdFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcobWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY29tcHV0ZWRDbGFpbXMgPSBuZXcgZnJKYXZhLkxpbmtlZEhhc2hNYXAoKTsKCiAgICAgICAgICAgIGdldENsYWltcygpLnRvQXJyYXkoKS5mb3JFYWNoKGZ1bmN0aW9uIChjbGFpbSkgewogICAgICAgICAgICAgICAgdmFyIGNsYWltVmFsdWUgPSBjb21wdXRlQ2xhaW0oY2xhaW0pOwoKICAgICAgICAgICAgICAgIGlmIChpc0NsYWltVmFsdWVWYWxpZChjbGFpbVZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkQ2xhaW1zLnB1dChjbGFpbS5nZXROYW1lKCksIGNsYWltVmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBJZiBhIGNsYWltIGhhcyBiZWVuIHByb2Nlc3NlZCwgYnV0IGFwcGVhcnMgaW4gdGhlIGxpc3QgYWdhaW4sCiAgICAgICAgICAgICAgICAgICAgICogYW5kIGl0cyB2YWx1ZSBjYW5ub3QgYmUgY29tcHV0ZWQgdW5kZXIgdGhlIG5ldyBjb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAqIHRoZSBjbGFpbSBpcyByZW1vdmVkIGZyb20gdGhlIGZpbmFsIHJlc3VsdC4KICAgICAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICAgICAqIEZvciBleGFtcGxlLCBhIGNsYWltIGNvdWxkIGJlIG1hcHBlZCB0byBhIHNjb3BlIGFuZCBmb3VuZCBpbiB0aGUgdXNlciBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAqIGJ1dCBhbHNvIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50IHdpdGggcmVxdWlyZWQgdmFsdWVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGNvbXB1dGVkIG9uZS4KICAgICAgICAgICAgICAgICAgICAgKiBAc2VlIHtsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI0luZGl2aWR1YWxDbGFpbXNSZXF1ZXN0c30uCiAgICAgICAgICAgICAgICAgICAgICogZm9yIHRoZSByZWxldmFudCBPSURDIHNwZWNpZmljYXRpb24gZGV0YWlscy4KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBjb21wdXRlZENsYWltcy5yZW1vdmUoY2xhaW0uZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gY29tcHV0ZWRDbGFpbXM7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbWFwIG9mIHJlcXVlc3RlZCBzY29wZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYWltIG5hbWVzLgogICAgICAgICAqIEByZXR1cm5zIHtqYXZhLnV0aWwuTGlua2VkSGFzaE1hcH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRDb21wb3NpdGVTY29wZXMgKCkgewogICAgICAgICAgICB2YXIgY29tcG9zaXRlU2NvcGVzID0gbmV3IGZySmF2YS5MaW5rZWRIYXNoTWFwKCk7CgogICAgICAgICAgICBzY29wZXMudG9BcnJheSgpLmZvckVhY2goZnVuY3Rpb24gKHNjb3BlKSB7CiAgICAgICAgICAgICAgICB2YXIgc2NvcGVDbGFpbXMgPSBuZXcgZnJKYXZhLkFycmF5TGlzdCgpOwoKICAgICAgICAgICAgICAgIGlmIChzY29wZUNsYWltc01hcFtzY29wZV0pIHsKICAgICAgICAgICAgICAgICAgICBzY29wZUNsYWltc01hcFtzY29wZV0uZm9yRWFjaChmdW5jdGlvbiAoY2xhaW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlQ2xhaW1zLmFkZChjbGFpbU5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzY29wZUNsYWltcy5zaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVTY29wZXMucHV0KHNjb3BlLCBzY29wZUNsYWltcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZVNjb3BlczsKICAgICAgICB9CgogICAgICAgIC8vIFBVQkxJQyBNRVRIT0RTCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHNldFNjb3BlQ2xhaW1zTWFwOiBzZXRTY29wZUNsYWltc01hcCwKICAgICAgICAgICAgc2V0Q2xhaW1SZXNvbHZlcnM6IHNldENsYWltUmVzb2x2ZXJzLAogICAgICAgICAgICBnZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXI6IGdldFVzZXJQcm9maWxlQ2xhaW1SZXNvbHZlciwKICAgICAgICAgICAgZ2V0QWRkcmVzc0NsYWltUmVzb2x2ZXI6IGdldEFkZHJlc3NDbGFpbVJlc29sdmVyLAogICAgICAgICAgICBnZXRFc3NlbnRpYWxDbGFpbVJlc29sdmVyOiBnZXRFc3NlbnRpYWxDbGFpbVJlc29sdmVyLAogICAgICAgICAgICBnZXRVc2VySW5mb0NsYWltczogZ2V0VXNlckluZm9DbGFpbXMKICAgICAgICB9OwogICAgfQoKICAgIC8vIFJFU1VMVFMKCiAgICAvKioKICAgICAqIFRoaXMgc2NyaXB0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuVXNlckluZm9DbGFpbXMgY2xhc3MKICAgICAqIHBvcHVsYXRlZCB3aXRoIHRoZSBjb21wdXRlZCBjbGFpbSB2YWx1ZXMgYW5kCiAgICAgKiB0aGUgcmVxdWVzdGVkIHNjb3BlcyBtYXBwZWQgdG8gdGhlIGNsYWltIG5hbWVzLgogICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29hdXRoMi9jb3JlL1VzZXJJbmZvQ2xhaW1zLmh0bWx9LgogICAgICoKICAgICAqIEFzc2lnbmluZyBpdCB0byBhIHZhcmlhYmxlIGdpdmVzIHlvdSBhbiBvcHBvcnR1bml0eQogICAgICogdG8gbG9nIHRoZSBjb250ZW50IG9mIHRoZSByZXR1cm5lZCB2YWx1ZSBkdXJpbmcgZGV2ZWxvcG1lbnQuCiAgICAgKi8KICAgIHZhciB1c2VySW5mb0NsYWltcyA9IHV0aWxzLmdldFVzZXJJbmZvQ2xhaW1zKCk7CgogICAgLyoKICAgIGxvZ2dlci5lcnJvcihzY3JpcHROYW1lICsgJyByZXN1bHRzOicpCiAgICBsb2dnZXIuZXJyb3IoJ1ZhbHVlczogJyArIHVzZXJJbmZvQ2xhaW1zLmdldFZhbHVlcygpKQogICAgbG9nZ2VyLmVycm9yKCdTY29wZXM6ICcgKyB1c2VySW5mb0NsYWltcy5nZXRDb21wb3NpdGVTY29wZXMoKSkKICAgICovCgogICAgcmV0dXJuIHVzZXJJbmZvQ2xhaW1zOwp9KCkpOwo=\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"OIDC_CLAIMS\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"e5c302c8-f838-4698-87cc-d7225fc82454\",\"name\":\"EmailAsUsername\",\"description\":\"null\",\"script\":\"b2JqZWN0QXR0cmlidXRlcyA9IHNoYXJlZFN0YXRlLmdldCgib2JqZWN0QXR0cmlidXRlcyIpCnVzZXJOYW1lID0gb2JqZWN0QXR0cmlidXRlcy5nZXQoInVzZXJOYW1lIikKCmlmKHVzZXJOYW1lKXsKICAvL0Zvcm0gRmlsbAogIG9iamVjdEF0dHJpYnV0ZXMucHV0KCJtYWlsIiwgdXNlck5hbWUpCn0gZWxzZSB7CiAgLy9Tb2NpYWwKICBvYmplY3RBdHRyaWJ1dGVzLnB1dCgidXNlck5hbWUiLCBvYmplY3RBdHRyaWJ1dGVzLmdldCgibWFpbCIpKQp9CgoKc2hhcmVkU3RhdGUucHV0KCJvYmplY3RBdHRyaWJ1dGVzIiwgb2JqZWN0QXR0cmlidXRlcyk7Ci8vc2hhcmVkU3RhdGUucHV0KCJ1c2VybmFtZSIsIG1haWwpCgpvdXRjb21lID0gInRydWUiOw==\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"25e6c06d-cf70-473b-bd28-26931edc476b\",\"name\":\"OAuth2 Validate Scope Script\",\"description\":\"Default global script for OAuth2 Scope Validation\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjEgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKLyoKICogVGhpcyBzY3JpcHQgdmFsaWRhdGVzIHRoZSByZXF1ZXN0ZWQgc2NvcGVzIGFnYWluc3QgdGhlIGFsbG93ZWQgc2NvcGVzLgogKiBJZiBubyBzY29wZXMgYXJlIHJlcXVlc3RlZCwgZGVmYXVsdCBzY29wZXMgYXJlIGFzc3VtZWQuCiAqIFRoZSBzY3JpcHQgaGFzIGZvdXIgdG9wIGxldmVsIGZ1bmN0aW9ucyB0aGF0IGNvdWxkIGJlIGV4ZWN1dGVkIGR1cmluZyB0aGUgZGlmZmVyZW50IE9BdXRoMiBmbG93czoKICogICAgICAtIHZhbGlkYXRlQXV0aG9yaXphdGlvblNjb3BlCiAqICAgICAgLSB2YWxpZGF0ZUFjY2Vzc1Rva2VuU2NvcGUKICogICAgICAtIHZhbGlkYXRlUmVmcmVzaFRva2VuU2NvcGUKICogICAgICAtIHZhbGlkYXRlQmFja0NoYW5uZWxBdXRob3JpemF0aW9uU2NvcGUKICoKICogRGVmaW5lZCB2YXJpYWJsZXM6CiAqIHJlcXVlc3RlZFNjb3BlcyAtIFNldDxTdHJpbmc+ICgxKS4KICogICAgICAgICAgVGhlIHNldCBvZiByZXF1ZXN0ZWQgc2NvcGVzLgogKiBkZWZhdWx0U2NvcGVzIC0gU2V0PFN0cmluZz4gKDEpLgogKiAgICAgICAgICAgICAgICAgVGhlIHNldCBvZiBkZWZhdWx0IHNjb3Blcy4KICogYWxsb3dlZFNjb3BlcyAtIFNldDxTdHJpbmc+ICgxKS4KICogICAgICAgICAgICAgICAgIFRoZSBzZXQgb2YgYWxsb3dlZCBzY29wZXMuCiAqIHNjcmlwdE5hbWUgLSBTdHJpbmcgKHByaW1pdGl2ZSkuCiAqICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgc2NyaXB0LgogKiBsb2dnZXIgLSBBbHdheXMgcHJlc2VudCwgdGhlIGRlYnVnIGxvZ2dlciBpbnN0YW5jZToKICogICAgICAgICAgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvc2NyaXB0aW5nLWd1aWRlL3NjcmlwdGluZy1hcGktZ2xvYmFsLWxvZ2dlci5odG1sI3NjcmlwdGluZy1hcGktZ2xvYmFsLWxvZ2dlci4KICogICAgICAgICAgQ29ycmVzcG9uZGluZyBsb2cgZmlsZXMgd2lsbCBiZSBwcmVmaXhlZCB3aXRoOiBzY3JpcHRzLk9BVVRIMl9WQUxJREFURV9TQ09QRQogKiBodHRwQ2xpZW50IC0gSFRUUCBDbGllbnQgKDIpLgogKiAgICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBIVFRQIENsaWVudCBpbnN0YW5jZToKICogICAgICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHRpbmctYXBpLWdsb2JhbC1odHRwLWNsaWVudC5odG1sI3NjcmlwdGluZy1hcGktZ2xvYmFsLWh0dHAtY2xpZW50LgogKgogKiBUaHJvd3MgSW52YWxpZFNjb3BlRXhjZXB0aW9uOgogKiAgICAgIC0gaWYgdGhlcmUgYXJlIG5vIHNjb3BlcyByZXF1ZXN0ZWQgYW5kIGRlZmF1bHQgc2NvcGVzIGFyZSBlbXB0eQogKiAgICAgIC0gaWYgYSByZXF1ZXN0ZWQgc2NvcGUgaXMgbm90IGFsbG93ZWQKICoKICogUmV0dXJuIC0gYSBTZXQ8U3RyaW5nPiBvZiB2YWxpZGF0ZWQgc2NvcGVzICgxKS4KICoKICogQ2xhc3MgcmVmZXJlbmNlOgogKiAoMSkgU2V0IC0gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9IYXNoU2V0Lmh0bWwuCiAqICgyKSBDbGllbnQgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svaHR0cC9DbGllbnQuaHRtbC4KICovCgovKioKICogRGVmYXVsdCB2YWxpZGF0ZSBzY29wZSBzY3JpcHQuCiAqLwpmdW5jdGlvbiB2YWxpZGF0ZVNjb3BlcyAoKSB7CiAgICB2YXIgZnJKYXZhID0gSmF2YUltcG9ydGVyKAogICAgICAgIG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuZXhjZXB0aW9ucy5JbnZhbGlkU2NvcGVFeGNlcHRpb24KICAgICk7CgogICAgdmFyIHNjb3BlczsKICAgIGlmIChyZXF1ZXN0ZWRTY29wZXMgPT0gbnVsbCB8fCByZXF1ZXN0ZWRTY29wZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgc2NvcGVzID0gZGVmYXVsdFNjb3BlczsKICAgIH0gZWxzZSB7CiAgICAgICAgc2NvcGVzID0gbmV3IGphdmEudXRpbC5IYXNoU2V0KGFsbG93ZWRTY29wZXMpOwogICAgICAgIHNjb3Blcy5yZXRhaW5BbGwocmVxdWVzdGVkU2NvcGVzKTsKICAgICAgICBpZiAocmVxdWVzdGVkU2NvcGVzLnNpemUoKSA+IHNjb3Blcy5zaXplKCkpIHsKICAgICAgICAgICAgdmFyIGludmFsaWRTY29wZXMgPSBuZXcgamF2YS51dGlsLkhhc2hTZXQocmVxdWVzdGVkU2NvcGVzKTsKICAgICAgICAgICAgaW52YWxpZFNjb3Blcy5yZW1vdmVBbGwoYWxsb3dlZFNjb3Blcyk7CiAgICAgICAgICAgIHRocm93IG5ldyBmckphdmEuSW52YWxpZFNjb3BlRXhjZXB0aW9uKCdVbmtub3duL2ludmFsaWQgc2NvcGUocyknKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHNjb3BlcyA9PSBudWxsIHx8IHNjb3Blcy5pc0VtcHR5KCkpIHsKICAgICAgICB0aHJvdyBuZXcgZnJKYXZhLkludmFsaWRTY29wZUV4Y2VwdGlvbignTm8gc2NvcGUgcmVxdWVzdGVkIGFuZCBubyBkZWZhdWx0IHNjb3BlIGNvbmZpZ3VyZWQnKTsKICAgIH0KICAgIHJldHVybiBzY29wZXM7Cn0KCmZ1bmN0aW9uIHZhbGlkYXRlQXV0aG9yaXphdGlvblNjb3BlICgpIHsKICAgIHJldHVybiB2YWxpZGF0ZVNjb3BlcygpOwp9CgpmdW5jdGlvbiB2YWxpZGF0ZUFjY2Vzc1Rva2VuU2NvcGUgKCkgewogICAgcmV0dXJuIHZhbGlkYXRlU2NvcGVzKCk7Cn0KCmZ1bmN0aW9uIHZhbGlkYXRlUmVmcmVzaFRva2VuU2NvcGUgKCkgewogICAgcmV0dXJuIHZhbGlkYXRlU2NvcGVzKCk7Cn0KCmZ1bmN0aW9uIHZhbGlkYXRlQmFja0NoYW5uZWxBdXRob3JpemF0aW9uU2NvcGUgKCkgewogICAgcmV0dXJuIHZhbGlkYXRlU2NvcGVzKCk7Cn0=\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"OAUTH2_VALIDATE_SCOPE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"994a4e8f-2741-424a-83e7-3c5f78da01f5\",\"name\":\"Saml2 IDP Adapter Always Auth - imported (2)\",\"description\":\"Always redirect browser pre-auth\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjEtMjAyMiBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgovKgogKiBUaGUgc2NyaXB0IGhhcyB0aGVzZSB0b3AgbGV2ZWwgZnVuY3Rpb25zIHRoYXQgY291bGQgYmUgZXhlY3V0ZWQgZHVyaW5nIGEgU0FNTDIgZmxvdy4KICogICAgICAtIHByZVNpbmdsZVNpZ25PbgogKiAgICAgIC0gcHJlQXV0aGVudGljYXRpb24KICogICAgICAtIHByZVNlbmRSZXNwb25zZQogKiAgICAgIC0gcHJlU2lnblJlc3BvbnNlCiAqICAgICAgLSBwcmVTZW5kRmFpbHVyZVJlc3BvbnNlCiAqCiAqIFBsZWFzZSBzZWUgdGhlIGphdmFkb2MgZm9yIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBhbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBtZXRob2RzLgogKiBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4yL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9wbHVnaW5zL1NBTUwySWRlbnRpdHlQcm92aWRlckFkYXB0ZXIuaHRtbAogKiBOb3RlIHRoYXQgdGhlIGluaXRpYWxpemUgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIHNjcmlwdHMuCiAqCiAqIERlZmluZWQgdmFyaWFibGVzLiBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgcmVzcGVjdGl2ZSBmdW5jdGlvbnMgZm9yIHRoZSB2YXJpYWJsZXMgYXZhaWxhYmxlIHRvIGl0LgogKgogKiBob3N0ZWRFbnRpdHlJZCAtIFN0cmluZwogKiAgICAgRW50aXR5IElEIGZvciB0aGUgaG9zdGVkIElEUAogKiByZWFsbSAtIFN0cmluZwogKiAgICAgUmVhbG0gb2YgdGhlIGhvc3RlZCBJRFAKICogaWRwQWRhcHRlclNjcmlwdEhlbHBlciAtIElkcEFkYXB0ZXJTY3JpcHRIZWxwZXIgKDEpCiAqICAgICBBbiBpbnN0YW5jZSBvZiBJZHBBZGFwdGVyU2NyaXB0SGVscGVyIGNvbnRhaW5pbmcgaGVscGVyIG1ldGhvZHMuIFNlZSBKYXZhZG9jIGZvciBtb3JlIGRldGFpbHMuCiAqIHJlcXVlc3QgLSBIdHRwU2VydmxldFJlcXVlc3QgKDIpCiAqICAgICBTZXJ2bGV0IHJlcXVlc3Qgb2JqZWN0CiAqIHJlc3BvbnNlIC0gSHR0cFNlcnZsZXRSZXNwb25zZSAoMykKICogICAgIFNlcnZsZXQgcmVzcG9uc2Ugb2JqZWN0CiAqIGF1dGhuUmVxdWVzdCAtIEF1dGhuUmVxdWVzdCAoNCkKICogICAgIFRoZSBvcmlnaW5hbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IHNlbnQgZnJvbSBTUAogKiByZXFJZCAtIFN0cmluZwogKiAgICAgVGhlIGlkIHRvIHVzZSBmb3IgY29udGludWF0aW9uIG9mIHByb2Nlc3NpbmcgaWYgdGhlIGFkYXB0ZXIgcmVkaXJlY3RzCiAqIHJlcyAtIFJlc3BvbnNlICg1KQogKiAgICAgVGhlIFNBTUwgUmVzcG9uc2UKICogc2Vzc2lvbiAtIFNTT1Rva2VuICg2KQogKiAgICAgVGhlIHNpbmdsZSBzaWduLW9uIHNlc3Npb24uIFRoZSByZWZlcmVuY2UgdHlwZSBvZiB0aGlzIGlzIE9iamVjdCBhbmQgd291bGQgbmVlZCB0byBiZSBjYXN0ZWQgdG8gU1NPVG9rZW4uCiAqIHJlbGF5U3RhdGUgLSBTdHJpbmcKICogICAgIFRoZSByZWxheVN0YXRlIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSByZWRpcmVjdAogKiBmYXVsdENvZGUgLSBTdHJpbmcKICogICAgIHRoZSBmYXVsdCBjb2RlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgU0FNTCByZXNwb25zZQogKiBmYXVsdERldGFpbCAtIFN0cmluZwogKiAgICAgdGhlIGZhdWx0IGRldGFpbCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIFNBTUwgcmVzcG9uc2UKICogbG9nZ2VyIC0gTG9nZ2VyIGluc3RhbmNlCiAqICAgICBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9zY3JpcHRpbmctZ3VpZGUvc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLmh0bWwjc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLgogKiAgICAgQ29ycmVzcG9uZGluZyBsb2cgZmlsZXMgd2lsbCBiZSBwcmVmaXhlZCB3aXRoOiBzY3JpcHRzLjxzY3JpcHQgbmFtZT4KICoKICogVGhyb3dzIFNBTUwyRXhjZXB0aW9uICg3KToKICogICAgIGZvciBhbnkgZXhjZXB0aW9ucyBvY2N1cnJpbmcgaW4gdGhlIGFkYXB0ZXIuIFRoZSBmZWRlcmF0aW9uIHByb2Nlc3Mgd2lsbCBjb250aW51ZQogKgogKiBDbGFzcyByZWZlcmVuY2U6CiAqICgxKSBpZHBBZGFwdGVyU2NyaXB0SGVscGVyIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMi9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcGx1Z2lucy9zY3JpcHRlZC9JZHBBZGFwdGVyU2NyaXB0SGVscGVyLmh0bWwuCiAqICgyKSBIdHRwU2VydmxldFJlcXVlc3QgLSBodHRwczovL3RvbWNhdC5hcGFjaGUub3JnL3RvbWNhdC03LjAtZG9jL3NlcnZsZXRhcGkvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdC5odG1sLgogKiAoMykgSHR0cFNlcnZsZXRSZXNwb25zZSAtIGh0dHBzOi8vdG9tY2F0LmFwYWNoZS5vcmcvdG9tY2F0LTcuMC1kb2Mvc2VydmxldGFwaS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZS5odG1sLgogKiAoNCkgQXV0aG5SZXF1ZXN0IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMi9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvQXV0aG5SZXF1ZXN0Lmh0bWwuCiAqICg1KSBSZXNwb25zZSAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjIvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL3Byb3RvY29sL1Jlc3BvbnNlLmh0bWwuCiAqICg2KSBTU09Ub2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjIvYXBpZG9jcy9jb20vaXBsYW5ldC9zc28vU1NPVG9rZW4uaHRtbC4KICogKDcpIFNBTUwyRXhjZXB0aW9uIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMi9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvY29tbW9uL1NBTUwyRXhjZXB0aW9uLmh0bWwuCiAqLwoKLyoKICogVGVtcGxhdGUvZGVmYXVsdCBzY3JpcHQgZm9yIFNBTUwyIElEUCBBZGFwdGVyIHNjcmlwdGVkIHBsdWdpbi4KICovCgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwcmVTaW5nbGVTaWduT246CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIGlkcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIHJlcXVlc3QKICogICAgIGF1dGhuUmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIHJlcUlkCiAqICAgICBsb2dnZXIKICoKICogUmV0dXJuIC0gdHJ1ZSBpZiBicm93c2VyIHJlZGlyZWN0aW9uIGlzIGhhcHBlbmluZyBhZnRlciBwcm9jZXNzaW5nLCBmYWxzZSBvdGhlcndpc2UuIERlZmF1bHQgdG8gZmFsc2UuCiAqLwpmdW5jdGlvbiBwcmVTaW5nbGVTaWduT24gKCkgewogICAgICBsb2dnZXIuZXJyb3IoIkNoaWNhZ286IHByZVNpbmdsZVNpZ25PbiIpOwogICAgcmV0dXJuIHRydWU7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZUF1dGhlbnRpY2F0aW9uOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICBpZHBBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICByZXF1ZXN0CiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICByZXFJZAogKiAgICAgc2Vzc2lvbgogKiAgICAgcmVsYXlTdGF0ZQogKiAgICAgbG9nZ2VyCiAqCiAqIFJldHVybiAtIHRydWUgaWYgYnJvd3NlciByZWRpcmVjdGlvbiBpcyBoYXBwZW5pbmcgYWZ0ZXIgcHJvY2Vzc2luZywgZmFsc2Ugb3RoZXJ3aXNlLiBEZWZhdWx0IHRvIGZhbHNlLgogKi8KZnVuY3Rpb24gcHJlQXV0aGVudGljYXRpb24gKCkgewogICAgICBsb2dnZXIuZXJyb3IoIkNoaWNhZ286IHByZUF1dGhlbnRpY2F0aW9uIik7CiAgICByZXR1cm4gdHJ1ZTsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcHJlU2VuZFJlc3BvbnNlOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICBpZHBBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICByZXF1ZXN0CiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICByZXFJZAogKiAgICAgc2Vzc2lvbgogKiAgICAgcmVsYXlTdGF0ZQogKiAgICAgbG9nZ2VyCiAqCiAqIFJldHVybiAtIHRydWUgaWYgYnJvd3NlciByZWRpcmVjdGlvbiBoYXBwZW5lZCBhZnRlciBwcm9jZXNzaW5nLCBmYWxzZSBvdGhlcndpc2UuIERlZmF1bHQgdG8gZmFsc2UuCiAqLwpmdW5jdGlvbiBwcmVTZW5kUmVzcG9uc2UgKCkgewogICAgICBsb2dnZXIuZXJyb3IoIkNoaWNhZ286IHByZVNlbmRSZXNwb25zZSIpOwogICAgICBsb2dnZXIuZXJyb3IoIkNoaWNhZ286IGF1dGhuUmVxdWVzdDogIithdXRoblJlcXVlc3QpOwogICAgICByZXNwb25zZS5zZW5kUmVkaXJlY3QoImh0dHBzOi8vaWRjLnNjaGV1YmVyLmlvL2FtL1hVSS8/cmVhbG09YWxwaGEmYXV0aEluZGV4VHlwZT1zZXJ2aWNlJmF1dGhJbmRleFZhbHVlPURpc3BhdGNoZXImRm9yY2VBdXRoPXRydWUmZ290bz0iK3JlbGF5U3RhdGUpOwogICAgcmV0dXJuIHRydWU7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZVNpZ25SZXNwb25zZToKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgaWRwQWRhcHRlclNjcmlwdEhlbHBlcgogKiAgICAgcmVxdWVzdAogKiAgICAgYXV0aG5SZXF1ZXN0CiAqICAgICBzZXNzaW9uCiAqICAgICByZWxheVN0YXRlCiAqICAgICByZXMKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcHJlU2lnblJlc3BvbnNlICgpIHsKICAgICAgbG9nZ2VyLmVycm9yKCJDaGljYWdvOiBwcmVTaWduUmVzcG9uc2UiKTsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcHJlU2VuZEZhaWx1cmVSZXNwb25zZToKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgaWRwQWRhcHRlclNjcmlwdEhlbHBlcgogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIGZhdWx0Q29kZQogKiAgICAgZmF1bHREZXRhaWwKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcHJlU2VuZEZhaWx1cmVSZXNwb25zZSAoKSB7CiAgICAgIGxvZ2dlci5lcnJvcigiQ2hpY2FnbzogcHJlU2VuZEZhaWx1cmVSZXNwb25zZSIpOwp9\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"SAML2_IDP_ADAPTER\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"1b52a7e0-4019-40fa-958a-15a49870e901\",\"name\":\"shared\",\"description\":\"set the same shared state variable\",\"script\":\"KGZ1bmN0aW9uICgpIHsKICBvdXRjb21lID0gJ3RydWUnOwogIHZhciBsZXZlbCA9IG5vZGVTdGF0ZS5nZXQoJ2xldmVsJykuYXNJbnRlZ2VyKCk7CiAgc2hhcmVkU3RhdGUucHV0KCdzaGFyZWRWYWx1ZScsICdMZXZlbCAnICsgbGV2ZWwgKyAnOiBUaGlzIGlzIGEgbG9uZ2VyIHN0cmluZyB2YWx1ZSBzaGFyZWQgYWNyb3NzIGFsbCBuZXN0ZWQgam91cm5leXMuIEl0IGNvbnRhaW5zIGFuIGluZGljYXRvciBpbiB3aGljaCBsZXZlbCBpdCB3YXMgbGFzdCBzZXQuJyk7Cn0oKSk7\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"5ce0d38a-154c-4be5-bd22-f9879c77e895\",\"name\":\"FrodoSPAdapter - imported (1)\",\"description\":\"null\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjMgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKLyoKICogVGhlIHNjcmlwdCBoYXMgdGhlc2UgdG9wIGxldmVsIGZ1bmN0aW9ucyB0aGF0IGNvdWxkIGJlIGV4ZWN1dGVkIGR1cmluZyBhIFNBTUwyIGZsb3cuCiAqICAgICAgLSBwcmVTaW5nbGVTaWduT25SZXF1ZXN0CiAqICAgICAgLSBwcmVTaW5nbGVTaWduT25Qcm9jZXNzCiAqICAgICAgLSBwb3N0U2luZ2xlU2lnbk9uU3VjY2VzcwogKiAgICAgIC0gcG9zdFNpbmdsZVNpZ25PbkZhaWx1cmUKICogICAgICAtIHBvc3ROZXdOYW1lSURTdWNjZXNzCiAqICAgICAgLSBwb3N0VGVybWluYXRlTmFtZUlEU3VjY2VzcwogKiAgICAgIC0gcHJlU2luZ2xlTG9nb3V0UHJvY2VzcwogKiAgICAgIC0gcG9zdFNpbmdsZUxvZ291dFN1Y2Nlc3MKICoKICogUGxlYXNlIHNlZSB0aGUgSmF2YURvYyBmb3IgdGhlIGludGVyZmFjZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBtZXRob2RzLgogKiBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmFtL3NhbWwyL3BsdWdpbnMvU1BBZGFwdGVyLmh0bWwKICogTm90ZSB0aGF0IHRoZSBpbml0aWFsaXplIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBzY3JpcHRzLgogKgogKiBEZWZpbmVkIHZhcmlhYmxlcy4gQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlIHJlc3BlY3RpdmUgZnVuY3Rpb25zIGZvciB0aGUgdmFyaWFibGVzIGF2YWlsYWJsZSB0byBpdC4KICoKICogaG9zdGVkRW50aXR5SWQgLSBTdHJpbmcKICogICAgIEVudGl0eSBJRCBmb3IgdGhlIGhvc3RlZCBJRFAKICogcmVhbG0gLSBTdHJpbmcKICogICAgIFJlYWxtIG9mIHRoZSBob3N0ZWQgSURQCiAqIGlkcEVudGl0eUlkIC0gU3RyaW5nCiAqICAgICBUaGUgZW50aXR5IElEIGZvciB0aGUgSWRlbnRpdHkgUHJvdmlkZXIgZm9yIHdoaWNoIHRoZSBzaWduLW9uIHJlcXVlc3Qgd2lsbCBiZSBzZW50LgogKiByZXF1ZXN0IC0gSHR0cFNlcnZsZXRSZXF1ZXN0ICgxKQogKiAgICAgU2VydmxldCByZXF1ZXN0IG9iamVjdAogKiByZXNwb25zZSAtIEh0dHBTZXJ2bGV0UmVzcG9uc2UgKDIpCiAqICAgICBTZXJ2bGV0IHJlc3BvbnNlIG9iamVjdAogKiBhdXRoblJlcXVlc3QgLSBBdXRoblJlcXVlc3QgKDMpCiAqICAgICBUaGUgYXV0aGVudGljYXRpb24gcmVxdWVzdCBzZW50IHRoYXQgaXMgc2VudCBmcm9tIHRoZSBTZXJ2aWNlIFByb3ZpZGVyLgogKiBzZXNzaW9uIC0gU1NPVG9rZW4gKDQpCiAqICAgICBUaGUgc2luZ2xlIHNpZ24tb24gc2Vzc2lvbi4gVGhlIHJlZmVyZW5jZSB0eXBlIG9mIHRoaXMgaXMgT2JqZWN0IGFuZCB3b3VsZCBuZWVkIHRvIGJlIGNhc3RlZCB0byBTU09Ub2tlbi4KICogcmVzIC0gUmVzcG9uc2UgKDUpCiAqICAgICBUaGUgU1NPIFJlc3BvbnNlIHJlY2VpdmVkIGZyb20gdGhlIElkZW50aXR5IFByb3ZpZGVyLgogKiBwcm9maWxlIC0gU3RyaW5nCiAqICAgICBUaGUgcHJvdG9jb2wgcHJvZmlsZSB0aGF0IGlzIHVzZWQsIHRoaXMgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZnJvbSBTQU1MMkNvbnN0YW50cyAoNik6CiAqICAgICAgICAgIC0gU0FNTDJDb25zdGFudHMuSFRUUF9QT1NUCiAqICAgICAgICAgIC0gU0FNTDJDb25zdGFudHMuSFRUUF9BUlRJRkFDVAogKiAgICAgICAgICAtIFNBTUwyQ29uc3RhbnRzLlBBT1MKICogb3V0IC0gUHJpbnRXcml0ZXIgKDcpCiAqICAgICBUaGUgUHJpbnRXcml0ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSB0by4KICogaXNGZWRlcmF0aW9uIC0gYm9vbGVhbgogKiAgICAgU2V0IHRvIHRydWUgaWYgdXNpbmcgZmVkZXJhdGlvbiwgb3RoZXJ3aXNlIGZhbHNlLgogKiBmYWlsdXJlQ29kZSAtIGludAogKiAgICAgQW4gaW50ZWdlciBob2xkaW5nIHRoZSBmYWlsdXJlIGNvZGUgd2hlbiBhbiBlcnJvciBoYXMgb2NjdXJyZWQuIEZvciBwb3RlbnRpYWwgdmFsdWVzIHNlZSBTUEFkYXB0ZXIuCiAqIHVzZXJJZCAtIFN0cmluZwogKiAgICAgVGhlIHVuaXF1ZSB1bml2ZXJzYWwgSUQgb2YgdGhlIHVzZXIgd2l0aCB3aG9tIHRoZSBuZXcgbmFtZSBpZGVudGlmaWVyIHJlcXVlc3Qgd2FzIHBlcmZvcm1lZC4KICogaWRSZXF1ZXN0IC0gTWFuYWdlTmFtZUlEUmVxdWVzdCAoOCkKICogICAgIFRoZSBuZXcgbmFtZSBpZGVudGlmaWVyIHJlcXVlc3QsIHRoaXMgd2lsbCBiZSBudWxsIGlmIHRoZSByZXF1ZXN0IG9iamVjdCBpcyBub3QgYXZhaWxhYmxlCiAqIGlkUmVzcG9uc2UgLSBNYW5hZ2VOYW1lSURSZXNwb25zZSAoOSkKICogICAgIFRoZSBuZXcgbmFtZSBpZGVudGlmaWVyIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmUgbnVsbCBpZiB0aGUgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUKICogYmluZGluZyAtIFN0cmluZwogKiAgICAgVGhlIGJpbmRpbmcgdXNlZCBmb3IgdGhlIG5ldyBuYW1lIGlkZW50aWZpZXIgcmVxdWVzdC4gVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICogICAgICAgICAgLSBTQU1MMkNvbnN0YW50cy5TT0FQCiAqICAgICAgICAgIC0gU0FNTDJDb25zdGFudHMuSFRUUF9SRURJUkVDVAogKiBsb2dvdXRSZXF1ZXN0IC0gTG9nb3V0UmVxdWVzdCAoMTApCiAqICAgICBUaGUgc2luZ2xlIGxvZ291dCByZXF1ZXN0LgogKiBsb2dvdXRSZXNwb25zZSAtIExvZ291dFJlc3BvbnNlICgxMSkKICogICAgIFRoZSBzaW5nbGUgbG9nb3V0IHJlc3BvbnNlLgogKiBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIgLSBTcEFkYXB0ZXJTY3JpcHRIZWxwZXIgKDEyKQogKiAgICAgQW4gaW5zdGFuY2Ugb2YgU3BBZGFwdGVyU2NyaXB0SGVscGVyIGNvbnRhaW5pbmcgaGVscGVyIG1ldGhvZHMuIFNlZSBKYXZhZG9jIGZvciBtb3JlIGRldGFpbHMuCiAqIGxvZ2dlciAtIExvZ2dlciBpbnN0YW5jZQogKiAgICAgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvc2NyaXB0aW5nLWd1aWRlL3NjcmlwdGluZy1hcGktZ2xvYmFsLWxvZ2dlci5odG1sI3NjcmlwdGluZy1hcGktZ2xvYmFsLWxvZ2dlci4KICogICAgIENvcnJlc3BvbmRpbmcgbG9nIGZpbGVzIHdpbGwgYmUgcHJlZml4ZWQgd2l0aDogc2NyaXB0cy48c2NyaXB0IG5hbWU+CiAqCiAqIFRocm93cyBTQU1MMkV4Y2VwdGlvbiAoMTMpOgogKiAgICAgZm9yIGFueSBleGNlcHRpb25zIG9jY3VycmluZyBpbiB0aGUgYWRhcHRlci4gVGhlIGZlZGVyYXRpb24gcHJvY2VzcyB3aWxsIGNvbnRpbnVlCiAqCiAqIENsYXNzIHJlZmVyZW5jZToKICogKDEpIEh0dHBTZXJ2bGV0UmVxdWVzdCAtIGh0dHBzOi8vdG9tY2F0LmFwYWNoZS5vcmcvdG9tY2F0LTcuMC1kb2Mvc2VydmxldGFwaS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0Lmh0bWwuCiAqICgyKSBIdHRwU2VydmxldFJlc3BvbnNlIC0gaHR0cHM6Ly90b21jYXQuYXBhY2hlLm9yZy90b21jYXQtNy4wLWRvYy9zZXJ2bGV0YXBpL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlLmh0bWwuCiAqICgzKSBBdXRoblJlcXVlc3QgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvQXV0aG5SZXF1ZXN0Lmh0bWwuCiAqICg0KSBTU09Ub2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL2lwbGFuZXQvc3NvL1NTT1Rva2VuLmh0bWwuCiAqICg1KSBSZXNwb25zZSAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9wcm90b2NvbC9SZXNwb25zZS5odG1sCiAqICg2KSBTQU1MMkNvbnN0YW50cyAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9jb21tb24vU0FNTDJDb25zdGFudHMuaHRtbAogKiAoNykgUHJpbnRXcml0ZXIgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9pby9QcmludFdyaXRlci5odG1sCiAqICg4KSBNYW5hZ2VOYW1lSURSZXF1ZXN0IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMy9fYXR0YWNobWVudHMvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL3Byb3RvY29sL01hbmFnZU5hbWVJRFJlcXVlc3QuaHRtbAogKiAoOSkgTWFuYWdlTmFtZUlEUmVzcG9uc2UgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvTWFuYWdlTmFtZUlEUmVzcG9uc2UuaHRtbAogKiAoMTApIExvZ291dFJlcXVlc3QgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvTG9nb3V0UmVxdWVzdC5odG1sCiAqICgxMSkgTG9nb3V0UmVzcG9uc2UgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvTG9nb3V0UmVzcG9uc2UuaHRtbAogKiAoMTIpIFNwQWRhcHRlclNjcmlwdEhlbHBlciAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9wbHVnaW5zL3NjcmlwdGVkL1NwQWRhcHRlclNjcmlwdEhlbHBlci5odG1sLgogKiAoMTMpIFNBTUwyRXhjZXB0aW9uIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMy9fYXR0YWNobWVudHMvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL2NvbW1vbi9TQU1MMkV4Y2VwdGlvbi5odG1sLgogKi8KCi8qCiAqIFRlbXBsYXRlL2RlZmF1bHQgc2NyaXB0IGZvciBTQU1MMiBTUCBBZGFwdGVyIHNjcmlwdGVkIHBsdWdpbi4KICovCgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwcmVTaW5nbGVTaWduT25SZXF1ZXN0OgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIGlkcEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIGF1dGhuUmVxdWVzdAogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICovCmZ1bmN0aW9uIHByZVNpbmdsZVNpZ25PblJlcXVlc3QoKSB7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZVNpbmdsZVNpZ25PblByb2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlcwogKiAgICAgcHJvZmlsZQogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICovCmZ1bmN0aW9uIHByZVNpbmdsZVNpZ25PblByb2Nlc3MoKSB7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHBvc3RTaW5nbGVTaWduT25TdWNjZXNzOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICByZXF1ZXN0CiAqICAgICByZXNwb25zZQogKiAgICAgb3V0CiAqICAgICBzZXNzaW9uCiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlcwogKiAgICAgcHJvZmlsZQogKiAgICAgaXNGZWRlcmF0aW9uCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKgogKiBSZXR1cm4gLSB0cnVlIGlmIHJlc3BvbnNlIGlzIGJlaW5nIHJlZGlyZWN0ZWQsIGZhbHNlIGlmIG5vdC4gRGVmYXVsdCB0byBmYWxzZS4KICovCmZ1bmN0aW9uIHBvc3RTaW5nbGVTaWduT25TdWNjZXNzKCkgewogICAgcmV0dXJuIGZhbHNlOwp9CgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwb3N0U2luZ2xlU2lnbk9uRmFpbHVyZToKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIGF1dGhuUmVxdWVzdAogKiAgICAgcmVzCiAqICAgICBwcm9maWxlCiAqICAgICBmYWlsdXJlQ29kZQogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICoKICogUmV0dXJuIC0gdHJ1ZSBpZiByZXNwb25zZSBpcyBiZWluZyByZWRpcmVjdGVkLCBmYWxzZSBpZiBub3QuIERlZmF1bHQgdG8gZmFsc2UuCiAqLwpmdW5jdGlvbiBwb3N0U2luZ2xlU2lnbk9uRmFpbHVyZSgpIHsKICAgIHJldHVybiBmYWxzZTsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcG9zdE5ld05hbWVJRFN1Y2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICB1c2VySWQKICogICAgIGlkUmVxdWVzdAogKiAgICAgaWRSZXNwb25zZQogKiAgICAgYmluZGluZwogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICovCmZ1bmN0aW9uIHBvc3ROZXdOYW1lSURTdWNjZXNzKCkgewp9CgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwb3N0VGVybWluYXRlTmFtZUlEU3VjY2VzczoKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIHVzZXJJZAogKiAgICAgaWRSZXF1ZXN0CiAqICAgICBpZFJlc3BvbnNlCiAqICAgICBiaW5kaW5nCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcG9zdFRlcm1pbmF0ZU5hbWVJRFN1Y2Nlc3MoKSB7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZVNpbmdsZUxvZ291dFByb2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICB1c2VySWQKICogICAgIGxvZ291dFJlcXVlc3QKICogICAgIGxvZ291dFJlc3BvbnNlCiAqICAgICBiaW5kaW5nCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcHJlU2luZ2xlTG9nb3V0UHJvY2VzcygpIHsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcG9zdFNpbmdsZUxvZ291dFN1Y2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICB1c2VySWQKICogICAgIGxvZ291dFJlcXVlc3QKICogICAgIGxvZ291dFJlc3BvbnNlCiAqICAgICBiaW5kaW5nCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcG9zdFNpbmdsZUxvZ291dFN1Y2Nlc3MoKSB7Cn0=\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"SAML2_SP_ADAPTER\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"c735de08-f8f2-4e69-aa4a-2d8d3d438323\",\"name\":\"OAuth2 May Act Script\",\"description\":\"Default global script for OAuth2 May Act\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKLyoqCiAqIERlZmluZWQgdmFyaWFibGVzOgogKiB0b2tlbiAtIFRoZSBhY2Nlc3MgdG9rZW4gdG8gYmUgdXBkYXRlZC4gTXV0YWJsZSBvYmplY3QsIGFsbCBjaGFuZ2VzIHRvIHRoZSBhY2Nlc3MgdG9rZW4gd2lsbCBiZSByZWZsZWN0ZWQuCiAqIGxvZ2dlciAtIGFsd2F5cyBwcmVzZW50LCBjb3JyZXNwb25kaW5nIGxvZyBmaWxlcyB3aWxsIGJlIHByZWZpeGVkIHdpdGg6IHNjcmlwdHMuT0FVVEgyX0FDQ0VTU19UT0tFTl9NT0RJRklDQVRJT04uCiAqIHNjcmlwdE5hbWUgLSBhbHdheXMgcHJlc2VudCwgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgc2NyaXB0CiAqIHNlc3Npb24gLSBwcmVzZW50IGlmIHRoZSByZXF1ZXN0IGNvbnRhaW5zIHRoZSBzZXNzaW9uIGNvb2tpZSwgdGhlIHVzZXIncyBzZXNzaW9uIG9iamVjdAogKiByZXF1ZXN0UHJvcGVydGllcyAtIGFsd2F5cyBwcmVzZW50LCBjb250YWlucyBhIG1hcCBvZiByZXF1ZXN0IHByb3BlcnRpZXM6CiAqICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVyaSAtIHRoZSByZXF1ZXN0IFVSSQogKiAgICAgICAgICAgICAgICAgICAgIHJlYWxtIC0gdGhlIHJlYWxtIHRoYXQgdGhlIHJlcXVlc3QgcmVsYXRlcyB0bwogKiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXJhbXMgLSBhIG1hcCBvZiB0aGUgcmVxdWVzdCBwYXJhbXMgYW5kL29yIHBvc3RlZCBkYXRhLiBFYWNoIHZhbHVlIGlzIGEgbGlzdCBvZiBvbmUgb3IKICogICAgICAgICAgICAgICAgICAgICBtb3JlIHByb3BlcnRpZXMuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2Ugc2hvdWxkIGJlIGhhbmRsZWQgaW4gYWNjb3JkYW5jZSB3aXRoIE9XQVNQIGJlc3QKICogICAgICAgICAgICAgICAgICAgICBwcmFjdGljZXMuCiAqIGNsaWVudFByb3BlcnRpZXMgLSBwcmVzZW50IGlmIHRoZSBjbGllbnQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyBpZGVudGlmaWVkLCBjb250YWlucyBhIG1hcCBvZiBjbGllbnQKICogICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6CiAqICAgICAgICAgICAgICAgICAgICBjbGllbnRJZCAtIHRoZSBjbGllbnQncyBVcmkgZm9yIHRoZSByZXF1ZXN0IGxvY2FsZQogKiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyYW50VHlwZXMgLSBsaXN0IG9mIHRoZSBhbGxvd2VkIGdyYW50IHR5cGVzIChvcmcuZm9yZ2Vyb2NrLm9hdXRoMi5jb3JlLkdyYW50VHlwZSkKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBjbGllbnQKICogICAgICAgICAgICAgICAgICAgIGFsbG93ZWRSZXNwb25zZVR5cGVzIC0gbGlzdCBvZiB0aGUgYWxsb3dlZCByZXNwb25zZSB0eXBlcyBmb3IgdGhlIGNsaWVudAogKiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFNjb3BlcyAtIGxpc3Qgb2YgdGhlIGFsbG93ZWQgc2NvcGVzIGZvciB0aGUgY2xpZW50CiAqICAgICAgICAgICAgICAgICAgICBjdXN0b21Qcm9wZXJ0aWVzIC0gQSBtYXAgb2YgdGhlIGN1c3RvbSBwcm9wZXJ0aWVzIG9mIHRoZSBjbGllbnQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdHMgb3IgbWFwcyB3aWxsIGJlIGluY2x1ZGVkIGFzIHN1Yi1tYXBzLCBlLmc6CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdE1hcFtLZXkxXT1WYWx1ZTEgd2lsbCBiZSByZXR1cm5lZCBhcyB0ZXN0bWFwIC0+IEtleTEgLT4gVmFsdWUxCiAqCiAqIGlkZW50aXR5IC0gYWx3YXlzIHByZXNlbnQsIHRoZSBpZGVudGl0eSBvZiB0aGUgcmVzb3VyY2Ugb3duZXIKICogc2NvcGVzIC0gYWx3YXlzIHByZXNlbnQsIHRoZSByZXF1ZXN0ZWQgc2NvcGVzCiAqLwovKgppbXBvcnQgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZQoKdG9rZW4uc2V0TWF5QWN0KAogICAgSnNvblZhbHVlLmpzb24oSnNvblZhbHVlLm9iamVjdCgKICAgICAgICBKc29uVmFsdWUuZmllbGQoImNsaWVudF9pZCIsICJteUNsaWVudCIpLCAKICAgICAgICBKc29uVmFsdWUuZmllbGQoInN1YiIsICIodXNyIW15QWN0b3IpIikpKSkKKi8=\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"OAUTH2_MAY_ACT\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"4a171d3a-056b-4ab7-a19f-d7e93ddf7ae5\",\"name\":\"SAML2 NameID Mapper Script\",\"description\":\"Default global script for SAML2 NameID Mapper\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjQgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKLyoKICogVGhpcyBpcyBhbiBleGFtcGxlIFNBTUwyIE5hbWVJRCBNYXBwZXIgc2NyaXB0LgogKiBUaGlzIHNjcmlwdCBzaG91bGQgcmV0dXJuIGEgc3RyaW5nIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgU0FNTDIgTmFtZUlEIGlkZW50aWZpZXIuCiAqIFRoZSBleGFtcGxlIHNjcmlwdCBkZWxlZ2F0ZXMgdG8gdGhlIGNvbmZpZ3VyZWQgamF2YSBwbHVnaW4gdmlhIHRoZSBuYW1lSURTY3JpcHRIZWxwZXIgYmluZGluZy4KICovCm5hbWVJRFNjcmlwdEhlbHBlci5nZXROYW1lSURWYWx1ZSgpOw==\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"SAML2_NAMEID_MAPPER\",\"createdBy\":\"id=dsameuser,ou=user,dc=openam,dc=forgerock,dc=org\",\"creationDate\":1433147666269,\"lastModifiedBy\":\"id=dsameuser,ou=user,dc=openam,dc=forgerock,dc=org\",\"lastModifiedDate\":1433147666269,\"evaluatorVersion\":\"2.0\"},{\"_id\":\"3f93ef6e-e54a-4393-aba1-f322656db28a\",\"name\":\"OAuth2 Authorize Endpoint Data Provider Script\",\"description\":\"Default global script for OAuth2 Authorize Endpoint Data Provider\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjEgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKLyoKICogVGhpcyBzY3JpcHQgbGV0cyB5b3UgcmV0dXJuIGFkZGl0aW9uYWwgZGF0YSB3aGVuIGF1dGhvcml6ZSByZXF1ZXN0IGlzIGNhbGxlZC4KICoKICogRGVmaW5lZCB2YXJpYWJsZXM6CiAqCiAqIHNlc3Npb24gLSBTU09Ub2tlbiAoMSkKICogICAgICAgICAgIFByZXNlbnQgaWYgdGhlIHJlcXVlc3QgY29udGFpbnMgdGhlIHNlc3Npb24gY29va2llLCB0aGUgdXNlcidzIHNlc3Npb24gb2JqZWN0LgogKgogKiBodHRwQ2xpZW50IC0gSFRUUCBDbGllbnQgKDIpLgogKiAgICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBIVFRQIGNsaWVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIG1ha2UgZXh0ZXJuYWwgSFRUUCByZXF1ZXN0cwogKgogKiBsb2dnZXIgLSBEZWJ1ZyAoMykKICogICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSAiU2NyaXB0ZWRBdXRob3JpemVFbmRwb2ludERhdGFQcm92aWRlciIgZGVidWcgbG9nZ2VyIGluc3RhbmNlOgogKiAgICAgICAgICBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9zY3JpcHRpbmctZ3VpZGUvc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLmh0bWwjc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLgogKiAgICAgICAgICBDb3JyZXNwb25kaW5nIGxvZyBmaWxlcyB3aWxsIGJlIHByZWZpeGVkIHdpdGg6IHNjcmlwdHMuT0FVVEgyX0FVVEhPUklaRV9FTkRQT0lOVF9EQVRBX1BST1ZJREVSLgogKgogKiBzY3JpcHROYW1lIC0gU3RyaW5nIChwcmltaXRpdmUpLgogKiAgICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIHNjcmlwdAogKgogKiBSZXR1cm4gLSBhIE1hcDxTdHJpbmcsIFN0cmluZz4gb2YgYWRkaXRpb25hbCBkYXRhICg0KS4KICoKICogQ2xhc3MgcmVmZXJlbmNlOgogKiAoMSkgU1NPVG9rZW4gLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL2NvbS9pcGxhbmV0L3Nzby9TU09Ub2tlbi5odG1sLgogKiAoMikgQ2xpZW50IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL2h0dHAvQ2xpZW50Lmh0bWwuCiAqICgzKSBEZWJ1ZyAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuaHRtbCNzY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuCiAqICg0KSBNYXAgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS91dGlsL0hhc2hNYXAuaHRtbC4KICovCgovKioKICogRGVmYXVsdCBhdXRob3JpemUgZW5kcG9pbnQgZGF0YSBwcm92aWRlciBzY3JpcHQgdG8gdXNlIGFzIGEgdGVtcGxhdGUgZm9yIG5ldyBzY3JpcHRzLgogKi8KCi8qIEVYQU1QTEUKdmFyIG1hcCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwoKZnVuY3Rpb24gYWRkQWRkaXRpb25hbERhdGEoKSB7CgogICAgLy9JZiBjb25zdGFudCBkYXRhIG5lZWRzIHRvIGJlIHJldHVybmVkCiAgICBtYXAucHV0KCJoZWxsbyIsICJ3b3JsZCIpOwoKICAgIC8vSWYgc29tZSBkYXRhIG5lZWRzIHRvIGJlIHJldHVybmVkIGZyb20gdGhpcmQgcGFydHkgc2VydmljZQogICAgYWRkQWRkaXRpb25hbERhdGFGcm9tRXh0ZXJuYWxTZXJ2aWNlKCk7CgogICAgLy9JZiB0aGVyZSBpcyBhIG5lZWQgdG8gcmV0dXJuIHNvbWUgdXNlciBzZXNzaW9uIGRhdGEKICAgIGFkZEFkZGl0aW9uYWxEYXRhRnJvbVNlc3Npb25Qcm9wZXJ0aWVzKCkKCiAgICByZXR1cm4gbWFwOwp9OwoKZnVuY3Rpb24gYWRkQWRkaXRpb25hbERhdGFGcm9tRXh0ZXJuYWxTZXJ2aWNlKCkgewogIHZhciBmckphdmEgPSBKYXZhSW1wb3J0ZXIoCiAgICAgICAgb3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5leGNlcHRpb25zLlNlcnZlckV4Y2VwdGlvbgogICAgKTsKICB0cnkgewogICAgICAgIC8vT2J0YWluIGFkZGl0aW9uYWwgZGF0YSBieSBwZXJmb3JtaW5nIGEgUkVTVCBjYWxsIHRvIGFuIGV4dGVybmFsIHNlcnZpY2UKICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBvcmcuZm9yZ2Vyb2NrLmh0dHAucHJvdG9jb2wuUmVxdWVzdCgpOwogICAgICAgIHJlcXVlc3Quc2V0VXJpKCJodHRwczovL3RoaXJkLnBhcnR5LmFwcC9oZWxsby5qc3AiKTsKICAgICAgICByZXF1ZXN0LnNldE1ldGhvZCgiUE9TVCIpOwogICAgICAgIC8vcmVxdWVzdC5zZXRFbnRpdHkoImZvbz1iYXImaGVsbG89d29ybGQiKTsKICAgICAgICByZXF1ZXN0LnNldEVudGl0eShqc29uKG9iamVjdCgKICAgICAgICAgICAgICAgICAgICBmaWVsZCgiZm9vIiwgImJhciIpKSkpOwogICAgICAgIHZhciByZXNwb25zZSA9IGh0dHBDbGllbnQuc2VuZChyZXF1ZXN0KS5nZXRPclRocm93KCk7CiAgICAgICAgbG9nUmVzcG9uc2UocmVzcG9uc2UpOwogICAgICAgIHZhciByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3BvbnNlLmdldEVudGl0eSgpKTsKICAgICAgICBtYXAucHV0KCJzb21lS2V5IixyZXN1bHQuZ2V0KCJzb21lS2V5IikpOwogIH0gY2F0Y2ggKGVycikgewogICAgIHRocm93IG5ldyBmckphdmEuU2VydmVyRXhjZXB0aW9uKGVycik7CiAgfQp9OwoKZnVuY3Rpb24gYWRkQWRkaXRpb25hbERhdGFGcm9tU2Vzc2lvblByb3BlcnRpZXMoKSB7CiAgLy9BZGQgYWRkaXRpb25hbCBkYXRhIGZyb20gc2Vzc2lvbiBwcm9wZXJ0eSB2YWx1ZXMKICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeyAvLyBzZXNzaW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIHJlc291cmNlIG93bmVyIHBhc3N3b3JkIGNyZWRlbnRpYWxzIGdyYW50CiAgICAgbWFwLnB1dCgiaXBBZGRyZXNzIiwgc2Vzc2lvbi5nZXRQcm9wZXJ0eSgiSG9zdCIpKQogICB9Cn07CgpmdW5jdGlvbiBsb2dSZXNwb25zZShyZXNwb25zZSkgewogICAgbG9nZ2VyLm1lc3NhZ2UoIlVzZXIgUkVTVCBDYWxsLiBTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSArICIsIEJvZHk6ICIgKyByZXNwb25zZS5nZXRFbnRpdHkoKSk7Cn07CgphZGRBZGRpdGlvbmFsRGF0YSgpOwoqLw==\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"OAUTH2_AUTHORIZE_ENDPOINT_DATA_PROVIDER\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"223739f3-9c54-43b7-9572-3c5338786145\",\"name\":\"Format Username\",\"description\":\"null\",\"script\":\"dmFyIHVzZXJuYW1lID0gc2hhcmVkU3RhdGUuZ2V0KCJ1c2VybmFtZSIpOwoKc2hhcmVkU3RhdGUucHV0KCJkaXNwbGF5TmFtZSIsIHVzZXJuYW1lKTsKb3V0Y29tZSA9ICJjb250aW51ZSI7\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"bb393d07-a121-47e2-9d24-1a1066f39ec0\",\"name\":\"My Example Script Using Libraries\",\"description\":\"My Example Script Using Libraries\",\"script\":\"LyoqCiAqIFRlc3RpbmcgbGlicmFyeSBzY3JpcHRzCiAqLwp2YXIgbXlsaWIgPSByZXF1aXJlKCdNeSBFeGFtcGxlIExpYnJhcnknKTsKdmFyIGxvZ2dlcnMgPSByZXF1aXJlKCdMaWJyYXJ5IFNjcmlwdCcpOwoKbXlsaWIuYWRkKDEpOwpteWxpYi5sb2dUb3RhbChsb2dnZXIpOwpteWxpYi5hZGQoMyk7Cm15bGliLmxvZ1RvdGFsV2l0aE1lc3NhZ2UobG9nZ2VyLCBteWxpYi5NU0cpOwoKb3V0Y29tZSA9ICd0cnVlJzs=\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"2.0\"},{\"_id\":\"6c49bebe-3a62-11ed-a261-0242ac120002\",\"name\":\"Library Script\",\"description\":\"Default global library script to be referenced from other scripts\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjItMjAyMyBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgovKgogKiBUaGlzIGlzIGFuIGV4YW1wbGUgbGlicmFyeSBzY3JpcHQgd2l0aCBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gb3RoZXIgc2NyaXB0cy4KICogVG8gcmVmZXJlbmNlIGl0LCB1c2UgdGhlIGZvbGxvd2luZzoKICoKICogdmFyIGxpYnJhcnkgPSByZXF1aXJlKCJMaWJyYXJ5IFNjcmlwdCIpOwogKgogKiBsaWJyYXJ5LmxvZ0Vycm9yKGxvZ2dlciwgIkVycm9yIG1lc3NhZ2UiKTsKICogbGlicmFyeS5sb2dEZWJ1Zyhsb2dnZXIsICJEZWJ1ZyBtZXNzYWdlIik7CiAqLwoKZnVuY3Rpb24gbG9nRXJyb3IobG9nLCBlcnJvck1lc3NhZ2UpIHsKICBsb2cuZXJyb3IoZXJyb3JNZXNzYWdlKTsKfQoKZnVuY3Rpb24gbG9nV2FybmluZyhsb2csIHdhcm5pbmdNZXNzYWdlKSB7CiAgbG9nLndhcm4od2FybmluZ01lc3NhZ2UpOwp9CgpleHBvcnRzLmxvZ0Vycm9yID0gbG9nRXJyb3I7CmV4cG9ydHMubG9nV2FybmluZyA9IGxvZ1dhcm5pbmc7CgovLyBBbHRlcm5hdGl2ZWx5LCBleHBvcnRzIGNhbiBiZSBkZWNsYXJlZCB1c2luZyBhbiBpbmxpbmUgYXJyb3cgZnVuY3Rpb24KCmV4cG9ydHMubG9nSW5mbyA9IChsb2csIGluZm9NZXNzYWdlKSA9PiBsb2cuaW5mbyhpbmZvTWVzc2FnZSk7CmV4cG9ydHMubG9nRGVidWcgPSAobG9nLCBkZWJ1Z01lc3NhZ2UpID0+IGxvZy5kZWJ1ZyhkZWJ1Z01lc3NhZ2UpOwo=\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"LIBRARY\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"2.0\"},{\"_id\":\"73cecbfc-dad0-4395-be6a-6858ee3a80e5\",\"name\":\"Microsoft Profile Normalization\",\"description\":\"Normalizes raw profile data from Microsoft\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKLyoKewogICAgIkBvZGF0YS5jb250ZXh0IjogImh0dHBzOi8vZ3JhcGgubWljcm9zb2Z0LmNvbS92MS4wLyRtZXRhZGF0YSN1c2Vycy8kZW50aXR5IiwKICAgICJAb2RhdGEuaWQiOiAiaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tL3YyLzcxMWZmYTljLTU5NzItNDcxMy1hY2UzLTY4OGM5NzMyNjE0YS9kaXJlY3RvcnlPYmplY3RzLzdkNzc1OWUyLTM2ZDgtNGU2NC1iMTczLTNmODkwZDdkNDZkNi9NaWNyb3NvZnQuRGlyZWN0b3J5U2VydmljZXMuVXNlciIsCiAgICAiYnVzaW5lc3NQaG9uZXMiOiBbCiAgICAgICAgIjE4MDE0NzM1NDUxIgogICAgXSwKICAgICJkaXNwbGF5TmFtZSI6ICJWb2xrZXIgU2NoZXViZXIiLAogICAgImdpdmVuTmFtZSI6ICJWb2xrZXIiLAogICAgImpvYlRpdGxlIjogbnVsbCwKICAgICJtYWlsIjogInZzY2hldWJlckB2c2NoZXViZXIub25taWNyb3NvZnQuY29tIiwKICAgICJtb2JpbGVQaG9uZSI6IG51bGwsCiAgICAib2ZmaWNlTG9jYXRpb24iOiBudWxsLAogICAgInByZWZlcnJlZExhbmd1YWdlIjogbnVsbCwKICAgICJzdXJuYW1lIjogIlNjaGV1YmVyIiwKICAgICJ1c2VyUHJpbmNpcGFsTmFtZSI6ICJ2c2NoZXViZXJAdnNjaGV1YmVyLm9ubWljcm9zb2Z0LmNvbSIsCiAgICAiaWQiOiAiN2Q3NzU5ZTItMzZkOC00ZTY0LWIxNzMtM2Y4OTBkN2Q0NmQ2Igp9CiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCmxvZ2dlci5tZXNzYWdlKCJLYXVhaSBNaWNyb3NvZnQgUHJvZmlsZSBOb3JtYWxpemF0aW9uOiByYXdQcm9maWxlPXt9IiwgcmF3UHJvZmlsZSkKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLmlkKSwKICAgICAgICBmaWVsZCgiZGlzcGxheU5hbWUiLCByYXdQcm9maWxlLmRpc3BsYXlOYW1lKSwKICAgICAgICBmaWVsZCgiZ2l2ZW5OYW1lIiwgcmF3UHJvZmlsZS5naXZlbk5hbWUpLAogICAgICAgIGZpZWxkKCJmYW1pbHlOYW1lIiwgcmF3UHJvZmlsZS5zdXJuYW1lKSwKICAgICAgICBmaWVsZCgiZW1haWwiLCByYXdQcm9maWxlLnVzZXJQcmluY2lwYWxOYW1lKSwKICAgICAgICBmaWVsZCgidXNlcm5hbWUiLCByYXdQcm9maWxlLnVzZXJQcmluY2lwYWxOYW1lKSwKICAgICAgICBmaWVsZCgiZ3JvdXBzIiwgcmF3UHJvZmlsZS5ncm91cHMpKSk=\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"c827d2b4-3608-4693-868e-bbcf86bd87c7\",\"name\":\"Scripted Module - Client Side\",\"description\":\"Default global script for client side Scripted Authentication Module\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMTYtMjAyMyBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCi8qIERlZmF1bHQgQXV0aGVudGljYXRpb24gY2xpZW50IHNpZGUgc2NyaXB0IHRvIHVzZSBhcyBhIHRlbXBsYXRlIGZvciBuZXcgc2NyaXB0cyAqLwo=\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_CLIENT_SIDE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"ed685f9f-5909-4726-86e8-22bd38b47663\",\"name\":\"Normalized Profile to Identity\",\"description\":\"Converts a normalized social profile into an Identity\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjEgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCmltcG9ydCBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlCgpKc29uVmFsdWUgaWRlbnRpdHkgPSBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiZ2l2ZW5OYW1lIiwgbm9ybWFsaXplZFByb2ZpbGUuZ2l2ZW5OYW1lKSwKICAgICAgICBmaWVsZCgic24iLCBub3JtYWxpemVkUHJvZmlsZS5mYW1pbHlOYW1lKSwKICAgICAgICBmaWVsZCgibWFpbCIsIG5vcm1hbGl6ZWRQcm9maWxlLmVtYWlsKSwKICAgICAgICBmaWVsZCgiY24iLCBub3JtYWxpemVkUHJvZmlsZS5kaXNwbGF5TmFtZSksCiAgICAgICAgZmllbGQoInVzZXJOYW1lIiwgbm9ybWFsaXplZFByb2ZpbGUudXNlcm5hbWUpLAogICAgICAgIGZpZWxkKCJpcGxhbmV0LWFtLXVzZXItYWxpYXMtbGlzdCIsIHNlbGVjdGVkSWRwICsgJy0nICsgbm9ybWFsaXplZFByb2ZpbGUuaWQuYXNTdHJpbmcoKSkpKQoKcmV0dXJuIGlkZW50aXR5\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"fb09ba1b-e9b9-4517-8f11-a7cfe8b65dfd\",\"name\":\"FrodoSPAdapter - imported (2)\",\"description\":\"null\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjMgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKLyoKICogVGhlIHNjcmlwdCBoYXMgdGhlc2UgdG9wIGxldmVsIGZ1bmN0aW9ucyB0aGF0IGNvdWxkIGJlIGV4ZWN1dGVkIGR1cmluZyBhIFNBTUwyIGZsb3cuCiAqICAgICAgLSBwcmVTaW5nbGVTaWduT25SZXF1ZXN0CiAqICAgICAgLSBwcmVTaW5nbGVTaWduT25Qcm9jZXNzCiAqICAgICAgLSBwb3N0U2luZ2xlU2lnbk9uU3VjY2VzcwogKiAgICAgIC0gcG9zdFNpbmdsZVNpZ25PbkZhaWx1cmUKICogICAgICAtIHBvc3ROZXdOYW1lSURTdWNjZXNzCiAqICAgICAgLSBwb3N0VGVybWluYXRlTmFtZUlEU3VjY2VzcwogKiAgICAgIC0gcHJlU2luZ2xlTG9nb3V0UHJvY2VzcwogKiAgICAgIC0gcG9zdFNpbmdsZUxvZ291dFN1Y2Nlc3MKICoKICogUGxlYXNlIHNlZSB0aGUgSmF2YURvYyBmb3IgdGhlIGludGVyZmFjZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBtZXRob2RzLgogKiBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmFtL3NhbWwyL3BsdWdpbnMvU1BBZGFwdGVyLmh0bWwKICogTm90ZSB0aGF0IHRoZSBpbml0aWFsaXplIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBzY3JpcHRzLgogKgogKiBEZWZpbmVkIHZhcmlhYmxlcy4gQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlIHJlc3BlY3RpdmUgZnVuY3Rpb25zIGZvciB0aGUgdmFyaWFibGVzIGF2YWlsYWJsZSB0byBpdC4KICoKICogaG9zdGVkRW50aXR5SWQgLSBTdHJpbmcKICogICAgIEVudGl0eSBJRCBmb3IgdGhlIGhvc3RlZCBJRFAKICogcmVhbG0gLSBTdHJpbmcKICogICAgIFJlYWxtIG9mIHRoZSBob3N0ZWQgSURQCiAqIGlkcEVudGl0eUlkIC0gU3RyaW5nCiAqICAgICBUaGUgZW50aXR5IElEIGZvciB0aGUgSWRlbnRpdHkgUHJvdmlkZXIgZm9yIHdoaWNoIHRoZSBzaWduLW9uIHJlcXVlc3Qgd2lsbCBiZSBzZW50LgogKiByZXF1ZXN0IC0gSHR0cFNlcnZsZXRSZXF1ZXN0ICgxKQogKiAgICAgU2VydmxldCByZXF1ZXN0IG9iamVjdAogKiByZXNwb25zZSAtIEh0dHBTZXJ2bGV0UmVzcG9uc2UgKDIpCiAqICAgICBTZXJ2bGV0IHJlc3BvbnNlIG9iamVjdAogKiBhdXRoblJlcXVlc3QgLSBBdXRoblJlcXVlc3QgKDMpCiAqICAgICBUaGUgYXV0aGVudGljYXRpb24gcmVxdWVzdCBzZW50IHRoYXQgaXMgc2VudCBmcm9tIHRoZSBTZXJ2aWNlIFByb3ZpZGVyLgogKiBzZXNzaW9uIC0gU1NPVG9rZW4gKDQpCiAqICAgICBUaGUgc2luZ2xlIHNpZ24tb24gc2Vzc2lvbi4gVGhlIHJlZmVyZW5jZSB0eXBlIG9mIHRoaXMgaXMgT2JqZWN0IGFuZCB3b3VsZCBuZWVkIHRvIGJlIGNhc3RlZCB0byBTU09Ub2tlbi4KICogcmVzIC0gUmVzcG9uc2UgKDUpCiAqICAgICBUaGUgU1NPIFJlc3BvbnNlIHJlY2VpdmVkIGZyb20gdGhlIElkZW50aXR5IFByb3ZpZGVyLgogKiBwcm9maWxlIC0gU3RyaW5nCiAqICAgICBUaGUgcHJvdG9jb2wgcHJvZmlsZSB0aGF0IGlzIHVzZWQsIHRoaXMgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZnJvbSBTQU1MMkNvbnN0YW50cyAoNik6CiAqICAgICAgICAgIC0gU0FNTDJDb25zdGFudHMuSFRUUF9QT1NUCiAqICAgICAgICAgIC0gU0FNTDJDb25zdGFudHMuSFRUUF9BUlRJRkFDVAogKiAgICAgICAgICAtIFNBTUwyQ29uc3RhbnRzLlBBT1MKICogb3V0IC0gUHJpbnRXcml0ZXIgKDcpCiAqICAgICBUaGUgUHJpbnRXcml0ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSB0by4KICogaXNGZWRlcmF0aW9uIC0gYm9vbGVhbgogKiAgICAgU2V0IHRvIHRydWUgaWYgdXNpbmcgZmVkZXJhdGlvbiwgb3RoZXJ3aXNlIGZhbHNlLgogKiBmYWlsdXJlQ29kZSAtIGludAogKiAgICAgQW4gaW50ZWdlciBob2xkaW5nIHRoZSBmYWlsdXJlIGNvZGUgd2hlbiBhbiBlcnJvciBoYXMgb2NjdXJyZWQuIEZvciBwb3RlbnRpYWwgdmFsdWVzIHNlZSBTUEFkYXB0ZXIuCiAqIHVzZXJJZCAtIFN0cmluZwogKiAgICAgVGhlIHVuaXF1ZSB1bml2ZXJzYWwgSUQgb2YgdGhlIHVzZXIgd2l0aCB3aG9tIHRoZSBuZXcgbmFtZSBpZGVudGlmaWVyIHJlcXVlc3Qgd2FzIHBlcmZvcm1lZC4KICogaWRSZXF1ZXN0IC0gTWFuYWdlTmFtZUlEUmVxdWVzdCAoOCkKICogICAgIFRoZSBuZXcgbmFtZSBpZGVudGlmaWVyIHJlcXVlc3QsIHRoaXMgd2lsbCBiZSBudWxsIGlmIHRoZSByZXF1ZXN0IG9iamVjdCBpcyBub3QgYXZhaWxhYmxlCiAqIGlkUmVzcG9uc2UgLSBNYW5hZ2VOYW1lSURSZXNwb25zZSAoOSkKICogICAgIFRoZSBuZXcgbmFtZSBpZGVudGlmaWVyIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmUgbnVsbCBpZiB0aGUgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUKICogYmluZGluZyAtIFN0cmluZwogKiAgICAgVGhlIGJpbmRpbmcgdXNlZCBmb3IgdGhlIG5ldyBuYW1lIGlkZW50aWZpZXIgcmVxdWVzdC4gVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICogICAgICAgICAgLSBTQU1MMkNvbnN0YW50cy5TT0FQCiAqICAgICAgICAgIC0gU0FNTDJDb25zdGFudHMuSFRUUF9SRURJUkVDVAogKiBsb2dvdXRSZXF1ZXN0IC0gTG9nb3V0UmVxdWVzdCAoMTApCiAqICAgICBUaGUgc2luZ2xlIGxvZ291dCByZXF1ZXN0LgogKiBsb2dvdXRSZXNwb25zZSAtIExvZ291dFJlc3BvbnNlICgxMSkKICogICAgIFRoZSBzaW5nbGUgbG9nb3V0IHJlc3BvbnNlLgogKiBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIgLSBTcEFkYXB0ZXJTY3JpcHRIZWxwZXIgKDEyKQogKiAgICAgQW4gaW5zdGFuY2Ugb2YgU3BBZGFwdGVyU2NyaXB0SGVscGVyIGNvbnRhaW5pbmcgaGVscGVyIG1ldGhvZHMuIFNlZSBKYXZhZG9jIGZvciBtb3JlIGRldGFpbHMuCiAqIGxvZ2dlciAtIExvZ2dlciBpbnN0YW5jZQogKiAgICAgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvc2NyaXB0aW5nLWd1aWRlL3NjcmlwdGluZy1hcGktZ2xvYmFsLWxvZ2dlci5odG1sI3NjcmlwdGluZy1hcGktZ2xvYmFsLWxvZ2dlci4KICogICAgIENvcnJlc3BvbmRpbmcgbG9nIGZpbGVzIHdpbGwgYmUgcHJlZml4ZWQgd2l0aDogc2NyaXB0cy48c2NyaXB0IG5hbWU+CiAqCiAqIFRocm93cyBTQU1MMkV4Y2VwdGlvbiAoMTMpOgogKiAgICAgZm9yIGFueSBleGNlcHRpb25zIG9jY3VycmluZyBpbiB0aGUgYWRhcHRlci4gVGhlIGZlZGVyYXRpb24gcHJvY2VzcyB3aWxsIGNvbnRpbnVlCiAqCiAqIENsYXNzIHJlZmVyZW5jZToKICogKDEpIEh0dHBTZXJ2bGV0UmVxdWVzdCAtIGh0dHBzOi8vdG9tY2F0LmFwYWNoZS5vcmcvdG9tY2F0LTcuMC1kb2Mvc2VydmxldGFwaS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0Lmh0bWwuCiAqICgyKSBIdHRwU2VydmxldFJlc3BvbnNlIC0gaHR0cHM6Ly90b21jYXQuYXBhY2hlLm9yZy90b21jYXQtNy4wLWRvYy9zZXJ2bGV0YXBpL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlLmh0bWwuCiAqICgzKSBBdXRoblJlcXVlc3QgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvQXV0aG5SZXF1ZXN0Lmh0bWwuCiAqICg0KSBTU09Ub2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL2lwbGFuZXQvc3NvL1NTT1Rva2VuLmh0bWwuCiAqICg1KSBSZXNwb25zZSAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9wcm90b2NvbC9SZXNwb25zZS5odG1sCiAqICg2KSBTQU1MMkNvbnN0YW50cyAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9jb21tb24vU0FNTDJDb25zdGFudHMuaHRtbAogKiAoNykgUHJpbnRXcml0ZXIgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9pby9QcmludFdyaXRlci5odG1sCiAqICg4KSBNYW5hZ2VOYW1lSURSZXF1ZXN0IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMy9fYXR0YWNobWVudHMvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL3Byb3RvY29sL01hbmFnZU5hbWVJRFJlcXVlc3QuaHRtbAogKiAoOSkgTWFuYWdlTmFtZUlEUmVzcG9uc2UgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvTWFuYWdlTmFtZUlEUmVzcG9uc2UuaHRtbAogKiAoMTApIExvZ291dFJlcXVlc3QgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvTG9nb3V0UmVxdWVzdC5odG1sCiAqICgxMSkgTG9nb3V0UmVzcG9uc2UgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvTG9nb3V0UmVzcG9uc2UuaHRtbAogKiAoMTIpIFNwQWRhcHRlclNjcmlwdEhlbHBlciAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9wbHVnaW5zL3NjcmlwdGVkL1NwQWRhcHRlclNjcmlwdEhlbHBlci5odG1sLgogKiAoMTMpIFNBTUwyRXhjZXB0aW9uIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMy9fYXR0YWNobWVudHMvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL2NvbW1vbi9TQU1MMkV4Y2VwdGlvbi5odG1sLgogKi8KCi8qCiAqIFRlbXBsYXRlL2RlZmF1bHQgc2NyaXB0IGZvciBTQU1MMiBTUCBBZGFwdGVyIHNjcmlwdGVkIHBsdWdpbi4KICovCgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwcmVTaW5nbGVTaWduT25SZXF1ZXN0OgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIGlkcEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIGF1dGhuUmVxdWVzdAogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICovCmZ1bmN0aW9uIHByZVNpbmdsZVNpZ25PblJlcXVlc3QoKSB7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZVNpbmdsZVNpZ25PblByb2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlcwogKiAgICAgcHJvZmlsZQogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICovCmZ1bmN0aW9uIHByZVNpbmdsZVNpZ25PblByb2Nlc3MoKSB7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHBvc3RTaW5nbGVTaWduT25TdWNjZXNzOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICByZXF1ZXN0CiAqICAgICByZXNwb25zZQogKiAgICAgb3V0CiAqICAgICBzZXNzaW9uCiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlcwogKiAgICAgcHJvZmlsZQogKiAgICAgaXNGZWRlcmF0aW9uCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKgogKiBSZXR1cm4gLSB0cnVlIGlmIHJlc3BvbnNlIGlzIGJlaW5nIHJlZGlyZWN0ZWQsIGZhbHNlIGlmIG5vdC4gRGVmYXVsdCB0byBmYWxzZS4KICovCmZ1bmN0aW9uIHBvc3RTaW5nbGVTaWduT25TdWNjZXNzKCkgewogICAgcmV0dXJuIGZhbHNlOwp9CgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwb3N0U2luZ2xlU2lnbk9uRmFpbHVyZToKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIGF1dGhuUmVxdWVzdAogKiAgICAgcmVzCiAqICAgICBwcm9maWxlCiAqICAgICBmYWlsdXJlQ29kZQogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICoKICogUmV0dXJuIC0gdHJ1ZSBpZiByZXNwb25zZSBpcyBiZWluZyByZWRpcmVjdGVkLCBmYWxzZSBpZiBub3QuIERlZmF1bHQgdG8gZmFsc2UuCiAqLwpmdW5jdGlvbiBwb3N0U2luZ2xlU2lnbk9uRmFpbHVyZSgpIHsKICAgIHJldHVybiBmYWxzZTsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcG9zdE5ld05hbWVJRFN1Y2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICB1c2VySWQKICogICAgIGlkUmVxdWVzdAogKiAgICAgaWRSZXNwb25zZQogKiAgICAgYmluZGluZwogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICovCmZ1bmN0aW9uIHBvc3ROZXdOYW1lSURTdWNjZXNzKCkgewp9CgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwb3N0VGVybWluYXRlTmFtZUlEU3VjY2VzczoKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIHVzZXJJZAogKiAgICAgaWRSZXF1ZXN0CiAqICAgICBpZFJlc3BvbnNlCiAqICAgICBiaW5kaW5nCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcG9zdFRlcm1pbmF0ZU5hbWVJRFN1Y2Nlc3MoKSB7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZVNpbmdsZUxvZ291dFByb2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICB1c2VySWQKICogICAgIGxvZ291dFJlcXVlc3QKICogICAgIGxvZ291dFJlc3BvbnNlCiAqICAgICBiaW5kaW5nCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcHJlU2luZ2xlTG9nb3V0UHJvY2VzcygpIHsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcG9zdFNpbmdsZUxvZ291dFN1Y2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICB1c2VySWQKICogICAgIGxvZ291dFJlcXVlc3QKICogICAgIGxvZ291dFJlc3BvbnNlCiAqICAgICBiaW5kaW5nCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcG9zdFNpbmdsZUxvZ291dFN1Y2Nlc3MoKSB7Cn0=\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"SAML2_SP_ADAPTER\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"39c08084-1238-43e8-857f-2e11005eac49\",\"name\":\"Alpha OAuth2 Access Token Modification Script\",\"description\":\"Default alpha realm script for OAuth2 Access Token Modification\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMTktMjAyMSBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMKICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgovKgogKiBUaGlzIHNjcmlwdCBsZXRzIHlvdSBtb2RpZnkgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIE9BdXRoMiBhY2Nlc3MgdG9rZW4KICogd2l0aCBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZSBBY2Nlc3NUb2tlbiAoMSkgaW50ZXJmYWNlLgogKiBUaGUgY2hhbmdlcyBtYWRlIHRvIE9BdXRoMiBhY2Nlc3MgdG9rZW5zIHdpbGwgZGlyZWN0bHkgaW1wYWN0IHRoZSBzaXplIG9mIHRoZSBDVFMgdG9rZW5zLAogKiBhbmQsIHNpbWlsYXJseSwgdGhlIHNpemUgb2YgdGhlIEpXVHMgaWYgY2xpZW50LWJhc2VkIE9BdXRoMiB0b2tlbnMgYXJlIHV0aWxpemVkLgogKiBXaGVuIGFkZGluZy91cGRhdGluZyBmaWVsZHMgbWFrZSBzdXJlIHRoYXQgdGhlIHRva2VuIHNpemUgcmVtYWlucyB3aXRoaW4gY2xpZW50L3VzZXItYWdlbnQgbGltaXRzLgogKgogKiBEZWZpbmVkIHZhcmlhYmxlczoKICogYWNjZXNzVG9rZW4gLSBBY2Nlc3NUb2tlbiAoMSkuCiAqICAgICAgICAgICAgICAgVGhlIGFjY2VzcyB0b2tlbiB0byBiZSB1cGRhdGVkLgogKiAgICAgICAgICAgICAgIE11dGFibGUgb2JqZWN0LCBhbGwgY2hhbmdlcyB0byB0aGUgYWNjZXNzIHRva2VuIHdpbGwgYmUgcmVmbGVjdGVkLgogKiBzY29wZXMgLSBTZXQ8U3RyaW5nPiAoNikuCiAqICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICogcmVxdWVzdFByb3BlcnRpZXMgLSBVbm1vZGlmaWFibGUgTWFwICg1KS4KICogICAgICAgICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgY29udGFpbnMgYSBtYXAgb2YgcmVxdWVzdCBwcm9wZXJ0aWVzOgogKiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RVcmkgLSBUaGUgcmVxdWVzdCBVUkkuCiAqICAgICAgICAgICAgICAgICAgICAgcmVhbG0gLSBUaGUgcmVhbG0gdGhhdCB0aGUgcmVxdWVzdCByZWxhdGVzIHRvLgogKiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXJhbXMgLSBBIG1hcCBvZiB0aGUgcmVxdWVzdCBwYXJhbXMgYW5kL29yIHBvc3RlZCBkYXRhLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFYWNoIHZhbHVlIGlzIGEgbGlzdCBvZiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIHNob3VsZCBiZSBoYW5kbGVkIGluIGFjY29yZGFuY2Ugd2l0aCBPV0FTUCBiZXN0IHByYWN0aWNlczoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9vd2FzcC5vcmcvd3d3LWNvbW11bml0eS92dWxuZXJhYmlsaXRpZXMvVW5zYWZlX3VzZV9vZl9SZWZsZWN0aW9uLgogKiBjbGllbnRQcm9wZXJ0aWVzIC0gVW5tb2RpZmlhYmxlIE1hcCAoNSkuCiAqICAgICAgICAgICAgICAgICAgICBQcmVzZW50IGlmIHRoZSBjbGllbnQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyBpZGVudGlmaWVkLCBjb250YWlucyBhIG1hcCBvZiBjbGllbnQgcHJvcGVydGllczoKICogICAgICAgICAgICAgICAgICAgIGNsaWVudElkIC0gVGhlIGNsaWVudCdzIFVSSSBmb3IgdGhlIHJlcXVlc3QgbG9jYWxlLgogKiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyYW50VHlwZXMgLSBMaXN0IG9mIHRoZSBhbGxvd2VkIGdyYW50IHR5cGVzIChvcmcuZm9yZ2Vyb2NrLm9hdXRoMi5jb3JlLkdyYW50VHlwZSkgZm9yIHRoZSBjbGllbnQuCiAqICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUmVzcG9uc2VUeXBlcyAtIExpc3Qgb2YgdGhlIGFsbG93ZWQgcmVzcG9uc2UgdHlwZXMgZm9yIHRoZSBjbGllbnQuCiAqICAgICAgICAgICAgICAgICAgICBhbGxvd2VkU2NvcGVzIC0gTGlzdCBvZiB0aGUgYWxsb3dlZCBzY29wZXMgZm9yIHRoZSBjbGllbnQuCiAqICAgICAgICAgICAgICAgICAgICBjdXN0b21Qcm9wZXJ0aWVzIC0gQSBtYXAgb2YgdGhlIGN1c3RvbSBwcm9wZXJ0aWVzIG9mIHRoZSBjbGllbnQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdHMgb3IgbWFwcyB3aWxsIGJlIGluY2x1ZGVkIGFzIHN1Yi1tYXBzOyBmb3IgZXhhbXBsZToKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21NYXBbS2V5MV09VmFsdWUxIHdpbGwgYmUgcmV0dXJuZWQgYXMgY3VzdG9tTWFwIC0+IEtleTEgLT4gVmFsdWUxLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvIGFkZCBjdXN0b20gcHJvcGVydGllcyB0byBhIGNsaWVudCwgdXBkYXRlIHRoZSBDdXN0b20gUHJvcGVydGllcyBmaWVsZAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEFNIENvbnNvbGUgPiBSZWFsbSBOYW1lID4gQXBwbGljYXRpb25zID4gT0F1dGggMi4wID4gQ2xpZW50cyA+IENsaWVudCBJRCA+IEFkdmFuY2VkLgogKiBpZGVudGl0eSAtIEFNSWRlbnRpdHkgKDMpLgogKiAgICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCB0aGUgaWRlbnRpdHkgb2YgdGhlIHJlc291cmNlIG93bmVyLgogKiBzZXNzaW9uIC0gU1NPVG9rZW4gKDQpLgogKiAgICAgICAgICAgUHJlc2VudCBpZiB0aGUgcmVxdWVzdCBjb250YWlucyB0aGUgc2Vzc2lvbiBjb29raWUsIHRoZSB1c2VyJ3Mgc2Vzc2lvbiBvYmplY3QuCiAqIHNjcmlwdE5hbWUgLSBTdHJpbmcgKHByaW1pdGl2ZSkuCiAqICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgc2NyaXB0LgogKiBsb2dnZXIgLSBBbHdheXMgcHJlc2VudCwgdGhlICJPQXV0aDJQcm92aWRlciIgZGVidWcgbG9nZ2VyIGluc3RhbmNlOgogKiAgICAgICAgICBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9zY3JpcHRpbmctZ3VpZGUvc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLmh0bWwjc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLgogKiAgICAgICAgICBDb3JyZXNwb25kaW5nIGxvZyBmaWxlcyB3aWxsIGJlIHByZWZpeGVkIHdpdGg6IHNjcmlwdHMuT0FVVEgyX0FDQ0VTU19UT0tFTl9NT0RJRklDQVRJT04uCiAqIGh0dHBDbGllbnQgLSBIVFRQIENsaWVudCAoOCkuCiAqICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIEhUVFAgQ2xpZW50IGluc3RhbmNlOgogKiAgICAgICAgICAgICAgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvc2NyaXB0aW5nLWd1aWRlL3NjcmlwdGluZy1hcGktZ2xvYmFsLWh0dHAtY2xpZW50Lmh0bWwjc2NyaXB0aW5nLWFwaS1nbG9iYWwtaHR0cC1jbGllbnQuCiAqCiAqIFJldHVybiAtIG5vIHZhbHVlIGlzIGV4cGVjdGVkLCBjaGFuZ2VzIHNoYWxsIGJlIG1hZGUgdG8gdGhlIGFjY2Vzc1Rva2VuIHBhcmFtZXRlciBkaXJlY3RseS4KICoKICogQ2xhc3MgcmVmZXJlbmNlOgogKiAoMSkgQWNjZXNzVG9rZW4gLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb2F1dGgyL2NvcmUvQWNjZXNzVG9rZW4uaHRtbC4KICogKDMpIEFNSWRlbnRpdHkgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvaWRtL0FNSWRlbnRpdHkuaHRtbC4KICogKDQpIFNTT1Rva2VuIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9jb20vaXBsYW5ldC9zc28vU1NPVG9rZW4uaHRtbC4KICogKDUpIE1hcCAtIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL3V0aWwvSGFzaE1hcC5odG1sLAogKiAgICAgICAgICAgb3IgaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9MaW5rZWRIYXNoTWFwLmh0bWwuCiAqICg2KSBTZXQgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS91dGlsL0hhc2hTZXQuaHRtbC4KICogKDgpIENsaWVudCAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9odHRwL0NsaWVudC5odG1sLgogKi8KCi8qIEVYQU1QTEUKKGZ1bmN0aW9uICgpIHsKICAgIHZhciBmckphdmEgPSBKYXZhSW1wb3J0ZXIoCiAgICAgICAgb3JnLmZvcmdlcm9jay5odHRwLnByb3RvY29sLlJlcXVlc3QsCiAgICAgICAgb3JnLmZvcmdlcm9jay5odHRwLnByb3RvY29sLlJlc3BvbnNlCiAgICApOwoKICAgIC8vIEFsd2F5cyBpbmNsdWRlcyB0aGlzIGZpZWxkIGluIHRoZSB0b2tlbi4KICAgIGFjY2Vzc1Rva2VuLnNldEZpZWxkKCdrZXkxJywgJ3ZhbHVlMScpOwoKICAgIC8vIFJlY2VpdmVzIGFuZCBhZGRzIHRvIHRoZSBhY2Nlc3MgdG9rZW4gYWRkaXRpb25hbCB2YWx1ZXMgYnkgcGVyZm9ybWluZyBhIFJFU1QgY2FsbCB0byBhbiBleHRlcm5hbCBzZXJ2aWNlLgogICAgLy8gV0FSTklORzogQmVsb3csIHlvdSB3aWxsIGZpbmQgYSByZWZlcmVuY2UgdG8gYSB0aGlyZC1wYXJ0eSBzaXRlLCB3aGljaCBpcyBwcm92aWRlZCBvbmx5IGFzIGFuIGV4YW1wbGUuCiAgICB2YXIgdXJpID0gJ2h0dHBzOi8vanNvbnBsYWNlaG9sZGVyLnR5cGljb2RlLmNvbS9wb3N0cyc7CgogICAgdHJ5IHsKICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBmckphdmEuUmVxdWVzdCgpOwoKICAgICAgICAvLyBZb3UgY2FuIGNoYWluIG1ldGhvZHMgdGhhdCByZXR1cm4gdGhlIHJlcXVlc3Qgb2JqZWN0LgogICAgICAgIHJlcXVlc3Quc2V0VXJpKHVyaSkKICAgICAgICAgICAgLnNldE1ldGhvZCgnUE9TVCcpCiAgICAgICAgICAgIC5zZXRFbnRpdHkoSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgdXBkYXRlZEZpZWxkczogewogICAgICAgICAgICAgICAgICAgIGtleTI6ICd2YWx1ZTInLAogICAgICAgICAgICAgICAgICAgIGtleTM6ICd2YWx1ZTMnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKCiAgICAgICAgLy8gWW91IGNhbiBjYWxsIGEgbWV0aG9kIHdoZW4gY2hhaW5pbmcgaXMgbm90IHBvc3NpYmxlLgogICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLmFkZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgnKTsKCiAgICAgICAgLy8gU2VuZHMgdGhlIHJlcXVlc3QgYW5kIHJlY2VpdmVzIHRoZSByZXNwb25zZS4KICAgICAgICB2YXIgcmVzcG9uc2UgPSBodHRwQ2xpZW50LnNlbmQocmVxdWVzdCkuZ2V0T3JUaHJvdygpOwoKICAgICAgICAvLyBDaGVja3MgaWYgdGhlIHJlc3BvbnNlIHN0YXR1cyBpcyBhcyBleHBlY3RlZC4KICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzKCkgPT09IG9yZy5mb3JnZXJvY2suaHR0cC5wcm90b2NvbC5TdGF0dXMuQ1JFQVRFRCkgewogICAgICAgICAgICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXNwb25zZS5nZXRFbnRpdHkoKS5nZXRTdHJpbmcoKSk7CgogICAgICAgICAgICAvLyBTZXQgbXVsdGlwbGUgdG9rZW4gZmllbGRzIGF0IG9uY2UuCiAgICAgICAgICAgIGFjY2Vzc1Rva2VuLnNldEZpZWxkcyhyZXN1bHQudXBkYXRlZEZpZWxkcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gb2J0YWluIGFjY2VzcyB0b2tlbiBtb2RpZmljYXRpb25zLiBTdGF0dXM6ICcgKyByZXNwb25zZS5nZXRTdGF0dXMoKSArICcuIENvbnRlbnQ6ICcgKyByZXNwb25zZS5nZXRFbnRpdHkoKS5nZXRTdHJpbmcoKSk7CiAgICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAgIGxvZ2dlci5lcnJvcignVGhlIHJlcXVlc3QgcHJvY2Vzc2luZyB3YXMgaW50ZXJydXB0ZWQuICcgKyBlKTsKCiAgICAgICAgLy8gVGhlIGFjY2VzcyB0b2tlbiByZXF1ZXN0IGZhaWxzIHdpdGggdGhlIEhUVFAgNTAwIGVycm9yIGluIHRoaXMgY2FzZS4KICAgICAgICB0aHJvdyAoJ1VuYWJsZSB0byBvYnRhaW4gcmVzcG9uc2UgZnJvbTogJyArIHVyaSk7CiAgICB9CgogICAgLy8gQWRkcyBuZXcgZmllbGRzIGNvbnRhaW5pbmcgaWRlbnRpdHkgYXR0cmlidXRlIHZhbHVlcyB0byB0aGUgYWNjZXNzIHRva2VuLgogICAgYWNjZXNzVG9rZW4uc2V0RmllbGQoJ21haWwnLCBpZGVudGl0eS5nZXRBdHRyaWJ1dGUoJ21haWwnKSk7CiAgICBhY2Nlc3NUb2tlbi5zZXRGaWVsZCgncGhvbmUnLCBpZGVudGl0eS5nZXRBdHRyaWJ1dGUoJ3RlbGVwaG9uZU51bWJlcicpLnRvQXJyYXkoKVswXSk7CgogICAgLy8gQWRkcyBuZXcgZmllbGRzIGNvbnRhaW5pbmcgdGhlIHNlc3Npb24gcHJvcGVydHkgdmFsdWVzLgogICAgLy8gTk9URTogc2Vzc2lvbiBtYXkgbm90IGJlIGF2YWlsYWJsZSBmb3Igbm9uLWludGVyYWN0aXZlIGF1dGhvcml6YXRpb24gZ3JhbnRzLgogICAgaWYgKHNlc3Npb24pIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBhY2Nlc3NUb2tlbi5zZXRGaWVsZCgnaXBBZGRyZXNzJywgc2Vzc2lvbi5nZXRQcm9wZXJ0eSgnSG9zdCcpKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHJldHJpZXZlIHNlc3Npb24gcHJvcGVydHkgdmFsdWUuICcgKyBlKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gUmVtb3ZlcyBhIG5hdGl2ZSBmaWVsZCBmcm9tIHRoZSB0b2tlbiBlbnRyeSwgdGhhdCB3YXMgc2V0IGJ5IEFNLgogICAgLy8gV0FSTklORzogcmVtb3ZpbmcgbmF0aXZlIGZpZWxkcyBmcm9tIHRoZSB0b2tlbiBtYXkgcmVzdWx0IGluIGxvc3Mgb2YgZnVuY3Rpb25hbGl0eS4KICAgIC8vIGFjY2Vzc1Rva2VuLnJlbW92ZVRva2VuTmFtZSgpCgogICAgLy8gTm8gcmV0dXJuIHZhbHVlIGlzIGV4cGVjdGVkLiBMZXQgaXQgYmUgdW5kZWZpbmVkLgp9KCkpOwoqLwo=\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"OAUTH2_ACCESS_TOKEN_MODIFICATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"01e1a3c0-038b-4c16-956a-6c9d89328cff\",\"name\":\"Authentication Tree Decision Node Script\",\"description\":\"Default global script for a scripted decision node\",\"script\":\"LyoKICAtIERhdGEgbWFkZSBhdmFpbGFibGUgYnkgbm9kZXMgdGhhdCBoYXZlIGFscmVhZHkgZXhlY3V0ZWQgYXJlIGF2YWlsYWJsZSBpbiB0aGUgc2hhcmVkU3RhdGUgdmFyaWFibGUuCiAgLSBUaGUgc2NyaXB0IHNob3VsZCBzZXQgb3V0Y29tZSB0byBlaXRoZXIgInRydWUiIG9yICJmYWxzZSIuCiAqLwoKb3V0Y29tZSA9ICJ0cnVlIjsK\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"da7a96a8-7969-4dab-9c6e-a812938cc76d\",\"name\":\"test-script-with-secrets-and-variables\",\"description\":\"Script that uses secrets and variables\",\"script\":\"Y29uc29sZS5sb2coYHBpOiAke3N5c3RlbUVudi5nZXRQcm9wZXJ0eSgiZXN2LnRlc3QudmFyLnBpIil9YCk7CmNvbnNvbGUubG9nKGBwaSBzZWNyZXQ6ICR7c3lzdGVtRW52LmdldFByb3BlcnR5KCJlc3YudGVzdC5zZWNyZXQucGkiKX1gKTsKY29uc29sZS5sb2coYHNwZWVkIG9mIGxpZ2h0OiAke3N5c3RlbUVudi5nZXRQcm9wZXJ0eSgiZXN2LnRlc3QudmFyaWFibGUubGlnaHQiKX1gKTsKY29uc29sZS5sb2coYGV1bGVyJ3MgbnVtYmVyOiAke3N5c3RlbUVudi5nZXRQcm9wZXJ0eSgiZXN2LnRlc3Quc2VjcmV0LmV1bGVyIil9YCk7CmNvbnNvbGUubG9nKGBBcmVhIG9mIGNpcmNsZSB3aXRoIHJhZGl1cyA3OiAkezcgKiA3ICogc3lzdGVtRW52LmdldFByb3BlcnR5KCJlc3YudGVzdC52YXIucGkiKX1gKTsKY29uc29sZS5sb2coYFZvbHVtZSBvZiBzcGhlcmUgd2l0aCByYWRpdXMgNzogJHs0ICogNyAqIDcgKiA3ICogc3lzdGVtRW52LmdldFByb3BlcnR5KCJlc3YudGVzdC5zZWNyZXQucGkiKSAvIDN9YCk7Cg==\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"LIBRARY\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"2.0\"},{\"_id\":\"3bd13a46-61c4-4974-8efb-1700c80c64e3\",\"name\":\"Inactive Device Match Script\",\"description\":\"Inactive Device Match Script\",\"script\":\"LyoKICogSW5hY3RpdmUgRGV2aWNlIE1hdGNoIFNjcmlwdAogKi8KCm91dGNvbWUgPSAidHJ1ZSI7\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"fdb60c75-d58b-409f-bef2-ce4ebb04c77c\",\"name\":\"GitHub Profile Normalization (VS) - imported (2)\",\"description\":\"Normalizes raw profile data from GitHub\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCmxvZ2dlci53YXJuaW5nKCJHaXRIdWIgcmF3UHJvZmlsZTogIityYXdQcm9maWxlKQoKcmV0dXJuIGpzb24ob2JqZWN0KAogICAgICAgIGZpZWxkKCJpZCIsIHJhd1Byb2ZpbGUuaWQpLAogICAgICAgIGZpZWxkKCJkaXNwbGF5TmFtZSIsIHJhd1Byb2ZpbGUubmFtZSksCiAgICAgICAgZmllbGQoImdpdmVuTmFtZSIsIHJhd1Byb2ZpbGUuZmlyc3RfbmFtZSksCiAgICAgICAgZmllbGQoImZhbWlseU5hbWUiLCByYXdQcm9maWxlLmxhc3RfbmFtZSksCiAgICAgICAgZmllbGQoInBob3RvVXJsIiwgcmF3UHJvZmlsZS5waWN0dXJlLmRhdGEudXJsKSwKICAgICAgICBmaWVsZCgiZW1haWwiLCByYXdQcm9maWxlLmVtYWlsKSwKICAgICAgICBmaWVsZCgidXNlcm5hbWUiLCByYXdQcm9maWxlLmVtYWlsKSkp\",\"default\":false,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"d58977ed-0542-4147-8197-973ef7300191\",\"name\":\"Custom Device Match Script\",\"description\":\"Custom Device Match Script\",\"script\":\"LyoKICogQ3VzdG9tIERldmljZSBNYXRjaCBTY3JpcHQKICovCgpvdXRjb21lID0gInRydWUiOw==\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"13e3f263-9cd3-4844-8d1c-040fd0dd02eb\",\"name\":\"Device Profile Match Template - Decision Node Script\",\"description\":\"Default global script template for Device Profile Match decision node script for Authentication Tree\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAtMjAyMiBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIFRoZSBmb2xsb3dpbmcgc2NyaXB0IGlzIGEgc2ltcGxpZmllZCB0ZW1wbGF0ZSBmb3IgdW5kZXJzdGFuZGluZwogKiB0aGUgYmFzaWNzIG9mIGRldmljZSBtYXRjaGluZy4gX1RoaXMgaXMgbm90IGZ1bmN0aW9uYWxseSBjb21wbGV0ZS5fCiAqIEZvciBhIGZ1bmN0aW9uYWxseSBjb21wbGV0ZSBzY3JpcHQgYXMgd2VsbCBhcyBhIGRldmVsb3BtZW50IHRvb2xraXQsCiAqIHZpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3JnZVJvY2svZm9yZ2Vyb2NrLWRldmljZS1tYXRjaC1zY3JpcHQuCiAqCiAqIEdsb2JhbCBub2RlIHZhcmlhYmxlcyBhY2Nlc3NpYmxlIHdpdGhpbiB0aGlzIHNjb3BlOgogKiAxLiBgc2hhcmVkU3RhdGVgIHByb3ZpZGVzIGFjY2VzcyB0byBpbmNvbWluZyByZXF1ZXN0CiAqIDIuIGBkZXZpY2VQcm9maWxlc0Rhb2AgcHJvdmlkZXMgYWNjZXNzIHRvIHN0b3JlZCBwcm9maWxlcwogKiAzLiBgb3V0Y29tZWAgdmFyaWFibGUgbWFwcyB0byBhdXRoIHRyZWUgbm9kZSBvdXRjb21lczsgdmFsdWVzIGFyZQogKiAgICAndHJ1ZScsICdmYWxzZScsIG9yICd1bmtub3duRGV2aWNlJyAobm90aWNlIF9hbGxfIGFyZSBzdHJpbmdzKS4KICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqCiAqIEdldCB0aGUgaW5jb21pbmcgcmVxdWVzdCdzIGRldmljZSBwcm9maWxlLgogKiBSZXR1cm5zIHNlcmlhbGl6ZWQgSlNPTiAodHlwZSBzdHJpbmcpOyBwYXJzaW5nIHRoaXMgd2lsbCByZXN1bHQgYQogKiBuYXRpdmUgSlMgb2JqZWN0LgogKi8KdmFyIGluY29taW5nSnNvbiA9IHNoYXJlZFN0YXRlLmdldCgnZm9yZ2VSb2NrLmRldmljZS5wcm9maWxlJykudG9TdHJpbmcoKTsKdmFyIGluY29taW5nID0gSlNPTi5wYXJzZShpbmNvbWluZ0pzb24pOwoKLyoqCiAqIEdldCB0aGUgaW5jb21pbmcgdXNlcidzIHVzZXJuYW1lIGFuZCByZWFsbS4KICogTm90aWNlIHRoZSB1c2Ugb2YgYC5hc1N0cmluZygpYC4KICovCnZhciB1c2VybmFtZSA9IHNoYXJlZFN0YXRlLmdldCgidXNlcm5hbWUiKS5hc1N0cmluZygpOwp2YXIgcmVhbG0gPSBzaGFyZWRTdGF0ZS5nZXQoInJlYWxtIikuYXNTdHJpbmcoKTsKCi8qKgogKiBHZXQgdGhlIHVzZXIncyBzdG9yZWQgcHJvZmlsZXMgZm9yIGFwcHJvcHJpYXRlIHJlYWxtLgogKiBSZXR1cm5zIGEgX3NwZWNpYWxfIG9iamVjdCB3aXRoIG1ldGhvZHMgZm9yIHByb2ZpbGUgZGF0YQogKi8KdmFyIHN0b3JlZFByb2ZpbGVzID0gZGV2aWNlUHJvZmlsZXNEYW8uZ2V0RGV2aWNlUHJvZmlsZXModXNlcm5hbWUsIHJlYWxtKTsKCi8vIERlZmF1bHQgdG8gYG91dGNvbWVgIG9mICd1bmtub3duRGV2aWNlJwpvdXRjb21lID0gJ3Vua25vd25EZXZpY2UnOwoKaWYgKHN0b3JlZFByb2ZpbGVzKSB7CiAgICB2YXIgaSA9IDA7CiAgICAvLyBOT1RFOiBgLnNpemUoKWAgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBzdG9yZWQgcHJvZmlsZXMKICAgIHZhciBsZW4gPSBzdG9yZWRQcm9maWxlcy5zaXplKCk7CgogICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIHN0b3JlZCBwcm9maWxlLgogICAgICAgICAqIFJldHVybnMgc2VyaWFsaXplZCBKU09OICh0eXBlIHN0cmluZyk7IHBhcnNpbmcgdGhpcyB3aWxsIHJlc3VsdAogICAgICAgICAqIGEgbmF0aXZlIEpTIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICB2YXIgc3RvcmVkSnNvbiA9IHN0b3JlZFByb2ZpbGVzLmdldChpKTsKICAgICAgICB2YXIgc3RvcmVkID0gSlNPTi5wYXJzZShzdG9yZWRKc29uKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZCBhIHN0b3JlZCBwcm9maWxlIHdpdGggdGhlIHNhbWUgaWRlbnRpZmllci4KICAgICAgICAgKi8KICAgICAgICBpZiAoaW5jb21pbmcuaWRlbnRpZmllciA9PT0gc3RvcmVkLmlkZW50aWZpZXIpIHsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBOb3cgdGhhdCB5b3UndmUgZm91bmQgdGhlIGFwcHJvcHJpYXRlIHByb2ZpbGUsIHlvdSB3aWxsIHBlcmZvcm0KICAgICAgICAgICAgICogdGhlIGxvZ2ljIGhlcmUgdG8gbWF0Y2ggdGhlIHZhbHVlcyBvZiB0aGUgYGluY29taW5nYCBwcm9maWxlCiAgICAgICAgICAgICAqIHdpdGggdGhhdCBvZiB0aGUgYHN0b3JlZGAgcHJvZmlsZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogVGhlIHJlc3VsdCBvZiB0aGUgbWF0Y2hpbmcgbG9naWMgaXMgYXNzaWduZWQgdG8gYG91dGNvbWVgLiBTaW5jZQogICAgICAgICAgICAgKiB3ZSBoYXZlIHByb2ZpbGVzIG9mIHRoZSBzYW1lIGlkZW50aWZpZXIsIHRoZSB2YWx1ZSAodHlwZSBzdHJpbmcpCiAgICAgICAgICAgICAqIHNob3VsZCBub3cgYmUgZWl0aGVyICd0cnVlJyBvciAnZmFsc2UnIChwcm9wZXJ0aWVzIG1hdGNoZWQgb3Igbm90KS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0b3BpYywgdmlzaXQgdGhpcyBHaXRodWIgcmVwbzoKICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL0ZvcmdlUm9jay9mb3JnZXJvY2stZGV2aWNlLW1hdGNoLXNjcmlwdAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3V0Y29tZSA9ICdmYWxzZSc7CiAgICAgICAgfQogICAgfQp9\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"36863ffb-40ec-48b9-94b1-9a99f71cc3b5\",\"name\":\"OIDC Claims Script\",\"description\":\"Default global script for OIDC claims\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMTQtMjAyMyBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUwogKiBvciB3aXRoIG9uZSBvZiBpdHMgYWZmaWxpYXRlcy4gQWxsIHVzZSBzaGFsbCBiZSBleGNsdXNpdmVseSBzdWJqZWN0CiAqIHRvIHN1Y2ggbGljZW5zZSBiZXR3ZWVuIHRoZSBsaWNlbnNlZSBhbmQgRm9yZ2VSb2NrIEFTLgogKi8KCi8qCiAqIFRoaXMgc2NyaXB0IGNvbXB1dGVzIGNsYWltIHZhbHVlcyByZXR1cm5lZCBpbiBJRCB0b2tlbnMgYW5kL29yIGF0IHRoZSBVc2VySW5mbyBFbmRwb2ludC4KICogVGhlIGNsYWltIHZhbHVlcyBhcmUgY29tcHV0ZWQgZm9yOgogKiB0aGUgY2xhaW1zIGRlcml2ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHNjb3BlcywKICogdGhlIGNsYWltcyBwcm92aWRlZCBieSB0aGUgYXV0aG9yaXphdGlvbiBzZXJ2ZXIsCiAqIGFuZCB0aGUgY2xhaW1zIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50IHZpYSB0aGUgY2xhaW1zIHBhcmFtZXRlci4KICoKICogSW4gdGhlIENPTkZJR1VSQVRJT04gQU5EIENVU1RPTUlaQVRJT04gc2VjdGlvbiwgeW91IGNhbgogKiBkZWZpbmUgdGhlIHNjb3BlLXRvLWNsYWltcyBtYXBwaW5nLCBhbmQKICogYXNzaWduIHRvIGVhY2ggY2xhaW0gYSByZXNvbHZlciBmdW5jdGlvbiB0aGF0IHdpbGwgY29tcHV0ZSB0aGUgY2xhaW0gdmFsdWUuCiAqCiAqIERlZmluZWQgdmFyaWFibGVzIChjbGFzcyByZWZlcmVuY2VzIGFyZSBwcm92aWRlZCBiZWxvdyk6CiAqIHNjb3BlcyAtIFNldDxTdHJpbmc+ICg2KS4KICogICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSByZXF1ZXN0ZWQgc2NvcGVzLgogKiBjbGFpbXMgLSBNYXA8U3RyaW5nLCBPYmplY3Q+ICg1KS4KICogICAgICAgICAgQWx3YXlzIHByZXNlbnQsIGRlZmF1bHQgc2VydmVyIHByb3ZpZGVkIGNsYWltcy4KICogY2xhaW1PYmplY3RzIC0gTGlzdDxDbGFpbT4gKDcsIDIpLgogKiAgICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIGRlZmF1bHQgc2VydmVyIHByb3ZpZGVkIGNsYWltcy4KICogcmVxdWVzdGVkQ2xhaW1zIC0gTWFwPFN0cmluZywgU2V0PFN0cmluZz4+ICg1KS4KICogICAgICAgICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIG5vdCBlbXB0eSBpZiB0aGUgcmVxdWVzdCBjb250YWlucyB0aGUgY2xhaW1zIHBhcmFtZXRlciBhbmQgdGhlIHNlcnZlciBoYXMgZW5hYmxlZAogKiAgICAgICAgICAgICAgICAgICBjbGFpbXNfcGFyYW1ldGVyX3N1cHBvcnRlZC4gQSBtYXAgb2YgdGhlIHJlcXVlc3RlZCBjbGFpbXMgdG8gcG9zc2libGUgdmFsdWVzLCBvdGhlcndpc2UgZW1wdHk7CiAqICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBjbGFpbXMgd2l0aCBubyByZXF1ZXN0ZWQgdmFsdWVzIHdpbGwgaGF2ZSBhIGtleSBidXQgbm8gdmFsdWUgaW4gdGhlIG1hcC4gQSBrZXkgd2l0aAogKiAgICAgICAgICAgICAgICAgICBhIHNpbmdsZSB2YWx1ZSBpbiBpdHMgU2V0ICg2KSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiByZXF1ZXN0ZWRUeXBlZENsYWltcyAtIExpc3Q8Q2xhaW0+ICg3LCAyKS4KICogICAgICAgICAgICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIHJlcXVlc3RlZCBjbGFpbXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdGVkIGNsYWltcyB3aXRoIG5vIHJlcXVlc3RlZCB2YWx1ZXMgd2lsbCBoYXZlIGEgY2xhaW0gd2l0aCBubyB2YWx1ZXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgQSBjbGFpbSB3aXRoIGEgc2luZ2xlIHZhbHVlIGluZGljYXRlcyB0aGlzIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiBjbGFpbXNMb2NhbGVzIC0gTGlzdDxTdHJpbmc+ICg3KS4KICogICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgZnJvbSB0aGUgJ2NsYWltc19sb2NhbGVzJyBwYXJhbWV0ZXIuCiAqICAgICAgICAgICAgICAgICBTZWUgaHR0cHM6Ly9vcGVuaWQubmV0L3NwZWNzL29wZW5pZC1jb25uZWN0LWNvcmUtMV8wLmh0bWwjQ2xhaW1zTGFuZ3VhZ2VzQW5kU2NyaXB0cyBmb3IgdGhlIE9JREMgc3BlY2lmaWNhdGlvbiBkZXRhaWxzLgogKiByZXF1ZXN0UHJvcGVydGllcyAtIFVubW9kaWZpYWJsZSBNYXAgKDUpLgogKiAgICAgICAgICAgICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCBjb250YWlucyBhIG1hcCBvZiByZXF1ZXN0IHByb3BlcnRpZXM6CiAqICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVyaSAtIFRoZSByZXF1ZXN0IFVSSS4KICogICAgICAgICAgICAgICAgICAgICByZWFsbSAtIFRoZSByZWFsbSB0aGF0IHRoZSByZXF1ZXN0IHJlbGF0ZXMgdG8uCiAqICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhcmFtcyAtIEEgbWFwIG9mIHRoZSByZXF1ZXN0IHBhcmFtcyBhbmQvb3IgcG9zdGVkIGRhdGEuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVhY2ggdmFsdWUgaXMgYSBsaXN0IG9mIG9uZSBvciBtb3JlIHByb3BlcnRpZXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBub3RlIHRoYXQgdGhlc2Ugc2hvdWxkIGJlIGhhbmRsZWQgaW4gYWNjb3JkYW5jZSB3aXRoIE9XQVNQIGJlc3QgcHJhY3RpY2VzOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL293YXNwLm9yZy93d3ctY29tbXVuaXR5L3Z1bG5lcmFiaWxpdGllcy9VbnNhZmVfdXNlX29mX1JlZmxlY3Rpb24uCiAqIGNsaWVudFByb3BlcnRpZXMgLSBVbm1vZGlmaWFibGUgTWFwICg1KS4KICogICAgICAgICAgICAgICAgICAgIFByZXNlbnQgaWYgdGhlIGNsaWVudCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIGlkZW50aWZpZWQsIGNvbnRhaW5zIGEgbWFwIG9mIGNsaWVudCBwcm9wZXJ0aWVzOgogKiAgICAgICAgICAgICAgICAgICAgY2xpZW50SWQgLSBUaGUgY2xpZW50J3MgVVJJIGZvciB0aGUgcmVxdWVzdCBsb2NhbGUuCiAqICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JhbnRUeXBlcyAtIExpc3Qgb2YgdGhlIGFsbG93ZWQgZ3JhbnQgdHlwZXMgKG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuR3JhbnRUeXBlKSBmb3IgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgIGFsbG93ZWRSZXNwb25zZVR5cGVzIC0gTGlzdCBvZiB0aGUgYWxsb3dlZCByZXNwb25zZSB0eXBlcyBmb3IgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgIGFsbG93ZWRTY29wZXMgLSBMaXN0IG9mIHRoZSBhbGxvd2VkIHNjb3BlcyBmb3IgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgIGN1c3RvbVByb3BlcnRpZXMgLSBBIG1hcCBvZiB0aGUgY3VzdG9tIHByb3BlcnRpZXMgb2YgdGhlIGNsaWVudC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0cyBvciBtYXBzIHdpbGwgYmUgaW5jbHVkZWQgYXMgc3ViLW1hcHM7IGZvciBleGFtcGxlOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbU1hcFtLZXkxXT1WYWx1ZTEgd2lsbCBiZSByZXR1cm5lZCBhcyBjdXN0b21NYXAgLT4gS2V5MSAtPiBWYWx1ZTEuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gYWRkIGN1c3RvbSBwcm9wZXJ0aWVzIHRvIGEgY2xpZW50LCB1cGRhdGUgdGhlIEN1c3RvbSBQcm9wZXJ0aWVzIGZpZWxkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQU0gQ29uc29sZSA+IFJlYWxtIE5hbWUgPiBBcHBsaWNhdGlvbnMgPiBPQXV0aCAyLjAgPiBDbGllbnRzID4gQ2xpZW50IElEID4gQWR2YW5jZWQuCiAqIGlkZW50aXR5IC0gQU1JZGVudGl0eSAoMykuCiAqICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBpZGVudGl0eSBvZiB0aGUgcmVzb3VyY2Ugb3duZXIuCiAqIHNlc3Npb24gLSBTU09Ub2tlbiAoNCkuCiAqICAgICAgICAgICBQcmVzZW50IGlmIHRoZSByZXF1ZXN0IGNvbnRhaW5zIHRoZSBzZXNzaW9uIGNvb2tpZSwgdGhlIHVzZXIncyBzZXNzaW9uIG9iamVjdC4KICogc2NyaXB0TmFtZSAtIFN0cmluZyAocHJpbWl0aXZlKS4KICogICAgICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzY3JpcHQuCiAqIGxvZ2dlciAtIEFsd2F5cyBwcmVzZW50LCB0aGUgIk9BdXRoMlByb3ZpZGVyIiBkZWJ1ZyBsb2dnZXIgaW5zdGFuY2U6CiAqICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuaHRtbCNzY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuCiAqICAgICAgICAgIENvcnJlc3BvbmRpbmcgZmlsZXMgd2lsbCBiZSBwcmVmaXhlZCB3aXRoOiBzY3JpcHRzLk9JRENfQ0xBSU1TLgogKiBodHRwQ2xpZW50IC0gSFRUUCBDbGllbnQgKDgpLgogKiAgICAgICAgICAgICAgQWx3YXlzIHByZXNlbnQsIHRoZSBIVFRQIENsaWVudCBpbnN0YW5jZToKICogICAgICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHRpbmctYXBpLWdsb2JhbC1odHRwLWNsaWVudC5odG1sI3NjcmlwdGluZy1hcGktZ2xvYmFsLWh0dHAtY2xpZW50LgogKiAgICAgICAgICAgICAgSW4gb3JkZXIgdG8gdXNlIHRoZSBjbGllbnQsIHlvdSBtYXkgbmVlZCB0byBhZGQKICogICAgICAgICAgICAgIG9yZy5mb3JnZXJvY2suaHR0cC5DbGllbnQsCiAqICAgICAgICAgICAgICBvcmcuZm9yZ2Vyb2NrLmh0dHAucHJvdG9jb2wuKiwKICogICAgICAgICAgICAgIGFuZCBvcmcuZm9yZ2Vyb2NrLnV0aWwucHJvbWlzZS5Qcm9taXNlSW1wbAogKiAgICAgICAgICAgICAgdG8gdGhlIGFsbG93ZWQgSmF2YSBjbGFzc2VzIGluIHRoZSBzY3JpcHRpbmcgZW5naW5lIGNvbmZpZ3VyYXRpb24sIGFzIGRlc2NyaWJlZCBpbjoKICogICAgICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHQtZW5naW5lLXNlY3VyaXR5Lmh0bWwKICoKICogUmV0dXJuIC0gYSBuZXcgVXNlckluZm9DbGFpbXMoTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZXMsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gY29tcG9zaXRlU2NvcGVzKSAoMSkgb2JqZWN0LgogKiAgICAgICAgICBUaGUgcmVzdWx0IG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpbiB0aGUgc2NyaXB0IGlzIHJldHVybmVkIHRvIHRoZSBzZXJ2ZXIuCiAqICAgICAgICAgIEN1cnJlbnRseSwgdGhlIEltbWVkaWF0ZWx5IEludm9rZWQgRnVuY3Rpb24gRXhwcmVzc2lvbiAoYWxzbyBrbm93biBhcyBTZWxmLUV4ZWN1dGluZyBBbm9ueW1vdXMgRnVuY3Rpb24pCiAqICAgICAgICAgIGlzIHRoZSBsYXN0IChhbmQgb25seSkgc3RhdGVtZW50IGluIHRoaXMgc2NyaXB0LCBhbmQgaXRzIHJldHVybiB2YWx1ZSB3aWxsIGJlY29tZSB0aGUgc2NyaXB0IHJlc3VsdC4KICogICAgICAgICAgRG8gbm90IHVzZSAicmV0dXJuIHZhcmlhYmxlIiBzdGF0ZW1lbnQgb3V0c2lkZSBvZiBhIGZ1bmN0aW9uIGRlZmluaXRpb24uCiAqICAgICAgICAgIFNlZSBSRVNVTFRTIHNlY3Rpb24gZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KICoKICogQ2xhc3MgcmVmZXJlbmNlOgogKiAoMSkgVXNlckluZm9DbGFpbXMgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb2F1dGgyL2NvcmUvVXNlckluZm9DbGFpbXMuaHRtbC4KICogKDIpIENsYWltIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbCkuCiAqICAgICAgICAgQW4gaW5zdGFuY2Ugb2Ygb3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltIGhhcyBtZXRob2RzIHRvIGFjY2VzcwogKiAgICAgICAgIHRoZSBjbGFpbSBuYW1lLCByZXF1ZXN0ZWQgdmFsdWVzLCBsb2NhbGUsIGFuZCB3aGV0aGVyIHRoZSBjbGFpbSBpcyBlc3NlbnRpYWwuCiAqICgzKSBBTUlkZW50aXR5IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L2lkbS9BTUlkZW50aXR5Lmh0bWwuCiAqICg0KSBTU09Ub2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3MvY29tL2lwbGFuZXQvc3NvL1NTT1Rva2VuLmh0bWwuCiAqICg1KSBNYXAgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS91dGlsL0hhc2hNYXAuaHRtbCwKICogICAgICAgICAgIG9yIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL3V0aWwvTGlua2VkSGFzaE1hcC5odG1sLgogKiAoNikgU2V0IC0gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9IYXNoU2V0Lmh0bWwuCiAqICg3KSBMaXN0IC0gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9BcnJheUxpc3QuaHRtbC4KICogKDgpIENsaWVudCAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9odHRwL0NsaWVudC5odG1sLgoqLwoKKGZ1bmN0aW9uICgpIHsKICAgIC8vIFNFVFVQCgogICAgLyoqCiAgICAgKiBDbGFpbSBwcm9jZXNzaW5nIHV0aWxpdGllcy4KICAgICAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHJldXNhYmxlIGZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyBjbGFpbXMuCiAgICAgKiBAc2VlIENMQUlNIFBST0NFU1NJTkcgVVRJTElUSUVTIHNlY3Rpb24gZm9yIGRldGFpbHMuCiAgICAgKi8KICAgIHZhciB1dGlscyA9IGdldFV0aWxzKCk7CgogICAgLy8gQ09ORklHVVJBVElPTiBBTkQgQ1VTVE9NSVpBVElPTgoKICAgIC8qKgogICAgICogT0F1dGggMi4wIHNjb3BlIHZhbHVlcyAoc2NvcGVzKSBjYW4gYmUgdXNlZCBieSB0aGUgQ2xpZW50IHRvIHJlcXVlc3QgT0lEQyBjbGFpbXMuCiAgICAgKgogICAgICogQ2FsbCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kLCBhbmQgcGFzcyBpbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAqIGFuIG9iamVjdCB0aGF0IG1hcHMgYSBzY29wZSB2YWx1ZSB0byBhbiBhcnJheSBvZiBjbGFpbSBuYW1lcwogICAgICogdG8gc3BlY2lmeSB3aGljaCBjbGFpbXMgbmVlZCB0byBiZSBwcm9jZXNzZWQgYW5kIHJldHVybmVkIGZvciB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI1Njb3BlQ2xhaW1zfQogICAgICogZm9yIHRoZSBzY29wZSB2YWx1ZXMgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlcXVlc3QgY2xhaW1zIGFzIGRlZmluZWQgaW4gdGhlIE9JREMgc3BlY2lmaWNhdGlvbi4KICAgICAqCiAgICAgKiBCZWxvdywgZmluZCBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0aGF0IGlzIGV4cGVjdGVkIHRvIHdvcmsgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCiAgICAgKgogICAgICogQ1VTVE9NSVpBVElPTgogICAgICogWW91IGNhbiBjaG9vc2UgdGhlIGNsYWltIG5hbWVzIHJldHVybmVkIGZvciBhIHNjb3BlLgogICAgICovCiAgICB1dGlscy5zZXRTY29wZUNsYWltc01hcCh7CiAgICAgICAgcHJvZmlsZTogWwogICAgICAgICAgICAnbmFtZScsCiAgICAgICAgICAgICdmYW1pbHlfbmFtZScsCiAgICAgICAgICAgICdnaXZlbl9uYW1lJywKICAgICAgICAgICAgJ3pvbmVpbmZvJywKICAgICAgICAgICAgJ2xvY2FsZScKICAgICAgICBdLAogICAgICAgIGVtYWlsOiBbJ2VtYWlsJ10sCiAgICAgICAgYWRkcmVzczogWydhZGRyZXNzJ10sCiAgICAgICAgcGhvbmU6IFsncGhvbmVfbnVtYmVyJ10KICAgIH0pOwoKICAgIC8qKgogICAgICogSW4gdGhpcyBzY3JpcHQsIGVhY2ggY2xhaW0KICAgICAqIGRlcml2ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHNjb3BlcywKICAgICAqIHByb3ZpZGVkIGJ5IHRoZSBhdXRob3JpemF0aW9uIHNlcnZlciwgYW5kCiAgICAgKiByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCB2aWEgdGhlIGNsYWltcyBwYXJhbWV0ZXIKICAgICAqIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IGEgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGFpbSBuYW1lLgogICAgICoKICAgICAqIENhbGwgdGhpcyBjb25maWd1cmF0aW9uIG1ldGhvZCwgYW5kIHBhc3MgaW4gYXMgdGhlIGZpcnN0IGFyZ3VtZW50CiAgICAgKiBhbiBvYmplY3QgdGhhdCBtYXBzIGEgY2xhaW0gbmFtZSB0byBhIHJlc29sdmVyIGZ1bmN0aW9uLAogICAgICogd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGV4ZWN1dGVkIGZvciBlYWNoIGNsYWltIHByb2Nlc3NlZCBieSB0aGUgc2NyaXB0LgogICAgICoKICAgICAqIFRoZSBjbGFpbSByZXNvbHZlciBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgdGhlIHJlcXVlc3RlZCBjbGFpbSBpbmZvcm1hdGlvbgogICAgICogaW4gYW4gaW5zdGFuY2Ugb2Ygb3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuaWRjb25uZWN0L0NsYWltLmh0bWx9CiAgICAgKiBmb3IgZGV0YWlscyBvbiB0aGUgQ2xhaW0gY2xhc3MuCiAgICAgKgogICAgICogSWYgdGhlIGNsYWltIHJlc29sdmVyIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSwKICAgICAqIG90aGVyIHRoYW4gdW5kZWZpbmVkIG9yIG51bGwsCiAgICAgKiB0aGUgY2xhaW0gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgc2NyaXB0J3MgcmVzdWx0cy4KICAgICAqCiAgICAgKiBUaGUgQ2xhaW0gaW5zdGFuY2UgcHJvdmlkZXMgbWV0aG9kcyB0byBjaGVjawogICAgICogd2hhdCB0aGUgbmFtZSBvZiB0aGUgY2xhaW0gaXMsCiAgICAgKiB3aGljaCB2YWx1ZXMgdGhlIGNsYWltIHJlcXVlc3QgY29udGFpbnMsCiAgICAgKiB3aGV0aGVyIHRoZSBjbGFpbSBpcyBlc3NlbnRpYWwsIGFuZAogICAgICogd2hpY2ggbG9jYWxlIHRoZSBjbGFpbSBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgKiBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gY2FuIGNvbnNpZGVyIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjb21wdXRpbmcgYW5kIHJldHVybmluZyB0aGUgY2xhaW0gdmFsdWUuCiAgICAgKgogICAgICogQmVsb3csIGZpbmQgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdGhhdCBpcyBleHBlY3RlZCB0byB3b3JrIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LgogICAgICogQSByZXVzYWJsZSBmdW5jdGlvbiwgdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKFN0cmluZyBhdHRyaWJ1dGUtbmFtZSksCiAgICAgKiBpcyBjYWxsZWQgdG8gcmV0dXJuIGEgY2xhaW0gcmVzb2x2ZXIgZnVuY3Rpb24gYmFzZWQgb24gYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlLgogICAgICogQHNlZSBDTEFJTSBSRVNPTFZFUlMgc2VjdGlvbiBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIGV4YW1wbGVzLgogICAgICogRm9yIHRoZSBhZGRyZXNzIGNsYWltLCBhbiBleGFtcGxlIG9mIGEgY2xhaW0gcmVzb2x2ZXIgdGhhdCB1c2VzIGFub3RoZXIgY2xhaW0gcmVzb2x2ZXIgaXMgcHJvdmlkZWQuCiAgICAgKgogICAgICogQ1VTVE9NSVpBVElPTgogICAgICogWW91IGNhbiByZXVzZSB0aGUgcHJlZGVmaW5lZCB1dGlscyBtZXRob2RzIHdpdGggeW91ciBjdXN0b20gYXJndW1lbnRzLgogICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBjdXN0b20gcmVzb2x2ZXIgZnVuY3Rpb24gZm9yIGEgY2xhaW0gbmFtZSwKICAgICAqIHRoYXQgd2lsbCBjb21wdXRlIGFuZCByZXR1cm4gdGhlIGNsYWltIHZhbHVl4oCUYXMgc2hvd24gaW4gdGhlIGNvbW1lbnRlZCBvdXQgZXhhbXBsZSBiZWxvdy4KICAgICAqLwogICAgdXRpbHMuc2V0Q2xhaW1SZXNvbHZlcnMoewogICAgICAgIC8qCiAgICAgICAgLy8gQW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBjbGFpbSByZXNvbHZlciBmdW5jdGlvbiB0aGF0IGlzIGRlZmluZWQgZm9yIGEgY2xhaW0KICAgICAgICAvLyBkaXJlY3RseSBpbiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3Q6CiAgICAgICAgY3VzdG9tLWNsYWltLW5hbWU6IGZ1bmN0aW9uIChyZXF1ZXN0ZWRDbGFpbSkgewogICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGluaXRpYWxseSwgdGhlIGNsYWltIHZhbHVlIGNvbWVzIHN0cmFpZ2h0IGZyb20gYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlOgogICAgICAgICAgICB2YXIgY2xhaW1WYWx1ZSA9IGlkZW50aXR5LmdldEF0dHJpYnV0ZSgnY3VzdG9tLWF0dHJpYnV0ZS1uYW1lJykudG9BcnJheSgpWzBdCgogICAgICAgICAgICAvLyBPcHRpb25hbGx5LCBwcm92aWRlIGFkZGl0aW9uYWwgbG9naWMgZm9yIHByb2Nlc3NpbmcgKGZpbHRlcmluZywgZm9ybWF0dGluZywgZXRjLikgdGhlIGNsYWltIHZhbHVlLgogICAgICAgICAgICAvLyBZb3UgY2FuIHVzZToKICAgICAgICAgICAgLy8gcmVxdWVzdGVkQ2xhaW0uZ2V0TmFtZSgpCiAgICAgICAgICAgIC8vIHJlcXVlc3RlZENsYWltLmdldFZhbHVlcygpCiAgICAgICAgICAgIC8vIHJlcXVlc3RlZENsYWltLmdldExvY2FsZSgpCiAgICAgICAgICAgIC8vIHJlcXVlc3RlZENsYWltLmlzRXNzZW50aWFsKCkKCiAgICAgICAgICAgIHJldHVybiBjbGFpbVZhbHVlCiAgICAgICAgfSwKICAgICAgICAqLwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB1c2Ugb2YgdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyIHNob3dzIGhvdwogICAgICAgICAqIGFuIGFyZ3VtZW50IHBhc3NlZCB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYWltIHJlc29sdmVyCiAgICAgICAgICogYmVjb21lcyBhdmFpbGFibGUgdG8gdGhlIHJlc29sdmVyIGZ1bmN0aW9uICh2aWEgaXRzIGxleGljYWwgY29udGV4dCkuCiAgICAgICAgICovCiAgICAgICAgbmFtZTogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdjbicpLAogICAgICAgIGZhbWlseV9uYW1lOiB1dGlscy5nZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXIoJ3NuJyksCiAgICAgICAgZ2l2ZW5fbmFtZTogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdnaXZlbm5hbWUnKSwKICAgICAgICB6b25laW5mbzogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdwcmVmZXJyZWR0aW1lem9uZScpLAogICAgICAgIGxvY2FsZTogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdwcmVmZXJyZWRsb2NhbGUnKSwKICAgICAgICBlbWFpbDogdXRpbHMuZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyKCdtYWlsJyksCiAgICAgICAgYWRkcmVzczogdXRpbHMuZ2V0QWRkcmVzc0NsYWltUmVzb2x2ZXIoCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgcGFzc2VkIGluIHVzZXIgcHJvZmlsZSBjbGFpbSByZXNvbHZlciBmdW5jdGlvbgogICAgICAgICAgICAgKiBjYW4gYmUgdXNlZCBieSB0aGUgYWRkcmVzcyBjbGFpbSByZXNvbHZlciBmdW5jdGlvbgogICAgICAgICAgICAgKiB0byBvYnRhaW4gdGhlIGNsYWltIHZhbHVlIHRvIGJlIGZvcm1hdHRlZCBhcyBwZXIgdGhlIE9JREMgc3BlY2lmaWNhdGlvbjoKICAgICAgICAgICAgICogQHNlZSBodHRwczovL29wZW5pZC5uZXQvc3BlY3Mvb3BlbmlkLWNvbm5lY3QtY29yZS0xXzAuaHRtbCNBZGRyZXNzQ2xhaW0uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB1dGlscy5nZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXIoJ3Bvc3RhbGFkZHJlc3MnKQogICAgICAgICksCiAgICAgICAgcGhvbmVfbnVtYmVyOiB1dGlscy5nZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXIoJ3RlbGVwaG9uZW51bWJlcicpCiAgICB9KTsKCiAgICAvLyBDTEFJTSBQUk9DRVNTSU5HIFVUSUxJVElFUwoKICAgIC8qKgogICAgICogQHJldHVybnMge29iamVjdH0gQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgcmV1c2FibGUgY2xhaW0gcHJvY2Vzc2luZyB1dGlsaXRpZXMuCiAgICAgKiBAc2VlIFBVQkxJQyBNRVRIT0RTIHNlY3Rpb24gYW5kIHRoZSByZXR1cm4gc3RhdGVtZW50IGZvciB0aGUgbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFV0aWxzICgpIHsKICAgICAgICAvLyBJTVBPUlQgSkFWQQoKICAgICAgICAvKioKICAgICAgICAgKiBQcm92aWRlcyBKYXZhIHNjcmlwdGluZyBmdW5jdGlvbmFsaXR5LgogICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvTW96aWxsYS9Qcm9qZWN0cy9SaGluby9TY3JpcHRpbmdfSmF2YSNqYXZhaW1wb3J0ZXJfY29uc3RydWN0b3J9LgogICAgICAgICAqLwogICAgICAgIHZhciBmckphdmEgPSBKYXZhSW1wb3J0ZXIoCiAgICAgICAgICAgIG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiwKICAgICAgICAgICAgb3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5Vc2VySW5mb0NsYWltcywKICAgICAgICAgICAgb3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltLAoKICAgICAgICAgICAgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAsCiAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QKICAgICAgICApOwoKICAgICAgICAvLyBTRVQgVVAgQ09ORklHVVJBVElPTgoKICAgICAgICAvKioKICAgICAgICAgKiBQbGFjZWhvbGRlciBmb3IgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB0aGF0IGNvbnRhaW5zCiAgICAgICAgICogYW4gb2JqZWN0IHRoYXQgbWFwcyB0aGUgc3VwcG9ydGVkIHNjb3BlIHZhbHVlcyAoc2NvcGVzKQogICAgICAgICAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjbGFpbSBuYW1lcyBmb3IgZWFjaCBzY29wZSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB2YXIgc2NvcGVDbGFpbXNNYXA7CgogICAgICAgIC8qKgogICAgICAgICAqIFBsYWNlaG9sZGVyIGZvciBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRoYXQgY29udGFpbnMKICAgICAgICAgKiBhbiBvYmplY3QgdGhhdCBtYXBzIHRoZSBzdXBwb3J0ZWQgY2xhaW0gbmFtZXMKICAgICAgICAgKiBhbmQgdGhlIHJlc29sdmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdGhlIGNsYWltIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIHZhciBjbGFpbVJlc29sdmVyczsKCiAgICAgICAgLyoqCiAgICAgICAgICogQSAocHVibGljKSBtZXRob2QgdGhhdCBhY2NlcHRzIGFuIG9iamVjdCB0aGF0IG1hcHMgdGhlIHN1cHBvcnRlZCBzY29wZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYWltIG5hbWVzLAogICAgICAgICAqIGFuZCBhc3NpZ25zIGl0IHRvIGEgKHByaXZhdGUpIHZhcmlhYmxlIHRoYXQgc2VydmVzIGFzIGEgY29uZmlndXJhdGlvbiBvcHRpb24uCiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyAtIEFuIG9iamVjdCB0aGF0IG1hcHMgZWFjaCBzdXBwb3J0ZWQgc2NvcGUgdmFsdWUgdG8gYW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMsCiAgICAgICAgICogaW4gb3JkZXIgdG8gc3BlY2lmeSB3aGljaCBjbGFpbXMgbmVlZCB0byBiZSBwcm9jZXNzZWQgZm9yIHRoZSByZXF1ZXN0ZWQgc2NvcGVzLgogICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI1Njb3BlQ2xhaW1zfSBmb3IgZGV0YWlscy4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcGFyYW1zLnByb2ZpbGVdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIHByb2ZpbGUgc2NvcGUgaXMgcmVxdWVzdGVkLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtwYXJhbXMuZW1haWxdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIGVtYWlsIHNjb3BlIGlzIHJlcXVlc3RlZC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcGFyYW1zLmFkZHJlc3NdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIGFkZHJlc3Mgc2NvcGUgaXMgcmVxdWVzdGVkLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtwYXJhbXMucGhvbmVdIC0gQW4gYXJyYXkgb2YgY2xhaW0gbmFtZXMgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIHBob25lIHNjb3BlIGlzIHJlcXVlc3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNldFNjb3BlQ2xhaW1zTWFwKHBhcmFtcykgewogICAgICAgICAgICBzY29wZUNsYWltc01hcCA9IHBhcmFtczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEEgKHB1YmxpYykgbWV0aG9kIHRoYXQgYWNjZXB0cyBhbiBvYmplY3QgdGhhdCBtYXBzIHRoZSBzdXBwb3J0ZWQgY2xhaW0gbmFtZXMKICAgICAgICAgKiBhbmQgdGhlIHJlc29sdmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdGhlIGNsYWltIHZhbHVlLAogICAgICAgICAqIGFuZCBhc3NpZ25zIGl0IHRvIGEgKHByaXZhdGUpIHZhcmlhYmxlIHRoYXQgc2VydmVzIGFzIGEgY29uZmlndXJhdGlvbiBvcHRpb24uCiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyAtIEFuIG9iamVjdCB0aGF0IG1hcHMKICAgICAgICAgKiBlYWNoIHN1cHBvcnRlZCBjbGFpbSBuYW1lIHRvIGEgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgY2xhaW0gdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc2V0Q2xhaW1SZXNvbHZlcnMocGFyYW1zKSB7CiAgICAgICAgICAgIGNsYWltUmVzb2x2ZXJzID0gcGFyYW1zOwogICAgICAgIH0KCiAgICAgICAgLy8gQ0xBSU0gUkVTT0xWRVJTCgogICAgICAgIC8qKgogICAgICAgICAqIENsYWltIHJlc29sdmVycyBhcmUgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGEgY2xhaW0gdmFsdWUuCiAgICAgICAgICogQHBhcmFtIHsqfQogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGEgY2xhaW0gcmVzb2x2ZXIgYmFzZWQgb24gYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gTmFtZSBvZiB0aGUgdXNlciBwcm9maWxlIGF0dHJpYnV0ZS4KICAgICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGRldGVybWluZSB0aGUgY2xhaW0gdmFsdWUKICAgICAgICAgKiBiYXNlZCBvbiB0aGUgdXNlciBwcm9maWxlIGF0dHJpYnV0ZSBhbmQgdGhlIChyZXF1ZXN0ZWQpIGNsYWltIHByb3BlcnRpZXMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0VXNlclByb2ZpbGVDbGFpbVJlc29sdmVyIChhdHRyaWJ1dGVOYW1lKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZXNvbHZlcyBhIGNsYWltIHdpdGggYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlLgogICAgICAgICAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgaWRlbnRpdHkgYXR0cmlidXRlIGlzIG5vdCBwb3B1bGF0ZWQsCiAgICAgICAgICAgICAqIE9SIGlmIHRoZSBjbGFpbSBoYXMgcmVxdWVzdGVkIHZhbHVlcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZSBpZGVudGl0eSBhdHRyaWJ1dGUgdmFsdWUuCiAgICAgICAgICAgICAqIEFUVEVOVElPTjogdGhlIGFmb3JlbWVudGlvbmVkIGNvbXBhcmlzb24gaXMgY2FzZS1zZW5zaXRpdmUuCiAgICAgICAgICAgICAqIEBwYXJhbSB7b3JnLmZvcmdlcm9jay5vcGVuaWRjb25uZWN0LkNsYWltfSBjbGFpbQogICAgICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG9idGFpbiBpbmZvcm1hdGlvbi9yZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhaW0uCiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuaWRjb25uZWN0L0NsYWltLmh0bWx9IGZvciBkZXRhaWxzLgogICAgICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfEhhc2hTZXR8dW5kZWZpbmVkfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZUNsYWltKGNsYWltKSB7CiAgICAgICAgICAgICAgICB2YXIgdXNlclByb2ZpbGVWYWx1ZTsKCiAgICAgICAgICAgICAgICBpZiAoaWRlbnRpdHkpIHsKICAgICAgICAgICAgICAgICAgICB1c2VyUHJvZmlsZVZhbHVlID0gZ2V0Q2xhaW1WYWx1ZUZyb21TZXQoY2xhaW0sIGlkZW50aXR5LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSk7CgogICAgICAgICAgICAgICAgICAgIGlmICh1c2VyUHJvZmlsZVZhbHVlICYmICF1c2VyUHJvZmlsZVZhbHVlLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsYWltLmdldFZhbHVlcygpIHx8IGNsYWltLmdldFZhbHVlcygpLmlzRW1wdHkoKSB8fCBjbGFpbS5nZXRWYWx1ZXMoKS5jb250YWlucyh1c2VyUHJvZmlsZVZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJQcm9maWxlVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhaW07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGFkZHJlc3MgY2xhaW0gcmVzb2x2ZXIgYmFzZWQgb24gYSBjbGFpbSB2YWx1ZSBvYnRhaW5lZCB3aXRoIGFub3RoZXIgY2xhaW0gcmVzb2x2ZXIuCiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZUNsYWltIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBjbGFpbSB2YWx1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGFjY2VwdCBhIGNsYWltIGFzIGFuIGFyZ3VtZW50LAogICAgICAgICAqIHJ1biB0aGUgY2xhaW0gcmVzb2x2ZXIgZnVuY3Rpb24gZm9yIHRoZSBjbGFpbSBhbmQgb2J0YWluIHRoZSBjbGFpbSB2YWx1ZSwKICAgICAgICAgKiBhbmQgYXBwbHkgYWRkaXRpb25hbCBmb3JtYXR0aW5nIHRvIHRoZSB2YWx1ZSBiZWZvcmUgcmV0dXJuaW5nIGl0LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldEFkZHJlc3NDbGFpbVJlc29sdmVyIChyZXNvbHZlQ2xhaW0pIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENyZWF0ZXMgYW4gYWRkcmVzcyBjbGFpbSBvYmplY3QgZnJvbSBhIHZhbHVlIHJldHVybmVkIGJ5IGEgY2xhaW0gcmVzb2x2ZXIsCiAgICAgICAgICAgICAqIGFuZCByZXR1cm5zIHRoZSBhZGRyZXNzIGNsYWltIG9iamVjdCBhcyB0aGUgY2xhaW0gdmFsdWUuCiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI0FkZHJlc3NDbGFpbX0uCiAgICAgICAgICAgICAqIFRoZSBjbGFpbSB2YWx1ZSBpcyBvYnRhaW5lZCB3aXRoIGEgY2xhaW0gcmVzb2x2aW5nIGZ1bmN0aW9uIGF2YWlsYWJsZSBmcm9tIHRoZSBjbG9zdXJlLgogICAgICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBvYnRhaW4gaW5mb3JtYXRpb24vcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIGNsYWltLgogICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmlkY29ubmVjdC9DbGFpbS5odG1sfSBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICogQHJldHVybnMge2phdmEudXRpbC5MaW5rZWRIYXNoTWFwfHVuZGVmaW5lZH0gVGhlIGFkZHJlc3MgY2xhaW0gb2JqZWN0IGNyZWF0ZWQgZnJvbSBhIGNsYWltIHZhbHVlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZUFkZHJlc3NDbGFpbShjbGFpbSkgewogICAgICAgICAgICAgICAgdmFyIGNsYWltVmFsdWUgPSByZXNvbHZlQ2xhaW0oY2xhaW0pOwogICAgICAgICAgICAgICAgdmFyIGFkZHJlc3NPYmplY3Q7CgogICAgICAgICAgICAgICAgaWYgKGlzQ2xhaW1WYWx1ZVZhbGlkKGNsYWltVmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgYWRkcmVzc09iamVjdCA9IG5ldyBmckphdmEuTGlua2VkSGFzaE1hcCgpOwoKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzT2JqZWN0LnB1dCgnZm9ybWF0dGVkJywgY2xhaW1WYWx1ZSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRyZXNzT2JqZWN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFkZHJlc3NDbGFpbTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gZXNzZW50aWFsIGNsYWltIHJlc29sdmVyIGJhc2VkIG9uIGEgY2xhaW0gdmFsdWUgb2J0YWluZWQgd2l0aCBhbm90aGVyIGNsYWltIHJlc29sdmVyLgogICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlc29sdmVDbGFpbSAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgY2xhaW0gdmFsdWUuCiAgICAgICAgICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBhY2NlcHQgYSBjbGFpbSBhcyBhbiBhcmd1bWVudCwKICAgICAgICAgKiBydW4gdGhlIGNsYWltIHJlc29sdmVyIGZ1bmN0aW9uIGZvciB0aGUgY2xhaW0gYW5kIG9idGFpbiB0aGUgY2xhaW0gdmFsdWUsCiAgICAgICAgICogYW5kIGFwcGx5IGFkZGl0aW9uYWwgbG9naWMgZm9yIGVzc2VudGlhbCBjbGFpbXMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0RXNzZW50aWFsQ2xhaW1SZXNvbHZlciAocmVzb2x2ZUNsYWltKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZXR1cm5zIGEgY2xhaW0gdmFsdWUgb3IgdGhyb3dzIGFuIGVycm9yLgogICAgICAgICAgICAgKiBUaGUgY2xhaW0gdmFsdWUgaXMgb2J0YWluZWQgd2l0aCBhIGNsYWltIHJlc29sdmluZyBmdW5jdGlvbiBhdmFpbGFibGUgZnJvbSB0aGUgY2xvc3VyZS4KICAgICAgICAgICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgY2xhaW0gaXMgZXNzZW50aWFsIGFuZCBubyB2YWx1ZSBpcyByZXR1cm5lZCBmb3IgdGhlIGNsYWltLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBVc2Ugb2YgdGhpcyByZXNvbHZlciBpcyBvcHRpb25hbC4KICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9vcGVuaWQubmV0L3NwZWNzL29wZW5pZC1jb25uZWN0LWNvcmUtMV8wLmh0bWwjSW5kaXZpZHVhbENsYWltc1JlcXVlc3RzfSBzdGF0aW5nOgogICAgICAgICAgICAgKiAiTm90ZSB0aGF0IGV2ZW4gaWYgdGhlIENsYWltcyBhcmUgbm90IGF2YWlsYWJsZSBiZWNhdXNlIHRoZSBFbmQtVXNlciBkaWQgbm90IGF1dGhvcml6ZSB0aGVpciByZWxlYXNlIG9yIHRoZXkgYXJlIG5vdCBwcmVzZW50LAogICAgICAgICAgICAgKiB0aGUgQXV0aG9yaXphdGlvbiBTZXJ2ZXIgTVVTVCBOT1QgZ2VuZXJhdGUgYW4gZXJyb3Igd2hlbiBDbGFpbXMgYXJlIG5vdCByZXR1cm5lZCwgd2hldGhlciB0aGV5IGFyZSBFc3NlbnRpYWwgb3IgVm9sdW50YXJ5LAogICAgICAgICAgICAgKiB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNwZWNpZmljIGNsYWltLiIKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtvcmcuZm9yZ2Vyb2NrLm9wZW5pZGNvbm5lY3QuQ2xhaW19IGNsYWltCiAgICAgICAgICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgdG8gb2J0YWluIGluZm9ybWF0aW9uL3JlcXVpcmVtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBjbGFpbS4KICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbH0gZm9yIGRldGFpbHMuCiAgICAgICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAgICAgKiBAdGhyb3dzIHtvcmcuZm9yZ2Vyb2NrLm9hdXRoMi5jb3JlLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb259CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiByZXNvbHZlRXNzZW50aWFsQ2xhaW0oY2xhaW0pIHsKICAgICAgICAgICAgICAgIHZhciBjbGFpbVZhbHVlID0gcmVzb2x2ZUNsYWltKGNsYWltKTsKCiAgICAgICAgICAgICAgICBpZiAoY2xhaW0uaXNFc3NlbnRpYWwoKSAmJiAhaXNDbGFpbVZhbHVlVmFsaWQoY2xhaW1WYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZnJKYXZhLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCdDb3VsZCBub3QgcHJvdmlkZSB2YWx1ZSBmb3IgZXNzZW50aWFsIGNsYWltOiAnICsgY2xhaW0uZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1WYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVFc3NlbnRpYWxDbGFpbTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGRlZmF1bHQgcmVzb2x1dGlvbiBmb3IgYSBjbGFpbS4KICAgICAgICAgKiBVc2UgaXQgaWYgYSBjbGFpbS1zcGVjaWZpYyByZXNvbHZlciBpcyBub3QgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG9idGFpbiBpbmZvcm1hdGlvbi9yZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhaW0uCiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbH0gZm9yIGRldGFpbHMuCiAgICAgICAgICogQHJldHVybnMgeyp9IEEgc2luZ2xlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYWltLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHJlc29sdmVBbnlDbGFpbSAoY2xhaW0pIHsKICAgICAgICAgICAgaWYgKGNsYWltLmdldFZhbHVlcygpLnNpemUoKSA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNsYWltLmdldFZhbHVlcygpLnRvQXJyYXkoKVswXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVVRJTElUSUVTCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgY2xhaW0gdmFsdWUgZnJvbSBhIHNldC4KICAgICAgICAgKiBJZiB0aGUgc2V0IGNvbnRhaW5zIGEgc2luZ2xlIHZhbHVlLCByZXR1cm5zIHRoZSB2YWx1ZS4KICAgICAgICAgKiBJZiB0aGUgc2V0IGNvbnRhaW5zIG11bHRpcGxlIHZhbHVlcywgcmV0dXJucyB0aGUgc2V0LgogICAgICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyB1bmRlZmluZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG9idGFpbiBpbmZvcm1hdGlvbi9yZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhaW0uCiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29wZW5pZGNvbm5lY3QvQ2xhaW0uaHRtbH0gZm9yIGRldGFpbHMuCiAgICAgICAgICogQHBhcmFtIHtqYXZhLnV0aWwuSGFzaFNldH0gc2V0IFRoZSBzZXTigJRmb3IgZXhhbXBsZSwgYSB1c2VyIHByb2ZpbGUgYXR0cmlidXRlIHZhbHVlLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd8amF2YS51dGlsLkhhc2hTZXR8dW5kZWZpbmVkfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldENsYWltVmFsdWVGcm9tU2V0IChjbGFpbSwgc2V0KSB7CiAgICAgICAgICAgIGlmIChzZXQgJiYgc2V0LnNpemUoKSkgewogICAgICAgICAgICAgICAgaWYgKHNldC5zaXplKCkgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0LnRvQXJyYXkoKVswXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChsb2dnZXIud2FybmluZ0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ09JREMgQ2xhaW1zIHNjcmlwdC4gR290IGFuIGVtcHR5IHNldCBmb3IgY2xhaW06ICcgKyBjbGFpbS5nZXROYW1lKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBpc0NsYWltVmFsdWVWYWxpZCAoY2xhaW1WYWx1ZSkgewogICAgICAgICAgICBpZiAodHlwZW9mIGNsYWltVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IGNsYWltVmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBDTEFJTSBQUk9DRVNTSU5HCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHBvcHVsYXRlZCB3aXRoIHRoZSBjb21wdXRlZCBjbGFpbSB2YWx1ZXMKICAgICAgICAgKiBhbmQgdGhlIHJlcXVlc3RlZCBzY29wZXMgbWFwcGVkIHRvIHRoZSBjbGFpbSBuYW1lcy4KICAgICAgICAgKiBAcmV0dXJucyB7b3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5Vc2VySW5mb0NsYWltc30gVGhlIG9iamVjdCB0byBiZSByZXR1cm5lZCB0byB0aGUgYXV0aG9yaXphdGlvbiBzZXJ2ZXIuCiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29hdXRoMi9jb3JlL1VzZXJJbmZvQ2xhaW1zLmh0bWx9LgogICAgICAgICAqIEBzZWUgUkVTVUxUUyBzZWN0aW9uIGZvciB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0VXNlckluZm9DbGFpbXMgKCkgewogICAgICAgICAgICByZXR1cm4gbmV3IGZySmF2YS5Vc2VySW5mb0NsYWltcyhnZXRDb21wdXRlZENsYWltcygpLCBnZXRDb21wb3NpdGVTY29wZXMoKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbWFwIG9mIChyZXF1ZXN0ZWQpIGNsYWltIG5hbWVzIHBvcHVsYXRlZCB3aXRoIHRoZSBjb21wdXRlZCBjbGFpbSB2YWx1ZXMuCiAgICAgICAgICogQHJldHVybnMge2phdmEudXRpbC5MaW5rZWRIYXNoTWFwfQogICAgICAgICAqIEEgbWFwIG9mIHRoZSByZXF1ZXN0ZWQgY2xhaW0gbmFtZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYWltIHZhbHVlcy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRDb21wdXRlZENsYWltcyAoKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDcmVhdGVzIGEgY29tcGxldGUgbGlzdCBvZiBjbGFpbSBvYmplY3RzIGZyb206CiAgICAgICAgICAgICAqIHRoZSBjbGFpbXMgZGVyaXZlZCBmcm9tIHRoZSBzY29wZXMsCiAgICAgICAgICAgICAqIHRoZSBjbGFpbXMgcHJvdmlkZWQgYnkgdGhlIGF1dGhvcml6YXRpb24gc2VydmVyLAogICAgICAgICAgICAgKiBhbmQgdGhlIGNsYWltcyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4KICAgICAgICAgICAgICogQHJldHVybnMge2phdmEudXRpbC5BcnJheUxpc3R9CiAgICAgICAgICAgICAqIFJldHVybnMgYSBjb21wbGV0ZSBsaXN0IG9mIG9yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbSBvYmplY3RzIGF2YWlsYWJsZSB0byB0aGUgc2NyaXB0LgogICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmlkY29ubmVjdC9DbGFpbS5odG1sfSBmb3IgdGhlIGNsYWltIG9iamVjdCBkZXRhaWxzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0Q2xhaW1zKCkgewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBjbGFpbSBvYmplY3RzIGZvciB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICAgICAgICAgICAgICAgICAqIFVzZXMgdGhlIHNjb3BlQ2xhaW1zTWFwIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGRlcml2ZSB0aGUgY2xhaW0gbmFtZXM7CiAgICAgICAgICAgICAgICAgKiBubyBvdGhlciBwcm9wZXJ0aWVzIG9mIGEgY2xhaW0gZGVyaXZlZCBmcm9tIGEgc2NvcGUgYXJlIHBvcHVsYXRlZC4KICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtqYXZhLnV0aWwuQXJyYXlMaXN0fQogICAgICAgICAgICAgICAgICogQSBsaXN0IG9mIG9yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbSBvYmplY3RzIGRlcml2ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICAgICAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9vcGVuaWRjb25uZWN0L0NsYWltLmh0bWx9IGZvciB0aGUgY2xhaW0gb2JqZWN0IGRldGFpbHMuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnZlcnRTY29wZVRvQ2xhaW1zKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjbGFpbXMgPSBuZXcgZnJKYXZhLkFycmF5TGlzdCgpOwoKICAgICAgICAgICAgICAgICAgICBzY29wZXMudG9BcnJheSgpLmZvckVhY2goZnVuY3Rpb24gKHNjb3BlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoc2NvcGUpICE9PSAnb3BlbmlkJyAmJiBzY29wZUNsYWltc01hcFtzY29wZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlQ2xhaW1zTWFwW3Njb3BlXS5mb3JFYWNoKGZ1bmN0aW9uIChjbGFpbU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFpbXMuYWRkKG5ldyBmckphdmEuQ2xhaW0oY2xhaW1OYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBjbGFpbXMgPSBuZXcgZnJKYXZhLkFycmF5TGlzdCgpOwoKICAgICAgICAgICAgICAgIGNsYWltcy5hZGRBbGwoY29udmVydFNjb3BlVG9DbGFpbXMoKSk7CiAgICAgICAgICAgICAgICBjbGFpbXMuYWRkQWxsKGNsYWltT2JqZWN0cyk7CiAgICAgICAgICAgICAgICBjbGFpbXMuYWRkQWxsKHJlcXVlc3RlZFR5cGVkQ2xhaW1zKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBjbGFpbSB2YWx1ZS4KICAgICAgICAgICAgICogVG8gb2J0YWluIHRoZSBjbGFpbSB2YWx1ZSwgdXNlcyB0aGUgcmVzb2x2ZXIgZnVuY3Rpb24gc3BlY2lmaWVkIGZvciB0aGUgY2xhaW0gaW4gdGhlIGNsYWltUmVzb2x2ZXJzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LgogICAgICAgICAgICAgKiBAc2VlIGNsYWltUmVzb2x2ZXJzCiAgICAgICAgICAgICAqIElmIG5vIHJlc29sdmVyIGZ1bmN0aW9uIGlzIGZvdW5kLCB1c2VzIHRoZSBkZWZhdWx0IGNsYWltIHJlc29sdmVyIGZ1bmN0aW9uLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge29yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5DbGFpbX0gY2xhaW0KICAgICAgICAgICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBvYnRhaW4gaW5mb3JtYXRpb24vcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIGNsYWltLgogICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmlkY29ubmVjdC9DbGFpbS5odG1sfSBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICogQHJldHVybnMgeyp9IENsYWltIHZhbHVlLgogICAgICAgICAgICAgKiBAdGhyb3dzIHtvcmcuZm9yZ2Vyb2NrLm9hdXRoMi5jb3JlLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb259CiAgICAgICAgICAgICAqIFJldGhyb3dzIHRoaXMgZXhjZXB0aW9uIGlmIGEgY2xhaW0gcmVzb2x2ZXIgdGhyb3dzIGl0LgogICAgICAgICAgICAgKiBZb3UgY2FuIHRocm93IG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBmcm9tIHlvdXIgY3VzdG9tIGNsYWltIHJlc29sdmVyCiAgICAgICAgICAgICAqIGlmIHlvdSB3YW50IHRvIHRlcm1pbmF0ZSB0aGUgY2xhaW0gcHJvY2Vzc2luZy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXB1dGVDbGFpbShjbGFpbSkgewogICAgICAgICAgICAgICAgdmFyIHJlc29sdmVDbGFpbTsKICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNsYWltID0gY2xhaW1SZXNvbHZlcnNbY2xhaW0uZ2V0TmFtZSgpXSB8fCByZXNvbHZlQW55Q2xhaW07CgogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhaW0oY2xhaW0pOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnT0lEQyBDbGFpbXMgc2NyaXB0IGV4Y2VwdGlvbi4gVW5hYmxlIHRvIHJlc29sdmUgT0lEQyBDbGFpbS4gJyArIGU7CgogICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoZSkuaW5kZXhPZignb3JnLmZvcmdlcm9jay5vYXV0aDIuY29yZS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLndhcm5pbmdFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcobWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY29tcHV0ZWRDbGFpbXMgPSBuZXcgZnJKYXZhLkxpbmtlZEhhc2hNYXAoKTsKCiAgICAgICAgICAgIGdldENsYWltcygpLnRvQXJyYXkoKS5mb3JFYWNoKGZ1bmN0aW9uIChjbGFpbSkgewogICAgICAgICAgICAgICAgdmFyIGNsYWltVmFsdWUgPSBjb21wdXRlQ2xhaW0oY2xhaW0pOwoKICAgICAgICAgICAgICAgIGlmIChpc0NsYWltVmFsdWVWYWxpZChjbGFpbVZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkQ2xhaW1zLnB1dChjbGFpbS5nZXROYW1lKCksIGNsYWltVmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBJZiBhIGNsYWltIGhhcyBiZWVuIHByb2Nlc3NlZCwgYnV0IGFwcGVhcnMgaW4gdGhlIGxpc3QgYWdhaW4sCiAgICAgICAgICAgICAgICAgICAgICogYW5kIGl0cyB2YWx1ZSBjYW5ub3QgYmUgY29tcHV0ZWQgdW5kZXIgdGhlIG5ldyBjb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAqIHRoZSBjbGFpbSBpcyByZW1vdmVkIGZyb20gdGhlIGZpbmFsIHJlc3VsdC4KICAgICAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICAgICAqIEZvciBleGFtcGxlLCBhIGNsYWltIGNvdWxkIGJlIG1hcHBlZCB0byBhIHNjb3BlIGFuZCBmb3VuZCBpbiB0aGUgdXNlciBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAqIGJ1dCBhbHNvIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50IHdpdGggcmVxdWlyZWQgdmFsdWVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGNvbXB1dGVkIG9uZS4KICAgICAgICAgICAgICAgICAgICAgKiBAc2VlIHtsaW5rIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI0luZGl2aWR1YWxDbGFpbXNSZXF1ZXN0c30uCiAgICAgICAgICAgICAgICAgICAgICogZm9yIHRoZSByZWxldmFudCBPSURDIHNwZWNpZmljYXRpb24gZGV0YWlscy4KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBjb21wdXRlZENsYWltcy5yZW1vdmUoY2xhaW0uZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gY29tcHV0ZWRDbGFpbXM7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbWFwIG9mIHJlcXVlc3RlZCBzY29wZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYWltIG5hbWVzLgogICAgICAgICAqIEByZXR1cm5zIHtqYXZhLnV0aWwuTGlua2VkSGFzaE1hcH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRDb21wb3NpdGVTY29wZXMgKCkgewogICAgICAgICAgICB2YXIgY29tcG9zaXRlU2NvcGVzID0gbmV3IGZySmF2YS5MaW5rZWRIYXNoTWFwKCk7CgogICAgICAgICAgICBzY29wZXMudG9BcnJheSgpLmZvckVhY2goZnVuY3Rpb24gKHNjb3BlKSB7CiAgICAgICAgICAgICAgICB2YXIgc2NvcGVDbGFpbXMgPSBuZXcgZnJKYXZhLkFycmF5TGlzdCgpOwoKICAgICAgICAgICAgICAgIGlmIChzY29wZUNsYWltc01hcFtzY29wZV0pIHsKICAgICAgICAgICAgICAgICAgICBzY29wZUNsYWltc01hcFtzY29wZV0uZm9yRWFjaChmdW5jdGlvbiAoY2xhaW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlQ2xhaW1zLmFkZChjbGFpbU5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzY29wZUNsYWltcy5zaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVTY29wZXMucHV0KHNjb3BlLCBzY29wZUNsYWltcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZVNjb3BlczsKICAgICAgICB9CgogICAgICAgIC8vIFBVQkxJQyBNRVRIT0RTCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHNldFNjb3BlQ2xhaW1zTWFwOiBzZXRTY29wZUNsYWltc01hcCwKICAgICAgICAgICAgc2V0Q2xhaW1SZXNvbHZlcnM6IHNldENsYWltUmVzb2x2ZXJzLAogICAgICAgICAgICBnZXRVc2VyUHJvZmlsZUNsYWltUmVzb2x2ZXI6IGdldFVzZXJQcm9maWxlQ2xhaW1SZXNvbHZlciwKICAgICAgICAgICAgZ2V0QWRkcmVzc0NsYWltUmVzb2x2ZXI6IGdldEFkZHJlc3NDbGFpbVJlc29sdmVyLAogICAgICAgICAgICBnZXRFc3NlbnRpYWxDbGFpbVJlc29sdmVyOiBnZXRFc3NlbnRpYWxDbGFpbVJlc29sdmVyLAogICAgICAgICAgICBnZXRVc2VySW5mb0NsYWltczogZ2V0VXNlckluZm9DbGFpbXMKICAgICAgICB9OwogICAgfQoKICAgIC8vIFJFU1VMVFMKCiAgICAvKioKICAgICAqIFRoaXMgc2NyaXB0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIG9yZy5mb3JnZXJvY2sub2F1dGgyLmNvcmUuVXNlckluZm9DbGFpbXMgY2xhc3MKICAgICAqIHBvcHVsYXRlZCB3aXRoIHRoZSBjb21wdXRlZCBjbGFpbSB2YWx1ZXMgYW5kCiAgICAgKiB0aGUgcmVxdWVzdGVkIHNjb3BlcyBtYXBwZWQgdG8gdGhlIGNsYWltIG5hbWVzLgogICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9vcmcvZm9yZ2Vyb2NrL29hdXRoMi9jb3JlL1VzZXJJbmZvQ2xhaW1zLmh0bWx9LgogICAgICoKICAgICAqIEFzc2lnbmluZyBpdCB0byBhIHZhcmlhYmxlIGdpdmVzIHlvdSBhbiBvcHBvcnR1bml0eQogICAgICogdG8gbG9nIHRoZSBjb250ZW50IG9mIHRoZSByZXR1cm5lZCB2YWx1ZSBkdXJpbmcgZGV2ZWxvcG1lbnQuCiAgICAgKi8KICAgIHZhciB1c2VySW5mb0NsYWltcyA9IHV0aWxzLmdldFVzZXJJbmZvQ2xhaW1zKCk7CgogICAgLyoKICAgIGxvZ2dlci5lcnJvcihzY3JpcHROYW1lICsgJyByZXN1bHRzOicpCiAgICBsb2dnZXIuZXJyb3IoJ1ZhbHVlczogJyArIHVzZXJJbmZvQ2xhaW1zLmdldFZhbHVlcygpKQogICAgbG9nZ2VyLmVycm9yKCdTY29wZXM6ICcgKyB1c2VySW5mb0NsYWltcy5nZXRDb21wb3NpdGVTY29wZXMoKSkKICAgICovCgogICAgcmV0dXJuIHVzZXJJbmZvQ2xhaW1zOwp9KCkpOwo=\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"OIDC_CLAIMS\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"69f06e63-128c-4e2f-af52-079a8a6f448b\",\"name\":\"SAML2 SP Adapter Script\",\"description\":\"Default global script for SAML2 SP Adapter\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjMgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKLyoKICogVGhlIHNjcmlwdCBoYXMgdGhlc2UgdG9wIGxldmVsIGZ1bmN0aW9ucyB0aGF0IGNvdWxkIGJlIGV4ZWN1dGVkIGR1cmluZyBhIFNBTUwyIGZsb3cuCiAqICAgICAgLSBwcmVTaW5nbGVTaWduT25SZXF1ZXN0CiAqICAgICAgLSBwcmVTaW5nbGVTaWduT25Qcm9jZXNzCiAqICAgICAgLSBwb3N0U2luZ2xlU2lnbk9uU3VjY2VzcwogKiAgICAgIC0gcG9zdFNpbmdsZVNpZ25PbkZhaWx1cmUKICogICAgICAtIHBvc3ROZXdOYW1lSURTdWNjZXNzCiAqICAgICAgLSBwb3N0VGVybWluYXRlTmFtZUlEU3VjY2VzcwogKiAgICAgIC0gcHJlU2luZ2xlTG9nb3V0UHJvY2VzcwogKiAgICAgIC0gcG9zdFNpbmdsZUxvZ291dFN1Y2Nlc3MKICoKICogUGxlYXNlIHNlZSB0aGUgSmF2YURvYyBmb3IgdGhlIGludGVyZmFjZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBtZXRob2RzLgogKiBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb3BlbmFtL3NhbWwyL3BsdWdpbnMvU1BBZGFwdGVyLmh0bWwKICogTm90ZSB0aGF0IHRoZSBpbml0aWFsaXplIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBzY3JpcHRzLgogKgogKiBEZWZpbmVkIHZhcmlhYmxlcy4gQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlIHJlc3BlY3RpdmUgZnVuY3Rpb25zIGZvciB0aGUgdmFyaWFibGVzIGF2YWlsYWJsZSB0byBpdC4KICoKICogaG9zdGVkRW50aXR5SWQgLSBTdHJpbmcKICogICAgIEVudGl0eSBJRCBmb3IgdGhlIGhvc3RlZCBJRFAKICogcmVhbG0gLSBTdHJpbmcKICogICAgIFJlYWxtIG9mIHRoZSBob3N0ZWQgSURQCiAqIGlkcEVudGl0eUlkIC0gU3RyaW5nCiAqICAgICBUaGUgZW50aXR5IElEIGZvciB0aGUgSWRlbnRpdHkgUHJvdmlkZXIgZm9yIHdoaWNoIHRoZSBzaWduLW9uIHJlcXVlc3Qgd2lsbCBiZSBzZW50LgogKiByZXF1ZXN0IC0gSHR0cFNlcnZsZXRSZXF1ZXN0ICgxKQogKiAgICAgU2VydmxldCByZXF1ZXN0IG9iamVjdAogKiByZXNwb25zZSAtIEh0dHBTZXJ2bGV0UmVzcG9uc2UgKDIpCiAqICAgICBTZXJ2bGV0IHJlc3BvbnNlIG9iamVjdAogKiBhdXRoblJlcXVlc3QgLSBBdXRoblJlcXVlc3QgKDMpCiAqICAgICBUaGUgYXV0aGVudGljYXRpb24gcmVxdWVzdCBzZW50IHRoYXQgaXMgc2VudCBmcm9tIHRoZSBTZXJ2aWNlIFByb3ZpZGVyLgogKiBzZXNzaW9uIC0gU1NPVG9rZW4gKDQpCiAqICAgICBUaGUgc2luZ2xlIHNpZ24tb24gc2Vzc2lvbi4gVGhlIHJlZmVyZW5jZSB0eXBlIG9mIHRoaXMgaXMgT2JqZWN0IGFuZCB3b3VsZCBuZWVkIHRvIGJlIGNhc3RlZCB0byBTU09Ub2tlbi4KICogcmVzIC0gUmVzcG9uc2UgKDUpCiAqICAgICBUaGUgU1NPIFJlc3BvbnNlIHJlY2VpdmVkIGZyb20gdGhlIElkZW50aXR5IFByb3ZpZGVyLgogKiBwcm9maWxlIC0gU3RyaW5nCiAqICAgICBUaGUgcHJvdG9jb2wgcHJvZmlsZSB0aGF0IGlzIHVzZWQsIHRoaXMgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZnJvbSBTQU1MMkNvbnN0YW50cyAoNik6CiAqICAgICAgICAgIC0gU0FNTDJDb25zdGFudHMuSFRUUF9QT1NUCiAqICAgICAgICAgIC0gU0FNTDJDb25zdGFudHMuSFRUUF9BUlRJRkFDVAogKiAgICAgICAgICAtIFNBTUwyQ29uc3RhbnRzLlBBT1MKICogb3V0IC0gUHJpbnRXcml0ZXIgKDcpCiAqICAgICBUaGUgUHJpbnRXcml0ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSB0by4KICogaXNGZWRlcmF0aW9uIC0gYm9vbGVhbgogKiAgICAgU2V0IHRvIHRydWUgaWYgdXNpbmcgZmVkZXJhdGlvbiwgb3RoZXJ3aXNlIGZhbHNlLgogKiBmYWlsdXJlQ29kZSAtIGludAogKiAgICAgQW4gaW50ZWdlciBob2xkaW5nIHRoZSBmYWlsdXJlIGNvZGUgd2hlbiBhbiBlcnJvciBoYXMgb2NjdXJyZWQuIEZvciBwb3RlbnRpYWwgdmFsdWVzIHNlZSBTUEFkYXB0ZXIuCiAqIHVzZXJJZCAtIFN0cmluZwogKiAgICAgVGhlIHVuaXF1ZSB1bml2ZXJzYWwgSUQgb2YgdGhlIHVzZXIgd2l0aCB3aG9tIHRoZSBuZXcgbmFtZSBpZGVudGlmaWVyIHJlcXVlc3Qgd2FzIHBlcmZvcm1lZC4KICogaWRSZXF1ZXN0IC0gTWFuYWdlTmFtZUlEUmVxdWVzdCAoOCkKICogICAgIFRoZSBuZXcgbmFtZSBpZGVudGlmaWVyIHJlcXVlc3QsIHRoaXMgd2lsbCBiZSBudWxsIGlmIHRoZSByZXF1ZXN0IG9iamVjdCBpcyBub3QgYXZhaWxhYmxlCiAqIGlkUmVzcG9uc2UgLSBNYW5hZ2VOYW1lSURSZXNwb25zZSAoOSkKICogICAgIFRoZSBuZXcgbmFtZSBpZGVudGlmaWVyIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmUgbnVsbCBpZiB0aGUgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUKICogYmluZGluZyAtIFN0cmluZwogKiAgICAgVGhlIGJpbmRpbmcgdXNlZCBmb3IgdGhlIG5ldyBuYW1lIGlkZW50aWZpZXIgcmVxdWVzdC4gVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICogICAgICAgICAgLSBTQU1MMkNvbnN0YW50cy5TT0FQCiAqICAgICAgICAgIC0gU0FNTDJDb25zdGFudHMuSFRUUF9SRURJUkVDVAogKiBsb2dvdXRSZXF1ZXN0IC0gTG9nb3V0UmVxdWVzdCAoMTApCiAqICAgICBUaGUgc2luZ2xlIGxvZ291dCByZXF1ZXN0LgogKiBsb2dvdXRSZXNwb25zZSAtIExvZ291dFJlc3BvbnNlICgxMSkKICogICAgIFRoZSBzaW5nbGUgbG9nb3V0IHJlc3BvbnNlLgogKiBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIgLSBTcEFkYXB0ZXJTY3JpcHRIZWxwZXIgKDEyKQogKiAgICAgQW4gaW5zdGFuY2Ugb2YgU3BBZGFwdGVyU2NyaXB0SGVscGVyIGNvbnRhaW5pbmcgaGVscGVyIG1ldGhvZHMuIFNlZSBKYXZhZG9jIGZvciBtb3JlIGRldGFpbHMuCiAqIGxvZ2dlciAtIExvZ2dlciBpbnN0YW5jZQogKiAgICAgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvc2NyaXB0aW5nLWd1aWRlL3NjcmlwdGluZy1hcGktZ2xvYmFsLWxvZ2dlci5odG1sI3NjcmlwdGluZy1hcGktZ2xvYmFsLWxvZ2dlci4KICogICAgIENvcnJlc3BvbmRpbmcgbG9nIGZpbGVzIHdpbGwgYmUgcHJlZml4ZWQgd2l0aDogc2NyaXB0cy48c2NyaXB0IG5hbWU+CiAqCiAqIFRocm93cyBTQU1MMkV4Y2VwdGlvbiAoMTMpOgogKiAgICAgZm9yIGFueSBleGNlcHRpb25zIG9jY3VycmluZyBpbiB0aGUgYWRhcHRlci4gVGhlIGZlZGVyYXRpb24gcHJvY2VzcyB3aWxsIGNvbnRpbnVlCiAqCiAqIENsYXNzIHJlZmVyZW5jZToKICogKDEpIEh0dHBTZXJ2bGV0UmVxdWVzdCAtIGh0dHBzOi8vdG9tY2F0LmFwYWNoZS5vcmcvdG9tY2F0LTcuMC1kb2Mvc2VydmxldGFwaS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0Lmh0bWwuCiAqICgyKSBIdHRwU2VydmxldFJlc3BvbnNlIC0gaHR0cHM6Ly90b21jYXQuYXBhY2hlLm9yZy90b21jYXQtNy4wLWRvYy9zZXJ2bGV0YXBpL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlLmh0bWwuCiAqICgzKSBBdXRoblJlcXVlc3QgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvQXV0aG5SZXF1ZXN0Lmh0bWwuCiAqICg0KSBTU09Ub2tlbiAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL2lwbGFuZXQvc3NvL1NTT1Rva2VuLmh0bWwuCiAqICg1KSBSZXNwb25zZSAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9wcm90b2NvbC9SZXNwb25zZS5odG1sCiAqICg2KSBTQU1MMkNvbnN0YW50cyAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9jb21tb24vU0FNTDJDb25zdGFudHMuaHRtbAogKiAoNykgUHJpbnRXcml0ZXIgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9pby9QcmludFdyaXRlci5odG1sCiAqICg4KSBNYW5hZ2VOYW1lSURSZXF1ZXN0IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMy9fYXR0YWNobWVudHMvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL3Byb3RvY29sL01hbmFnZU5hbWVJRFJlcXVlc3QuaHRtbAogKiAoOSkgTWFuYWdlTmFtZUlEUmVzcG9uc2UgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvTWFuYWdlTmFtZUlEUmVzcG9uc2UuaHRtbAogKiAoMTApIExvZ291dFJlcXVlc3QgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvTG9nb3V0UmVxdWVzdC5odG1sCiAqICgxMSkgTG9nb3V0UmVzcG9uc2UgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvTG9nb3V0UmVzcG9uc2UuaHRtbAogKiAoMTIpIFNwQWRhcHRlclNjcmlwdEhlbHBlciAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83LjMvX2F0dGFjaG1lbnRzL2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9wbHVnaW5zL3NjcmlwdGVkL1NwQWRhcHRlclNjcmlwdEhlbHBlci5odG1sLgogKiAoMTMpIFNBTUwyRXhjZXB0aW9uIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMy9fYXR0YWNobWVudHMvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL2NvbW1vbi9TQU1MMkV4Y2VwdGlvbi5odG1sLgogKi8KCi8qCiAqIFRlbXBsYXRlL2RlZmF1bHQgc2NyaXB0IGZvciBTQU1MMiBTUCBBZGFwdGVyIHNjcmlwdGVkIHBsdWdpbi4KICovCgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwcmVTaW5nbGVTaWduT25SZXF1ZXN0OgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIGlkcEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIGF1dGhuUmVxdWVzdAogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICovCmZ1bmN0aW9uIHByZVNpbmdsZVNpZ25PblJlcXVlc3QoKSB7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZVNpbmdsZVNpZ25PblByb2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlcwogKiAgICAgcHJvZmlsZQogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICovCmZ1bmN0aW9uIHByZVNpbmdsZVNpZ25PblByb2Nlc3MoKSB7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHBvc3RTaW5nbGVTaWduT25TdWNjZXNzOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICByZXF1ZXN0CiAqICAgICByZXNwb25zZQogKiAgICAgb3V0CiAqICAgICBzZXNzaW9uCiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlcwogKiAgICAgcHJvZmlsZQogKiAgICAgaXNGZWRlcmF0aW9uCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKgogKiBSZXR1cm4gLSB0cnVlIGlmIHJlc3BvbnNlIGlzIGJlaW5nIHJlZGlyZWN0ZWQsIGZhbHNlIGlmIG5vdC4gRGVmYXVsdCB0byBmYWxzZS4KICovCmZ1bmN0aW9uIHBvc3RTaW5nbGVTaWduT25TdWNjZXNzKCkgewogICAgcmV0dXJuIGZhbHNlOwp9CgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwb3N0U2luZ2xlU2lnbk9uRmFpbHVyZToKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIGF1dGhuUmVxdWVzdAogKiAgICAgcmVzCiAqICAgICBwcm9maWxlCiAqICAgICBmYWlsdXJlQ29kZQogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICoKICogUmV0dXJuIC0gdHJ1ZSBpZiByZXNwb25zZSBpcyBiZWluZyByZWRpcmVjdGVkLCBmYWxzZSBpZiBub3QuIERlZmF1bHQgdG8gZmFsc2UuCiAqLwpmdW5jdGlvbiBwb3N0U2luZ2xlU2lnbk9uRmFpbHVyZSgpIHsKICAgIHJldHVybiBmYWxzZTsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcG9zdE5ld05hbWVJRFN1Y2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICB1c2VySWQKICogICAgIGlkUmVxdWVzdAogKiAgICAgaWRSZXNwb25zZQogKiAgICAgYmluZGluZwogKiAgICAgc3BBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICBsb2dnZXIKICovCmZ1bmN0aW9uIHBvc3ROZXdOYW1lSURTdWNjZXNzKCkgewp9CgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwb3N0VGVybWluYXRlTmFtZUlEU3VjY2VzczoKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgcmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIHVzZXJJZAogKiAgICAgaWRSZXF1ZXN0CiAqICAgICBpZFJlc3BvbnNlCiAqICAgICBiaW5kaW5nCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcG9zdFRlcm1pbmF0ZU5hbWVJRFN1Y2Nlc3MoKSB7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZVNpbmdsZUxvZ291dFByb2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICB1c2VySWQKICogICAgIGxvZ291dFJlcXVlc3QKICogICAgIGxvZ291dFJlc3BvbnNlCiAqICAgICBiaW5kaW5nCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcHJlU2luZ2xlTG9nb3V0UHJvY2VzcygpIHsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcG9zdFNpbmdsZUxvZ291dFN1Y2Nlc3M6CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIHJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICB1c2VySWQKICogICAgIGxvZ291dFJlcXVlc3QKICogICAgIGxvZ291dFJlc3BvbnNlCiAqICAgICBiaW5kaW5nCiAqICAgICBzcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIGxvZ2dlcgogKi8KZnVuY3Rpb24gcG9zdFNpbmdsZUxvZ291dFN1Y2Nlc3MoKSB7Cn0=\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"SAML2_SP_ADAPTER\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"1d475815-72cb-42eb-aafd-4026989d28a7\",\"name\":\"Social Identity Provider Profile Transformation Script\",\"description\":\"Default global script for Social Identity Provider Profile Transformation\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKLyogRGVmYXVsdCBTb2NpYWwgSWRlbnRpdHkgUHJvdmlkZXIgUHJvZmlsZSBUcmFuc2Zvcm1hdGlvbiBzY3JpcHQgdG8gdXNlIGFzIGEgdGVtcGxhdGUgZm9yIG5ldyBzY3JpcHRzICov\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"c4f22465-2368-4e27-8013-e6399974fd48\",\"name\":\"SAML2 IDP Attribute Mapper Script\",\"description\":\"Default global script for SAML2 IDP Attribute Mapper\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjEtMjAyMiBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgovKgogKiBUaGlzIHNjcmlwdCByZXR1cm5zIGEgbGlzdCBvZiBTQU1MIEF0dHJpYnV0ZSBvYmplY3RzIGZvciB0aGUgSURQIGZyYW1ld29yayB0byBpbnNlcnQgaW50byB0aGUgZ2VuZXJhdGVkIEFzc2VydGlvbi4KICoKICogRGVmaW5lZCB2YXJpYWJsZXM6CiAqIHNlc3Npb24gLSBTU09Ub2tlbiAoMSkKICogICAgICAgICAgIFRoZSBzaW5nbGUgc2lnbi1vbiBzZXNzaW9uLgogKiBob3N0ZWRFbnRpdHlJZCAtIFN0cmluZyAocHJpbWl0aXZlKS4KICogICAgICAgICAgICAgICAgICBUaGUgaG9zdGVkIGVudGl0eSBJRC4KICogcmVtb3RlRW50aXR5SWQgLSBTdHJpbmcgKHByaW1pdGl2ZSkuCiAqICAgICAgICAgICAgICAgICAgVGhlIHJlbW90ZSBlbnRpdHkgSUQuCiAqIHJlYWxtIC0gU3RyaW5nIChwcmltaXRpdmUpLgogKiAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSByZWFsbSB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGluZyB0by4KICogbG9nZ2VyIC0gQWx3YXlzIHByZXNlbnQsIHRoZSBkZWJ1ZyBsb2dnZXIgaW5zdGFuY2U6CiAqICAgICAgICAgIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L3NjcmlwdGluZy1ndWlkZS9zY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuaHRtbCNzY3JpcHRpbmctYXBpLWdsb2JhbC1sb2dnZXIuCiAqICAgICAgICAgIENvcnJlc3BvbmRpbmcgbG9nIGZpbGVzIHdpbGwgYmUgcHJlZml4ZWQgd2l0aDogc2NyaXB0cy5TQU1MMl9JRFBfQVRUUklCVVRFX01BUFBFUgogKiBpZHBBdHRyaWJ1dGVNYXBwZXJTY3JpcHRIZWxwZXIgLSBJZHBBdHRyaWJ1dGVNYXBwZXJTY3JpcHRIZWxwZXIgKDIpCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEFuIElkcEF0dHJpYnV0ZU1hcHBlclNjcmlwdEhlbHBlciBpbnN0YW5jZSBjb250YWluaW5nIG1ldGhvZHMgdXNlZCBmb3IgSURQIGF0dHJpYnV0ZSBtYXBwaW5nLgogKgogKiBUaHJvd3MgU0FNTDJFeGNlcHRpb246CiAqICAgICAgLSBvbiBmYWlsaW5nIHRvIG1hcCB0aGUgSURQIGF0dHJpYnV0ZXMuCiAqCiAqIFJldHVybiAtIGEgbGlzdCBvZiBTQU1MIEF0dHJpYnV0ZSAoMykgb2JqZWN0cy4KICoKICogQ2xhc3MgcmVmZXJlbmNlOgogKiAoMSkgU1NPVG9rZW4gLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL2NvbS9pcGxhbmV0L3Nzby9TU09Ub2tlbi5odG1sLgogKiAoMikgSWRwQXR0cmlidXRlTWFwcGVyU2NyaXB0SGVscGVyIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMi9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcGx1Z2lucy9zY3JpcHRlZC9JZHBBdHRyaWJ1dGVNYXBwZXJTY3JpcHRIZWxwZXIuaHRtbC4KICogKDMpIEF0dHJpYnV0ZSAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3MvY29tL3N1bi9pZGVudGl0eS9zYW1sMi9hc3NlcnRpb24vQXR0cmlidXRlLmh0bWwuCiAqLwoKLyoqCiAqIERlZmF1bHQgU0FNTDIgSURQIEF0dHJpYnV0ZSBNYXBwZXIuCiAqLwpmdW5jdGlvbiBnZXRBdHRyaWJ1dGVzKCkgewogICAgdmFyIGZySmF2YSA9IEphdmFJbXBvcnRlcigKICAgICAgICBjb20uc3VuLmlkZW50aXR5LnNhbWwyLmNvbW1vbi5TQU1MMkV4Y2VwdGlvbgogICAgKTsKCiAgICBjb25zdCBkZWJ1Z01ldGhvZCA9ICJTY3JpcHRlZElEUEF0dHJpYnV0ZU1hcHBlci5nZXRBdHRyaWJ1dGVzOjogIjsKCiAgICB0cnkgewoKICAgICAgICBpZiAoIWlkcEF0dHJpYnV0ZU1hcHBlclNjcmlwdEhlbHBlci5pc1Nlc3Npb25WYWxpZChzZXNzaW9uKSkgewogICAgICAgICAgICBsb2dnZXIuZXJyb3IoZGVidWdNZXRob2QgKyAiSW52YWxpZCBzZXNzaW9uLiIpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHZhciBjb25maWdNYXAgPSBpZHBBdHRyaWJ1dGVNYXBwZXJTY3JpcHRIZWxwZXIuZ2V0UmVtb3RlU1BDb25maWdBdHRyaWJ1dGVNYXAocmVhbG0sIHJlbW90ZUVudGl0eUlkKTsKICAgICAgICBsb2dnZXIubWVzc2FnZShkZWJ1Z01ldGhvZCArICJSZW1vdGUgU1AgYXR0cmlidXRlIG1hcCA9IHt9IiwgY29uZmlnTWFwKTsKICAgICAgICBpZiAoY29uZmlnTWFwID09IG51bGwgfHwgY29uZmlnTWFwLmlzRW1wdHkoKSkgewogICAgICAgICAgICBjb25maWdNYXAgPSBpZHBBdHRyaWJ1dGVNYXBwZXJTY3JpcHRIZWxwZXIuZ2V0SG9zdGVkSURQQ29uZmlnQXR0cmlidXRlTWFwKHJlYWxtLCBob3N0ZWRFbnRpdHlJZCk7CiAgICAgICAgICAgIGlmIChjb25maWdNYXAgPT0gbnVsbCB8fCBjb25maWdNYXAuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICBsb2dnZXIubWVzc2FnZShkZWJ1Z01ldGhvZCArICJDb25maWd1cmF0aW9uIG1hcCBpcyBub3QgZGVmaW5lZC4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvZ2dlci5tZXNzYWdlKGRlYnVnTWV0aG9kICsgIkhvc3RlZCBJRFAgYXR0cmlidXRlIG1hcCA9IHt9IiwgY29uZmlnTWFwKTsKICAgICAgICB9CgogICAgICAgIHZhciBhdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKICAgICAgICB2YXIgc3RyaW5nVmFsdWVNYXAgPSBuZXcgamF2YS51dGlsLkhhc2hTZXQoKTsKICAgICAgICB2YXIgYmluYXJ5VmFsdWVNYXA7CiAgICAgICAgdmFyIGxvY2FsQXR0cmlidXRlOwoKICAgICAgICAvLyBEb24ndCB0cnkgdG8gcmVhZCB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSBkYXRhc3RvcmUgaWYgdGhlIGlnbm9yZWQgcHJvZmlsZSBpcyBlbmFibGVkIGluIHRoaXMgcmVhbG0uCiAgICAgICAgaWYgKCFpZHBBdHRyaWJ1dGVNYXBwZXJTY3JpcHRIZWxwZXIuaXNJZ25vcmVkUHJvZmlsZShzZXNzaW9uLCByZWFsbSkpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgYXR0cmlidXRlcyB0byBiZSByZWFkIGZyb20gdGhlIGRhdGFzdG9yZS4KICAgICAgICAgICAgICAgIHZhciBzdHJpbmdBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5IYXNoU2V0KCk7CiAgICAgICAgICAgICAgICB2YXIgYmluYXJ5QXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuSGFzaFNldCgpOwogICAgICAgICAgICAgICAgdmFyIGtleUl0ZXIgPSBjb25maWdNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKICAgICAgICAgICAgICAgIHdoaWxlIChrZXlJdGVyLmhhc05leHQoKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlJdGVyLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICBsb2NhbEF0dHJpYnV0ZSA9IGNvbmZpZ01hcC5nZXQoa2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlkcEF0dHJpYnV0ZU1hcHBlclNjcmlwdEhlbHBlci5pc1N0YXRpY0F0dHJpYnV0ZShsb2NhbEF0dHJpYnV0ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkcEF0dHJpYnV0ZU1hcHBlclNjcmlwdEhlbHBlci5pc0JpbmFyeUF0dHJpYnV0ZShsb2NhbEF0dHJpYnV0ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIHRvIHRyZWF0IGFzIGJlaW5nIGJpbmFyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5QXR0cmlidXRlcy5hZGQoaWRwQXR0cmlidXRlTWFwcGVyU2NyaXB0SGVscGVyLnJlbW92ZUJpbmFyeUF0dHJpYnV0ZUZsYWcobG9jYWxBdHRyaWJ1dGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0F0dHJpYnV0ZXMuYWRkKGxvY2FsQXR0cmlidXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXN0cmluZ0F0dHJpYnV0ZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWVNYXAgPSBpZHBBdHRyaWJ1dGVNYXBwZXJTY3JpcHRIZWxwZXIuZ2V0QXR0cmlidXRlcyhzZXNzaW9uLCBzdHJpbmdBdHRyaWJ1dGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghYmluYXJ5QXR0cmlidXRlcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICBiaW5hcnlWYWx1ZU1hcCA9IGlkcEF0dHJpYnV0ZU1hcHBlclNjcmlwdEhlbHBlci5nZXRCaW5hcnlBdHRyaWJ1dGVzKHNlc3Npb24sIGJpbmFyeUF0dHJpYnV0ZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGRlYnVnTWV0aG9kICsgIkVycm9yIGFjY2Vzc2luZyB0aGUgZGF0YXN0b3JlLiAiICsgZXJyb3IpOwogICAgICAgICAgICAgICAgLy9jb250aW51ZSB0byBjaGVjayBpbiBzc290b2tlbi4KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIGtleUl0ZXIgPSBjb25maWdNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKICAgICAgICB3aGlsZSAoa2V5SXRlci5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgdmFyIGtleSA9IGtleUl0ZXIubmV4dCgpCiAgICAgICAgICAgIHZhciBuYW1lRm9ybWF0ID0gbnVsbDsKICAgICAgICAgICAgdmFyIHNhbWxBdHRyaWJ1dGUgPSBrZXk7CiAgICAgICAgICAgIGxvY2FsQXR0cmlidXRlID0gY29uZmlnTWFwLmdldChrZXkpOwogICAgICAgICAgICAvLyBjaGVjayBpZiBzYW1sQXR0cmlidXRlIGhhcyBmb3JtYXQgbmFtZUZvcm1hdHxzYW1sQXR0cmlidXRlCiAgICAgICAgICAgIHZhciBzYW1sQXR0cmlidXRlcyA9IFN0cmluZyhuZXcgamF2YS5sYW5nLlN0cmluZyhzYW1sQXR0cmlidXRlKSk7CiAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzYW1sQXR0cmlidXRlcy5zcGxpdCgnfCcpOwoKICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICBuYW1lRm9ybWF0ID0gdG9rZW5zWzBdOwogICAgICAgICAgICAgICAgc2FtbEF0dHJpYnV0ZSA9IHRva2Vuc1sxXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZVZhbHVlcyA9IG5ldyBqYXZhLnV0aWwuSGFzaFNldCgpOwogICAgICAgICAgICBpZiAoaWRwQXR0cmlidXRlTWFwcGVyU2NyaXB0SGVscGVyLmlzU3RhdGljQXR0cmlidXRlKGxvY2FsQXR0cmlidXRlKSkgewogICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzdGF0aWMgZmxhZyBiZWZvcmUgdXNpbmcgaXQgYXMgdGhlIHN0YXRpYyB2YWx1ZQogICAgICAgICAgICAgICAgbG9jYWxBdHRyaWJ1dGUgPSBpZHBBdHRyaWJ1dGVNYXBwZXJTY3JpcHRIZWxwZXIucmVtb3ZlU3RhdGljQXR0cmlidXRlRmxhZyhsb2NhbEF0dHJpYnV0ZSk7CiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMgPSBuZXcgamF2YS51dGlsLkhhc2hTZXQoW2xvY2FsQXR0cmlidXRlXSk7CiAgICAgICAgICAgICAgICBsb2dnZXIubWVzc2FnZShkZWJ1Z01ldGhvZCArICJBZGRpbmcgc3RhdGljIHZhbHVlIHt9IGZvciBhdHRyaWJ1dGUgbmFtZWQge30iLCBsb2NhbEF0dHJpYnV0ZSwgc2FtbEF0dHJpYnV0ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoaWRwQXR0cmlidXRlTWFwcGVyU2NyaXB0SGVscGVyLmlzQmluYXJ5QXR0cmlidXRlKGxvY2FsQXR0cmlidXRlKSkgewogICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmxhZyBhcyBub3QgdXNlZCBmb3IgbG9va3VwCiAgICAgICAgICAgICAgICAgICAgbG9jYWxBdHRyaWJ1dGUgPSBpZHBBdHRyaWJ1dGVNYXBwZXJTY3JpcHRIZWxwZXIucmVtb3ZlQmluYXJ5QXR0cmlidXRlRmxhZyhsb2NhbEF0dHJpYnV0ZSk7CiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVzID0gaWRwQXR0cmlidXRlTWFwcGVyU2NyaXB0SGVscGVyLmdldEJpbmFyeUF0dHJpYnV0ZVZhbHVlcyhzYW1sQXR0cmlidXRlLCBsb2NhbEF0dHJpYnV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5VmFsdWVNYXApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nVmFsdWVNYXAgIT0gbnVsbCAmJiAhc3RyaW5nVmFsdWVNYXAuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlcyA9IHN0cmluZ1ZhbHVlTWFwLmdldChsb2NhbEF0dHJpYnV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoZGVidWdNZXRob2QgKyAie30gc3RyaW5nIHZhbHVlIG1hcCB3YXMgZW1wdHkgb3IgbnVsbC4iLCBsb2NhbEF0dHJpYnV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB0cnkgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSB1c2VycyBzc29Ub2tlbgogICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlcyA9PSBudWxsIHx8IGF0dHJpYnV0ZVZhbHVlcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICBsb2dnZXIubWVzc2FnZShkZWJ1Z01ldGhvZCArICJVc2VyIHByb2ZpbGUgZG9lcyBub3QgaGF2ZSB2YWx1ZSBmb3Ige30sIGNoZWNraW5nIFNTT1Rva2VuLiIsIGxvY2FsQXR0cmlidXRlKTsKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMgPSBuZXcgamF2YS51dGlsLkhhc2hTZXQoaWRwQXR0cmlidXRlTWFwcGVyU2NyaXB0SGVscGVyLmdldFByb3BlcnR5U2V0KHNlc3Npb24sIGxvY2FsQXR0cmlidXRlKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZXMgPT0gbnVsbCB8fCBhdHRyaWJ1dGVWYWx1ZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICBsb2dnZXIubWVzc2FnZShkZWJ1Z01ldGhvZCArICJ7fSBub3QgZm91bmQgaW4gdXNlciBwcm9maWxlIG9yIFNTT1Rva2VuLiIsIGxvY2FsQXR0cmlidXRlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKGlkcEF0dHJpYnV0ZU1hcHBlclNjcmlwdEhlbHBlci5jcmVhdGVTQU1MQXR0cmlidXRlKHNhbWxBdHRyaWJ1dGUsIG5hbWVGb3JtYXQsIGF0dHJpYnV0ZVZhbHVlcykpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKCiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGxvZ2dlci5lcnJvcihkZWJ1Z01ldGhvZCArICJFcnJvciBtYXBwaW5nIElEUCBhdHRyaWJ1dGVzLiAiICsgZXJyb3IpOwogICAgICAgIHRocm93IG5ldyBmckphdmEuU0FNTDJFeGNlcHRpb24oZXJyb3IpOwogICAgfQp9CgpnZXRBdHRyaWJ1dGVzKCk7\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"SAML2_IDP_ATTRIBUTE_MAPPER\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"3cb43516-ae69-433a-8787-501d45db14e9\",\"name\":\"debug\",\"description\":\"Display sharedState, transientState, and headers.\",\"script\":\"LyogZGVidWcKICoKICogQXV0aG9yOiB2b2xrZXIuc2NoZXViZXJAZm9yZ2Vyb2NrLmNvbQogKiAKICogRGlzcGxheSBzaGFyZWRTdGF0ZSwgdHJhbnNpZW50U3RhdGUsIGFuZCBoZWFkZXJzLgogKiAKICogVGhpcyBzY3JpcHQgZG9lcyBub3QgbmVlZCB0byBiZSBwYXJhbWV0cml6ZWQuIEl0IHdpbGwgd29yayBwcm9wZXJseSBhcyBpcy4KICogCiAqIFRoZSBTY3JpcHRlZCBEZWNpc2lvbiBOb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgb3V0Y29tZXMgZGVmaW5lZDoKICogLSB0cnVlCiAqLwp2YXIgYW5jaG9yID0gImFuY2hvci0iLmNvbmNhdChnZW5lcmF0ZU51bWVyaWNUb2tlbigneHh4JykpOwp2YXIgaGFsaWduID0gImxlZnQiOwp2YXIgbWVzc2FnZSA9ICI8cD48Yj5TaGFyZWQgU3RhdGU8L2I+Ojxici8+Ii5jb25jYXQoCiAgICAgIHNoYXJlZFN0YXRlLnRvU3RyaW5nKCkpLmNvbmNhdCgiPC9wPiIpLmNvbmNhdCgKICAgICI8cD48Yj5UcmFuc2llbnQgU3RhdGU8L2I+Ojxici8+IikuY29uY2F0KAogICAgICB0cmFuc2llbnRTdGF0ZS50b1N0cmluZygpKS5jb25jYXQoIjwvcD4iKS5jb25jYXQoCiAgICAiPHA+PGI+UmVxdWVzdCBIZWFkZXJzPC9iPjo8YnIvPiIpLmNvbmNhdCgKICAgICAgcmVxdWVzdEhlYWRlcnMudG9TdHJpbmcoKSkuY29uY2F0KCI8L3A+IikKdmFyIHNjcmlwdCA9ICJBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChcbiIuY29uY2F0KAogICJkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjYWxsYmFjay1jb21wb25lbnQnKSkuZm9yRWFjaChcbiIpLmNvbmNhdCgKICAiZnVuY3Rpb24gKGUpIHtcbiIpLmNvbmNhdCgKICAiICB2YXIgbWVzc2FnZSA9IGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG4iKS5jb25jYXQoCiAgIiAgaWYgKG1lc3NhZ2UuZmlyc3RDaGlsZCAmJiBtZXNzYWdlLmZpcnN0Q2hpbGQubm9kZU5hbWUgPT0gJyN0ZXh0JyAmJiBtZXNzYWdlLmZpcnN0Q2hpbGQubm9kZVZhbHVlLnRyaW0oKSA9PSAnIikuY29uY2F0KGFuY2hvcikuY29uY2F0KCInKSB7XG4iKS5jb25jYXQoCiAgIiAgICBtZXNzYWdlLmNsYXNzTmFtZSA9IFwidGV4dC1sZWZ0XCI7XG4iKS5jb25jYXQoCiAgIiAgICBtZXNzYWdlLmFsaWduID0gXCIiKS5jb25jYXQoaGFsaWduKS5jb25jYXQoIlwiO1xuIikuY29uY2F0KAogICIgICAgbWVzc2FnZS5pbm5lckhUTUwgPSAnIikuY29uY2F0KG1lc3NhZ2UpLmNvbmNhdCgiJztcbiIpLmNvbmNhdCgKICAiICB9XG4iKS5jb25jYXQoCiAgIn0pIikKdmFyIGZyID0gSmF2YUltcG9ydGVyKAogICAgb3JnLmZvcmdlcm9jay5vcGVuYW0uYXV0aC5ub2RlLmFwaS5BY3Rpb24sCiAgICBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLlRleHRPdXRwdXRDYWxsYmFjaywKICAgIGNvbS5zdW4uaWRlbnRpdHkuYXV0aGVudGljYXRpb24uY2FsbGJhY2tzLlNjcmlwdFRleHRPdXRwdXRDYWxsYmFjawopCmlmIChtZXNzYWdlLmxlbmd0aCAmJiBjYWxsYmFja3MuaXNFbXB0eSgpKSB7CiAgICBhY3Rpb24gPSBmci5BY3Rpb24uc2VuZCgKICAgICAgICBuZXcgZnIuVGV4dE91dHB1dENhbGxiYWNrKAogICAgICAgICAgICBmci5UZXh0T3V0cHV0Q2FsbGJhY2suSU5GT1JNQVRJT04sCiAgICAgICAgICAgIGFuY2hvcgogICAgICAgICksCiAgICAgICAgbmV3IGZyLlNjcmlwdFRleHRPdXRwdXRDYWxsYmFjayhzY3JpcHQpCiAgICApLmJ1aWxkKCkKfQplbHNlIHsKICBhY3Rpb24gPSBmci5BY3Rpb24uZ29UbygidHJ1ZSIpLmJ1aWxkKCk7Cn0KCiAvKgogICogR2VuZXJhdGUgYSB0b2tlbiBpbiB0aGUgZGVzaXJlZCBmb3JtYXQuIEFsbCAneCcgY2hhcmFjdGVycyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSByYW5kb20gbnVtYmVyIDAtOS4KICAqIAogICogRXhhbXBsZToKICAqICd4eHh4eCcgcHJvZHVjZXMgJzI4NTM1JwogICogJ3h4eC14eHgnIHByb2R1Y2VzICc0MzItNTIxJwogICovCmZ1bmN0aW9uIGdlbmVyYXRlTnVtZXJpY1Rva2VuKGZvcm1hdCkgewogICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC9beF0vZywgZnVuY3Rpb24oYykgewogICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSoxMHwwOwogICAgICAgIHZhciB2ID0gcjsKICAgICAgICByZXR1cm4gdi50b1N0cmluZygxMCk7CiAgICB9KTsKfQ==\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"1244e639-4a31-401d-ab61-d75133d8dc9e\",\"name\":\"Instagram Profile Normalization\",\"description\":\"Normalizes raw profile data from Instagram\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLmlkKSwKICAgICAgICBmaWVsZCgidXNlcm5hbWUiLCByYXdQcm9maWxlLnVzZXJuYW1lKSkp\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"8e298710-b55e-4085-a464-88a375a4004b\",\"name\":\"Twitter Profile Normalization\",\"description\":\"Normalizes raw profile data from Twitter\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLmlkX3N0ciksCiAgICAgICAgZmllbGQoImRpc3BsYXlOYW1lIiwgcmF3UHJvZmlsZS5uYW1lKSwKICAgICAgICBmaWVsZCgicGhvdG9VcmwiLCByYXdQcm9maWxlLnByb2ZpbGVfaW1hZ2VfdXJsKSwKICAgICAgICBmaWVsZCgiZW1haWwiLCByYXdQcm9maWxlLmVtYWlsKSwKICAgICAgICBmaWVsZCgidXNlcm5hbWUiLCByYXdQcm9maWxlLnNjcmVlbl9uYW1lKSkp\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"91d197de-5916-4dca-83b5-9a4df26e7159\",\"name\":\"WordPress Profile Normalization\",\"description\":\"Normalizes raw profile data from WordPress\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLnVzZXJuYW1lKSwKICAgICAgICBmaWVsZCgiZGlzcGxheU5hbWUiLCByYXdQcm9maWxlLmRpc3BsYXlfbmFtZSksCiAgICAgICAgZmllbGQoInBob3RvVXJsIiwgcmF3UHJvZmlsZS5hdmF0YXJfVVJMKSwKICAgICAgICBmaWVsZCgiZW1haWwiLCByYXdQcm9maWxlLmVtYWlsKSwKICAgICAgICBmaWVsZCgidXNlcm5hbWUiLCByYXdQcm9maWxlLnVzZXJuYW1lKSkp\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"e232cff3-2460-47cd-80b2-36c86c0d0f06\",\"name\":\"Alpha endUserUIClient OAuth2 Access Token Modification Script\",\"description\":\"Used by endUserUIClient\",\"script\":\"KGZ1bmN0aW9uICgpIHsKICBpZiAoc2NvcGVzLmNvbnRhaW5zKCdmcjphdXRvYWNjZXNzOionKSB8fCBzY29wZXMuY29udGFpbnMoJ2ZyOmlnYToqJykgfHwgc2NvcGVzLmNvbnRhaW5zKCdmcjppZGM6YW5hbHl0aWNzOionKSkgewogICAgdmFyIGZyID0gSmF2YUltcG9ydGVyKAogICAgICBjb20uc3VuLmlkZW50aXR5LmlkbS5JZFR5cGUKICAgICk7CiAgICB2YXIgZ3JvdXBzID0gW107CiAgICBpZGVudGl0eS5nZXRNZW1iZXJzaGlwcyhmci5JZFR5cGUuR1JPVVApLnRvQXJyYXkoKS5mb3JFYWNoKGZ1bmN0aW9uIChncm91cCkgewogICAgICBncm91cHMucHVzaChncm91cC5nZXRBdHRyaWJ1dGUoJ2NuJykudG9BcnJheSgpWzBdKTsKICAgIH0pOwogICAgYWNjZXNzVG9rZW4uc2V0RmllbGQoJ2dyb3VwcycsIGdyb3Vwcyk7CiAgfQp9KCkpOwo=\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"OAUTH2_ACCESS_TOKEN_MODIFICATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"703dab1a-1921-4981-98dd-b8e5349d8548\",\"name\":\"Device Id (Match) - Server Side\",\"description\":\"Default global script for server side Device Id (Match) Authentication Module\",\"script\":\"LyoKICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICoKICogQ29weXJpZ2h0IChjKSAyMDA5IFN1biBNaWNyb3N5c3RlbXMgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zCiAqIG9mIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlCiAqICh0aGUgTGljZW5zZSkuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCiAqIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICoKICogWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHBzOi8vb3BlbnNzby5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwgb3IKICogb3BlbnNzby9sZWdhbC9DRERMdjEuMC50eHQKICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCiAqIHBlcm1pc3Npb24gYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiBXaGVuIGRpc3RyaWJ1dGluZyBDb3ZlcmVkIENvZGUsIGluY2x1ZGUgdGhpcyBDRERMCiAqIEhlYWRlciBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUKICogYXQgb3BlbnNzby9sZWdhbC9DRERMdjEuMC50eHQuCiAqIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBDRERMIEhlYWRlciwKICogd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdIHJlcGxhY2VkIGJ5CiAqIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgogKiAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCiAqCiAqLwovKgogKiBQb3J0aW9ucyBDb3B5cmlnaHRlZCAyMDEzIFN5bnRlZ3JpdHkuCiAqIFBvcnRpb25zIENvcHlyaWdodGVkIDIwMTMtMjAyMyBGb3JnZVJvY2sgQVMuCiAqLwoKdmFyIFNjYWxhckNvbXBhcmF0b3IgPSB7fSwgU2NyZWVuQ29tcGFyYXRvciA9IHt9LCBNdWx0aVZhbHVlQ29tcGFyYXRvciA9IHt9LCBVc2VyQWdlbnRDb21wYXJhdG9yID0ge30sIEdlb2xvY2F0aW9uQ29tcGFyYXRvciA9IHt9OwoKdmFyIGNvbmZpZyA9IHsKICAgIHByb2ZpbGVFeHBpcmF0aW9uOiAzMCwgICAgICAgICAgICAgIC8vaW4gZGF5cwogICAgbWF4UHJvZmlsZXNBbGxvd2VkOiA1LAogICAgbWF4UGVuYWx0eVBvaW50czogMCwKICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBzY3JlZW46IHsKICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICAgIGNvbXBhcmF0b3I6IFNjcmVlbkNvbXBhcmF0b3IsCiAgICAgICAgICAgIGFyZ3M6IHsKICAgICAgICAgICAgICAgIHBlbmFsdHlQb2ludHM6IDUwCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHBsdWdpbnM6IHsKICAgICAgICAgICAgaW5zdGFsbGVkUGx1Z2luczogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgY29tcGFyYXRvcjogTXVsdGlWYWx1ZUNvbXBhcmF0b3IsCiAgICAgICAgICAgICAgICBhcmdzOiB7CiAgICAgICAgICAgICAgICAgICAgbWF4UGVyY2VudGFnZURpZmZlcmVuY2U6IDEwLAogICAgICAgICAgICAgICAgICAgIG1heERpZmZlcmVuY2VzOiA1LAogICAgICAgICAgICAgICAgICAgIHBlbmFsdHlQb2ludHM6IDEwMAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBmb250czogewogICAgICAgICAgICBpbnN0YWxsZWRGb250czogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgY29tcGFyYXRvcjogTXVsdGlWYWx1ZUNvbXBhcmF0b3IsCiAgICAgICAgICAgICAgICBhcmdzOiB7CiAgICAgICAgICAgICAgICAgICAgbWF4UGVyY2VudGFnZURpZmZlcmVuY2U6IDEwLAogICAgICAgICAgICAgICAgICAgIG1heERpZmZlcmVuY2VzOiA1LAogICAgICAgICAgICAgICAgICAgIHBlbmFsdHlQb2ludHM6IDEwMAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB0aW1lem9uZTogewogICAgICAgICAgICB0aW1lem9uZTogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgY29tcGFyYXRvcjogU2NhbGFyQ29tcGFyYXRvciwKICAgICAgICAgICAgICAgIGFyZ3M6IHsKICAgICAgICAgICAgICAgICAgICBwZW5hbHR5UG9pbnRzOiAxMDAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgdXNlckFnZW50OiB7CiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgICBjb21wYXJhdG9yOiBVc2VyQWdlbnRDb21wYXJhdG9yLAogICAgICAgICAgICBhcmdzOiB7CiAgICAgICAgICAgICAgICBpZ25vcmVWZXJzaW9uOiB0cnVlLAogICAgICAgICAgICAgICAgcGVuYWx0eVBvaW50czogMTAwCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGdlb2xvY2F0aW9uOiB7CiAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKICAgICAgICAgICAgY29tcGFyYXRvcjogR2VvbG9jYXRpb25Db21wYXJhdG9yLAogICAgICAgICAgICBhcmdzOiB7CiAgICAgICAgICAgICAgICBhbGxvd2VkUmFuZ2U6IDEwMCwgICAgICAgICAgICAvL2luIG1pbGVzCiAgICAgICAgICAgICAgICBwZW5hbHR5UG9pbnRzOiAxMDAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJhdG9yIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCgp2YXIgYWxsLCBhbnksIGNhbGN1bGF0ZURpc3RhbmNlLCBjYWxjdWxhdGVJbnRlcnNlY3Rpb24sIGNhbGN1bGF0ZVBlcmNlbnRhZ2UsIG51bGxPclVuZGVmaW5lZCwgc3BsaXRBbmRUcmltLAogICAgdW5kZWZpbmVkTG9jYXRpb247CgovLyBDb21wYXJpc29uUmVzdWx0CgovKioKICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiBhIENvbXBhcmlzb25SZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gcGVuYWx0eSBwb2ludHMuCiAqCiAqIEBwYXJhbSBwZW5hbHR5UG9pbnRzIChOdW1iZXIpIFRoZSBwZW5hbHR5IHBvaW50cyBmb3IgdGhlIGNvbXBhcmlzb24gKGRlZmF1bHRzIHRvIDApLgogKiBAcGFyYW0gYWRkaXRpb25hbEluZm9JbkN1cnJlbnRWYWx1ZSAoYm9vbGVhbikgV2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBjb250YWlucyBtb3JlIGluZm9ybWF0aW9uCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHRoZSBzdG9yZWQgdmFsdWUgKGRlZmF1bHRzIHRvIGZhbHNlKS4KICovCmZ1bmN0aW9uIENvbXBhcmlzb25SZXN1bHQoKSB7CgogICAgdmFyIHBlbmFsdHlQb2ludHMgPSAwLAogICAgICAgIGFkZGl0aW9uYWxJbmZvSW5DdXJyZW50VmFsdWUgPSBmYWxzZTsKCiAgICBpZiAoYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBwZW5hbHR5UG9pbnRzID0gYXJndW1lbnRzWzBdOwogICAgICAgIGFkZGl0aW9uYWxJbmZvSW5DdXJyZW50VmFsdWUgPSBhcmd1bWVudHNbMV07CiAgICB9CgogICAgaWYgKGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkICYmIGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgaWYgKHR5cGVvZihhcmd1bWVudHNbMF0pID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgYWRkaXRpb25hbEluZm9JbkN1cnJlbnRWYWx1ZSA9IGFyZ3VtZW50c1swXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwZW5hbHR5UG9pbnRzID0gYXJndW1lbnRzWzBdOwogICAgICAgIH0KICAgIH0KCiAgICB0aGlzLnBlbmFsdHlQb2ludHMgPSBwZW5hbHR5UG9pbnRzOwogICAgdGhpcy5hZGRpdGlvbmFsSW5mb0luQ3VycmVudFZhbHVlID0gYWRkaXRpb25hbEluZm9JbkN1cnJlbnRWYWx1ZTsKCn0KCkNvbXBhcmlzb25SZXN1bHQuWkVST19QRU5BTFRZX1BPSU5UUyA9IG5ldyBDb21wYXJpc29uUmVzdWx0KDApOwoKLyoqCiAqIFN0YXRpYyBtZXRob2QgZm9yIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcuCiAqCiAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNvbXBhcmlzb25SZXN1bHQuaXNTdWNjZXNzZnVsKCkuCiAqLwpDb21wYXJpc29uUmVzdWx0LmlzU3VjY2Vzc2Z1bCA9ICBmdW5jdGlvbihjb21wYXJpc29uUmVzdWx0KSB7CiAgICByZXR1cm4gY29tcGFyaXNvblJlc3VsdC5pc1N1Y2Nlc3NmdWwoKTsKfTsKCgovKioKICogU3RhdGljIG1ldGhvZCBmb3IgZnVuY3Rpb25hbCBwcm9ncmFtbWluZy4KICoKICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY29tcGFyaXNvblJlc3VsdC5hZGRpdGlvbmFsSW5mb0luQ3VycmVudFZhbHVlLgogKi8KQ29tcGFyaXNvblJlc3VsdC5hZGRpdGlvbmFsSW5mb0luQ3VycmVudFZhbHVlID0gIGZ1bmN0aW9uKGNvbXBhcmlzb25SZXN1bHQpIHsKICAgIHJldHVybiBjb21wYXJpc29uUmVzdWx0LmFkZGl0aW9uYWxJbmZvSW5DdXJyZW50VmFsdWU7Cn07CgovKioKICogQ29tcGFyaXNvbiBmdW5jdGlvbiB0aGF0IGNhbiBiZSBwcm92aWRlZCBhcyBhbiBhcmd1bWVudCB0byBhcnJheS5zb3J0CiAqLwpDb21wYXJpc29uUmVzdWx0LmNvbXBhcmUgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKSB7CiAgICBpZiAobnVsbE9yVW5kZWZpbmVkKGZpcnN0KSAmJiBudWxsT3JVbmRlZmluZWQoc2Vjb25kKSkgewogICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIGlmIChudWxsT3JVbmRlZmluZWQoZmlyc3QpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfSBlbHNlIGlmIChudWxsT3JVbmRlZmluZWQoc2Vjb25kKSkgewogICAgICAgIHJldHVybiAxOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoZmlyc3QucGVuYWx0eVBvaW50cyAhPT0gc2Vjb25kLnBlbmFsdHlQb2ludHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZpcnN0LnBlbmFsdHlQb2ludHMgLSBzZWNvbmQucGVuYWx0eVBvaW50czsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gKGZpcnN0LmFkZGl0aW9uYWxJbmZvSW5DdXJyZW50VmFsdWUgPyAxIDogMCkgLSAoc2Vjb25kLmFkZGl0aW9uYWxJbmZvSW5DdXJyZW50VmFsdWUgPyAxIDogMCk7CiAgICAgICAgfQogICAgfQp9OwoKLyoqCiAqIEFtYWxnYW1hdGVzIHRoZSBnaXZlbiBDb21wYXJpc29uUmVzdWx0IGludG8gdGhpcyBDb21wYXJpc29uUmVzdWx0LgogKgogKiBAcGFyYW0gY29tcGFyaXNvblJlc3VsdCBUaGUgQ29tcGFyaXNvblJlc3VsdCB0byBpbmNsdWRlLgogKi8KQ29tcGFyaXNvblJlc3VsdC5wcm90b3R5cGUuYWRkQ29tcGFyaXNvblJlc3VsdCA9IGZ1bmN0aW9uKGNvbXBhcmlzb25SZXN1bHQpIHsKICAgIHRoaXMucGVuYWx0eVBvaW50cyArPSBjb21wYXJpc29uUmVzdWx0LnBlbmFsdHlQb2ludHM7CiAgICBpZiAoY29tcGFyaXNvblJlc3VsdC5hZGRpdGlvbmFsSW5mb0luQ3VycmVudFZhbHVlKSB7CiAgICAgICAgdGhpcy5hZGRpdGlvbmFsSW5mb0luQ3VycmVudFZhbHVlID0gY29tcGFyaXNvblJlc3VsdC5hZGRpdGlvbmFsSW5mb0luQ3VycmVudFZhbHVlOwogICAgfQp9OwoKLyoqCiAqIFJldHVybnMgdHJ1ZSBpZiBubyBwZW5hbHR5IHBvaW50cyBoYXZlIGJlZW4gYXNzaWduZWQgZm9yIHRoZSBjb21wYXJpc29uLgogKgogKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgY29tcGFyaXNvbiB3YXMgc3VjY2Vzc2Z1bC4KICovCkNvbXBhcmlzb25SZXN1bHQucHJvdG90eXBlLmlzU3VjY2Vzc2Z1bCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIG51bGxPclVuZGVmaW5lZCh0aGlzLnBlbmFsdHlQb2ludHMpIHx8IHRoaXMucGVuYWx0eVBvaW50cyA9PT0gMDsKfTsKCi8qKgogKiBDb21wYXJlcyB0d28gc2ltcGxlIG9iamVjdHMgKFN0cmluZ3xOdW1iZXIpIGFuZCBpZiB0aGV5IGFyZSBlcXVhbCB0aGVuIHJldHVybnMgYSBDb21wYXJpc29uUmVzdWx0IHdpdGggemVybwogKiBwZW5hbHR5IHBvaW50cyBhc3NpZ25lZCwgb3RoZXJ3aXNlIHJldHVybnMgYSBDb21wYXJpc29uUmVzdWx0IHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBwZW5hbHR5IHBvaW50cyBhc3NpZ25lZC4KICoKICogQHBhcmFtIGN1cnJlbnRWYWx1ZSAoU3RyaW5nfE51bWJlcikgVGhlIGN1cnJlbnQgdmFsdWUuCiAqIEBwYXJhbSBzdG9yZWRWYWx1ZSAoU3RyaW5nfE51bWJlcikgVGhlIHN0b3JlZCB2YWx1ZS4KICogQHBhcmFtIGNvbmZpZzogewogKiAgICAgICAgICAgICJwZW5hbHR5UG9pbnRzIjogKE51bWJlcikgVGhlIG51bWJlciBvZiBwZW5hbHR5IHBvaW50cy4KICogICAgICAgIH0KICogQHJldHVybiBDb21wYXJpc29uUmVzdWx0LgogKi8KU2NhbGFyQ29tcGFyYXRvci5jb21wYXJlID0gZnVuY3Rpb24gKGN1cnJlbnRWYWx1ZSwgc3RvcmVkVmFsdWUsIGNvbmZpZykgewogICAgaWYgKGxvZ2dlci5tZXNzYWdlRW5hYmxlZCgpKSB7CiAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoIlN0cmluZ0NvbXBhcmF0b3IuY29tcGFyZTpjdXJyZW50VmFsdWU6ICIgKyBKU09OLnN0cmluZ2lmeShjdXJyZW50VmFsdWUpKTsKICAgICAgICBsb2dnZXIubWVzc2FnZSgiU3RyaW5nQ29tcGFyYXRvci5jb21wYXJlOnN0b3JlZFZhbHVlOiAiICsgSlNPTi5zdHJpbmdpZnkoc3RvcmVkVmFsdWUpKTsKICAgICAgICBsb2dnZXIubWVzc2FnZSgiU3RyaW5nQ29tcGFyYXRvci5jb21wYXJlOmNvbmZpZzogIiArIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpOwogICAgfQogICAgaWYgKGNvbmZpZy5wZW5hbHR5UG9pbnRzID09PSAwKSB7CiAgICAgICAgcmV0dXJuIENvbXBhcmlzb25SZXN1bHQuWkVST19QRU5BTFRZX1BPSU5UUzsKICAgIH0KCiAgICBpZiAoIW51bGxPclVuZGVmaW5lZChzdG9yZWRWYWx1ZSkpIHsKICAgICAgICBpZiAobnVsbE9yVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgfHwgY3VycmVudFZhbHVlICE9PSBzdG9yZWRWYWx1ZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhcmlzb25SZXN1bHQoY29uZmlnLnBlbmFsdHlQb2ludHMpOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoIW51bGxPclVuZGVmaW5lZChjdXJyZW50VmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIG5ldyBDb21wYXJpc29uUmVzdWx0KHRydWUpOwogICAgfQoKICAgIHJldHVybiBDb21wYXJpc29uUmVzdWx0LlpFUk9fUEVOQUxUWV9QT0lOVFM7Cn07CgovKioKICogQ29tcGFyZXMgdHdvIHNjcmVlbnMgYW5kIGlmIHRoZXkgYXJlIGVxdWFsIHRoZW4gcmV0dXJucyBhIENvbXBhcmlzb25SZXN1bHQgd2l0aCB6ZXJvIHBlbmFsdHkgcG9pbnRzIGFzc2lnbmVkLAogKiBvdGhlcndpc2UgcmV0dXJucyBhIENvbXBhcmlzb25SZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHBlbmFsdHkgcG9pbnRzIGFzc2lnbmVkLgogKgogKiBAcGFyYW0gY3VycmVudFZhbHVlOiB7CiAqICAgICAgICAgICAgInNjcmVlbldpZHRoIjogKE51bWJlcikgVGhlIGN1cnJlbnQgY2xpZW50IHNjcmVlbiB3aWR0aC4KICogICAgICAgICAgICAic2NyZWVuSGVpZ2h0IjogKE51bWJlcikgVGhlIGN1cnJlbnQgY2xpZW50IHNjcmVlbiBoZWlnaHQuCiAqICAgICAgICAgICAgInNjcmVlbkNvbG91ckRlcHRoIjogKE51bWJlcikgVGhlIGN1cnJlbnQgY2xpZW50IHNjcmVlbiBjb2xvdXIgZGVwdGguCiAqICAgICAgICB9CiAqIEBwYXJhbSBzdG9yZWRWYWx1ZTogewogKiAgICAgICAgICAgICJzY3JlZW5XaWR0aCI6IChOdW1iZXIpIFRoZSBzdG9yZWQgY2xpZW50IHNjcmVlbiB3aWR0aC4KICogICAgICAgICAgICAic2NyZWVuSGVpZ2h0IjogKE51bWJlcikgVGhlIHN0b3JlZCBjbGllbnQgc2NyZWVuIGhlaWdodC4KICogICAgICAgICAgICAic2NyZWVuQ29sb3VyRGVwdGgiOiAoTnVtYmVyKSBUaGUgc3RvcmVkIGNsaWVudCBzY3JlZW4gY29sb3VyIGRlcHRoLgogKiAgICAgICAgfQogKiBAcGFyYW0gY29uZmlnOiB7CiAqICAgICAgICAgICAgInBlbmFsdHlQb2ludHMiOiAoTnVtYmVyKSBUaGUgbnVtYmVyIG9mIHBlbmFsdHkgcG9pbnRzLgogKiAgICAgICAgfQogKiBAcmV0dXJuIENvbXBhcmlzb25SZXN1bHQKICovClNjcmVlbkNvbXBhcmF0b3IuY29tcGFyZSA9IGZ1bmN0aW9uIChjdXJyZW50VmFsdWUsIHN0b3JlZFZhbHVlLCBjb25maWcpIHsKICAgIGlmIChsb2dnZXIubWVzc2FnZUVuYWJsZWQoKSkgewogICAgICAgIGxvZ2dlci5tZXNzYWdlKCJTY3JlZW5Db21wYXJhdG9yLmNvbXBhcmU6Y3VycmVudFZhbHVlOiAiICsgSlNPTi5zdHJpbmdpZnkoY3VycmVudFZhbHVlKSk7CiAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoIlNjcmVlbkNvbXBhcmF0b3IuY29tcGFyZTpzdG9yZWRWYWx1ZTogIiArIEpTT04uc3RyaW5naWZ5KHN0b3JlZFZhbHVlKSk7CiAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoIlNjcmVlbkNvbXBhcmF0b3IuY29tcGFyZTpjb25maWc6ICIgKyBKU09OLnN0cmluZ2lmeShjb25maWcpKTsKICAgIH0KCiAgICBpZiAobnVsbE9yVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkpIHsKICAgICAgICBjdXJyZW50VmFsdWUgPSB7c2NyZWVuV2lkdGg6IG51bGwsIHNjcmVlbkhlaWdodDogbnVsbCwgc2NyZWVuQ29sb3VyRGVwdGg6IG51bGx9OwogICAgfQogICAgaWYgKG51bGxPclVuZGVmaW5lZChzdG9yZWRWYWx1ZSkpIHsKICAgICAgICBzdG9yZWRWYWx1ZSA9IHtzY3JlZW5XaWR0aDogbnVsbCwgc2NyZWVuSGVpZ2h0OiBudWxsLCBzY3JlZW5Db2xvdXJEZXB0aDogbnVsbH07CiAgICB9CgogICAgdmFyIGNvbXBhcmlzb25SZXN1bHRzID0gWwogICAgICAgIFNjYWxhckNvbXBhcmF0b3IuY29tcGFyZShjdXJyZW50VmFsdWUuc2NyZWVuV2lkdGgsIHN0b3JlZFZhbHVlLnNjcmVlbldpZHRoLCBjb25maWcpLAogICAgICAgIFNjYWxhckNvbXBhcmF0b3IuY29tcGFyZShjdXJyZW50VmFsdWUuc2NyZWVuSGVpZ2h0LCBzdG9yZWRWYWx1ZS5zY3JlZW5IZWlnaHQsIGNvbmZpZyksCiAgICAgICAgU2NhbGFyQ29tcGFyYXRvci5jb21wYXJlKGN1cnJlbnRWYWx1ZS5zY3JlZW5Db2xvdXJEZXB0aCwgc3RvcmVkVmFsdWUuc2NyZWVuQ29sb3VyRGVwdGgsIGNvbmZpZyldOwoKICAgIGlmIChhbGwoY29tcGFyaXNvblJlc3VsdHMsIENvbXBhcmlzb25SZXN1bHQuaXNTdWNjZXNzZnVsKSkgewogICAgICAgIHJldHVybiBuZXcgQ29tcGFyaXNvblJlc3VsdChhbnkoY29tcGFyaXNvblJlc3VsdHMsIENvbXBhcmlzb25SZXN1bHQuYWRkaXRpb25hbEluZm9JbkN1cnJlbnRWYWx1ZSkpOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IENvbXBhcmlzb25SZXN1bHQoY29uZmlnLnBlbmFsdHlQb2ludHMpOwogICAgfQp9OwoKLyoqCiAqIFNwbGl0cyBib3RoIHZhbHVlcyB1c2luZyBkZWxpbWl0ZXIsIHRyaW1zIGV2ZXJ5IHZhbHVlIGFuZCBjb21wYXJlcyBjb2xsZWN0aW9ucyBvZiB2YWx1ZXMuCiAqIFJldHVybnMgemVyby1yZXN1bHQgZm9yIHNhbWUgbXVsdGktdmFsdWUgYXR0cmlidXRlcy4KICoKICogSWYgY29sbGVjdGlvbnMgYXJlIG5vdCBzYW1lIGNoZWNrcyBpZiBudW1iZXIgb2YgZGlmZmVyZW5jZXMgaXMgbGVzcyBvciBlcXVhbCBtYXhEaWZmZXJlbmNlcyBvcgogKiBwZXJjZW50YWdlIG9mIGRpZmZlcmVuY2UgaXMgbGVzcyBvciBlcXVhbCBtYXhQZXJjZW50YWdlRGlmZmVyZW5jZS4KICoKICogSWYgeWVzIHRoZW4gcmV0dXJucyB6ZXJvLXJlc3VsdCB3aXRoIGFkZGl0aW9uYWwgaW5mbywgZWxzZSByZXR1cm5zIHBlbmFsdHlQb2ludHMtcmVzdWx0LgogKgogKiBAcGFyYW0gY3VycmVudFZhbHVlOiAoU3RyaW5nKSBUaGUgY3VycmVudCB2YWx1ZS4KICogQHBhcmFtIHN0b3JlZFZhbHVlOiAoU3RyaW5nKSBUaGUgc3RvcmVkIHZhbHVlLgogKiBAcGFyYW0gY29uZmlnOiB7CiAqICAgICAgICAgICAgIm1heFBlcmNlbnRhZ2VEaWZmZXJlbmNlIjogKE51bWJlcikgVGhlIG1heCBkaWZmZXJlbmNlIHBlcmNlbnRhZ2UgaW4gdGhlIHZhbHVlcywKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIHBlbmFsdHkgaXMgYXNzaWduZWQuCiAqICAgICAgICAgICAgIm1heERpZmZlcmVuY2VzIjogKE51bWJlcikgVGhlIG1heCBudW1iZXIgb2YgZGlmZmVyZW5jZXMgaW4gdGhlIHZhbHVlcywKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIHBlbmFsdHkgcG9pbnRzIGFyZSBhc3NpZ25lZC4KICogICAgICAgICAgICAicGVuYWx0eVBvaW50cyI6IChOdW1iZXIpIFRoZSBudW1iZXIgb2YgcGVuYWx0eSBwb2ludHMuCiAgKiAgICAgICAgfQogKiBAcmV0dXJuIENvbXBhcmlzb25SZXN1bHQKICovCk11bHRpVmFsdWVDb21wYXJhdG9yLmNvbXBhcmUgPSBmdW5jdGlvbiAoY3VycmVudFZhbHVlLCBzdG9yZWRWYWx1ZSwgY29uZmlnKSB7CiAgICBpZiAobG9nZ2VyLm1lc3NhZ2VFbmFibGVkKCkpIHsKICAgICAgICBsb2dnZXIubWVzc2FnZSgiTXVsdGlWYWx1ZUNvbXBhcmF0b3IuY29tcGFyZTpjdXJyZW50VmFsdWU6ICIgKyBKU09OLnN0cmluZ2lmeShjdXJyZW50VmFsdWUpKTsKICAgICAgICBsb2dnZXIubWVzc2FnZSgiTXVsdGlWYWx1ZUNvbXBhcmF0b3IuY29tcGFyZTpzdG9yZWRWYWx1ZTogIiArIEpTT04uc3RyaW5naWZ5KHN0b3JlZFZhbHVlKSk7CiAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoIk11bHRpVmFsdWVDb21wYXJhdG9yLmNvbXBhcmU6Y29uZmlnOiAiICsgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7CiAgICB9CgogICAgdmFyIGRlbGltaXRlciA9ICI7IiwKICAgICAgICBjdXJyZW50VmFsdWVzID0gc3BsaXRBbmRUcmltKGN1cnJlbnRWYWx1ZSwgZGVsaW1pdGVyKSwKICAgICAgICBzdG9yZWRWYWx1ZXMgPSBzcGxpdEFuZFRyaW0oc3RvcmVkVmFsdWUsIGRlbGltaXRlciksCiAgICAgICAgbWF4TnVtYmVyT2ZFbGVtZW50cyA9IE1hdGgubWF4KGN1cnJlbnRWYWx1ZXMubGVuZ3RoLCBzdG9yZWRWYWx1ZXMubGVuZ3RoKSwKICAgICAgICBudW1iZXJPZlRoZVNhbWVFbGVtZW50cyA9IGNhbGN1bGF0ZUludGVyc2VjdGlvbihjdXJyZW50VmFsdWVzLCBzdG9yZWRWYWx1ZXMpLmxlbmd0aCwKICAgICAgICBudW1iZXJPZkRpZmZlcmVuY2VzID0gbWF4TnVtYmVyT2ZFbGVtZW50cyAtIG51bWJlck9mVGhlU2FtZUVsZW1lbnRzLAogICAgICAgIHBlcmNlbnRhZ2VPZkRpZmZlcmVuY2VzID0gY2FsY3VsYXRlUGVyY2VudGFnZShudW1iZXJPZkRpZmZlcmVuY2VzLCBtYXhOdW1iZXJPZkVsZW1lbnRzKTsKCiAgICBpZiAobnVsbE9yVW5kZWZpbmVkKHN0b3JlZFZhbHVlKSAmJiAhbnVsbE9yVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkpIHsKICAgICAgICByZXR1cm4gbmV3IENvbXBhcmlzb25SZXN1bHQodHJ1ZSk7CiAgICB9CgogICAgaWYgKGxvZ2dlci5tZXNzYWdlRW5hYmxlZCgpKSB7CiAgICAgICAgbG9nZ2VyLm1lc3NhZ2UobnVtYmVyT2ZUaGVTYW1lRWxlbWVudHMgKyAiIG9mICIgKyBtYXhOdW1iZXJPZkVsZW1lbnRzICsgIiBhcmUgc2FtZSIpOwogICAgfQoKICAgIGlmIChtYXhOdW1iZXJPZkVsZW1lbnRzID09PSAwKSB7CiAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoIklnbm9yZWQgYmVjYXVzZSBubyBhdHRyaWJ1dGVzIGZvdW5kIGluIGJvdGggcHJvZmlsZXMiKTsKICAgICAgICByZXR1cm4gQ29tcGFyaXNvblJlc3VsdC5aRVJPX1BFTkFMVFlfUE9JTlRTOwogICAgfQoKICAgIGlmIChudW1iZXJPZlRoZVNhbWVFbGVtZW50cyA9PT0gbWF4TnVtYmVyT2ZFbGVtZW50cykgewogICAgICAgIGxvZ2dlci5tZXNzYWdlKCJJZ25vcmVkIGJlY2F1c2UgYWxsIGF0dHJpYnV0ZXMgYXJlIHNhbWUiKTsKICAgICAgICByZXR1cm4gQ29tcGFyaXNvblJlc3VsdC5aRVJPX1BFTkFMVFlfUE9JTlRTOwogICAgfQoKICAgIGlmIChudW1iZXJPZkRpZmZlcmVuY2VzID4gY29uZmlnLm1heERpZmZlcmVuY2VzKSB7CiAgICAgICAgaWYgKGxvZ2dlci5tZXNzYWdlRW5hYmxlZCgpKSB7CiAgICAgICAgICAgIGxvZ2dlci5tZXNzYWdlKCJXb3VsZCBiZSBpZ25vcmVkIGlmIG5vdCBtb3JlIHRoYW4gIiArIGNvbmZpZy5tYXhEaWZmZXJlbmNlcyArICIgZGlmZmVyZW5jZXMiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBDb21wYXJpc29uUmVzdWx0KGNvbmZpZy5wZW5hbHR5UG9pbnRzKTsKICAgIH0KCiAgICBpZiAocGVyY2VudGFnZU9mRGlmZmVyZW5jZXMgPiBjb25maWcubWF4UGVyY2VudGFnZURpZmZlcmVuY2UpIHsKICAgICAgICBpZiAobG9nZ2VyLm1lc3NhZ2VFbmFibGVkKCkpIHsKICAgICAgICAgICAgbG9nZ2VyLm1lc3NhZ2UocGVyY2VudGFnZU9mRGlmZmVyZW5jZXMgKyAiIHBlcmNlbnRzIGFyZSBkaWZmZXJlbnQiKTsKICAgICAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoIldvdWxkIGJlIGlnbm9yZWQgaWYgbm90IG1vcmUgdGhhbiAiICsgY29uZmlnLm1heFBlcmNlbnRhZ2VEaWZmZXJlbmNlICsgIiBwZXJjZW50Iik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgQ29tcGFyaXNvblJlc3VsdChjb25maWcucGVuYWx0eVBvaW50cyk7CiAgICB9CgogICAgaWYgKGxvZ2dlci5tZXNzYWdlRW5hYmxlZCgpKSB7CiAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoIklnbm9yZWQgYmVjYXVzZSBudW1iZXIgb2YgZGlmZmVyZW5jZXMoIiArIG51bWJlck9mRGlmZmVyZW5jZXMgKyAiKSBub3QgbW9yZSB0aGFuICIKICAgICAgICAgICAgKyBjb25maWcubWF4RGlmZmVyZW5jZXMpOwogICAgICAgIGxvZ2dlci5tZXNzYWdlKHBlcmNlbnRhZ2VPZkRpZmZlcmVuY2VzICsgIiBwZXJjZW50cyBhcmUgZGlmZmVyZW50Iik7CiAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoIklnbm9yZWQgYmVjYXVzZSBub3QgbW9yZSB0aGFuICIgKyBjb25maWcubWF4UGVyY2VudGFnZURpZmZlcmVuY2UgKyAiIHBlcmNlbnQiKTsKICAgIH0KICAgIHJldHVybiBuZXcgQ29tcGFyaXNvblJlc3VsdCh0cnVlKTsKfTsKCi8qKgogKiBDb21wYXJlcyB0d28gVXNlciBBZ2VudCBTdHJpbmdzIGFuZCBpZiB0aGV5IGFyZSBlcXVhbCB0aGVuIHJldHVybnMgYSBDb21wYXJpc29uUmVzdWx0IHdpdGggemVybyBwZW5hbHR5CiAqIHBvaW50cyBhc3NpZ25lZCwgb3RoZXJ3aXNlIHJldHVybnMgYSBDb21wYXJpc29uUmVzdWx0IHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBwZW5hbHR5IHBvaW50cyBhc3NpZ25lZC4KICoKICogQHBhcmFtIGN1cnJlbnRWYWx1ZSAoU3RyaW5nKSBUaGUgY3VycmVudCB2YWx1ZS4KICogQHBhcmFtIHN0b3JlZFZhbHVlIChTdHJpbmcpIFRoZSBzdG9yZWQgdmFsdWUuCiAqIEBwYXJhbSBjb25maWc6IHsKICogICAgICAgICAgICAiaWdub3JlVmVyc2lvbiI6IChib29sZWFuKSBJZiB0aGUgdmVyc2lvbiBudW1iZXJzIGluIHRoZSBVc2VyIEFnZW50IFN0cmluZ3Mgc2hvdWxkIGJlIGlnbm9yZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjb21wYXJpc29uLgogKiAgICAgICAgICAgICJwZW5hbHR5UG9pbnRzIjogKE51bWJlcikgVGhlIG51bWJlciBvZiBwZW5hbHR5IHBvaW50cy4KICogICAgICAgIH0KICogQHJldHVybiBBIENvbXBhcmlzb25SZXN1bHQuCiAqLwpVc2VyQWdlbnRDb21wYXJhdG9yLmNvbXBhcmUgPSBmdW5jdGlvbiAoY3VycmVudFZhbHVlLCBzdG9yZWRWYWx1ZSwgY29uZmlnKSB7CiAgICBpZiAobG9nZ2VyLm1lc3NhZ2VFbmFibGVkKCkpIHsKICAgICAgICBsb2dnZXIubWVzc2FnZSgiVXNlckFnZW50Q29tcGFyYXRvci5jb21wYXJlOmN1cnJlbnRWYWx1ZTogIiArIEpTT04uc3RyaW5naWZ5KGN1cnJlbnRWYWx1ZSkpOwogICAgICAgIGxvZ2dlci5tZXNzYWdlKCJVc2VyQWdlbnRDb21wYXJhdG9yLmNvbXBhcmU6c3RvcmVkVmFsdWU6ICIgKyBKU09OLnN0cmluZ2lmeShzdG9yZWRWYWx1ZSkpOwogICAgICAgIGxvZ2dlci5tZXNzYWdlKCJVc2VyQWdlbnRDb21wYXJhdG9yLmNvbXBhcmU6Y29uZmlnOiAiICsgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7CiAgICB9CgogICAgaWYgKGNvbmZpZy5pZ25vcmVWZXJzaW9uKSB7CiAgICAgICAgLy8gcmVtb3ZlIHZlcnNpb24gbnVtYmVyCiAgICAgICAgY3VycmVudFZhbHVlID0gbnVsbE9yVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgPyBudWxsIDogY3VycmVudFZhbHVlLnJlcGxhY2UoL1tcZFwuXSsvZywgIiIpLnRyaW0oKTsKICAgICAgICBzdG9yZWRWYWx1ZSA9IG51bGxPclVuZGVmaW5lZChzdG9yZWRWYWx1ZSkgPyBudWxsIDogc3RvcmVkVmFsdWUucmVwbGFjZSgvW1xkXC5dKy9nLCAiIikudHJpbSgpOwogICAgfQoKICAgIHJldHVybiBTY2FsYXJDb21wYXJhdG9yLmNvbXBhcmUoY3VycmVudFZhbHVlLCBzdG9yZWRWYWx1ZSwgY29uZmlnKTsKfTsKCi8qKgogKiBDb21wYXJlcyB0d28gbG9jYXRpb25zLCB0YWtpbmcgaW50byBhY2NvdW50IGEgZGVncmVlIG9mIGRpZmZlcmVuY2UuCiAqCiAqIEBwYXJhbSBjdXJyZW50VmFsdWU6IHsKICogICAgICAgICAgICAibGF0aXR1ZGUiOiAoTnVtYmVyKSBUaGUgY3VycmVudCBsYXRpdHVkZS4KICogICAgICAgICAgICAibG9uZ2l0dWRlIjogKE51bWJlcikgVGhlIGN1cnJlbnQgbG9uZ2l0dWRlLgogKiAgICAgICAgfQogKiBAcGFyYW0gc3RvcmVkVmFsdWU6IHsKICogICAgICAgICAgICAibGF0aXR1ZGUiOiAoTnVtYmVyKSBUaGUgc3RvcmVkIGxhdGl0dWRlLgogKiAgICAgICAgICAgICJsb25naXR1ZGUiOiAoTnVtYmVyKSBUaGUgc3RvcmVkIGxvbmdpdHVkZS4KICogICAgICAgIH0KICogQHBhcmFtIGNvbmZpZzogewogKiAgICAgICAgICAgICJhbGxvd2VkUmFuZ2UiOiAoTnVtYmVyKSBUaGUgbWF4IGRpZmZlcmVuY2UgYWxsb3dlZCBpbiB0aGUgdHdvIGxvY2F0aW9ucywgYmVmb3JlIHRoZSBwZW5hbHR5IGlzIGFzc2lnbmVkLgogKiAgICAgICAgICAgICJwZW5hbHR5UG9pbnRzIjogKE51bWJlcikgVGhlIG51bWJlciBvZiBwZW5hbHR5IHBvaW50cy4KKiAgICAgICAgIH0KICogQHJldHVybiBDb21wYXJpc29uUmVzdWx0CiAqLwpHZW9sb2NhdGlvbkNvbXBhcmF0b3IuY29tcGFyZSA9IGZ1bmN0aW9uIChjdXJyZW50VmFsdWUsIHN0b3JlZFZhbHVlLCBjb25maWcpIHsKICAgIGlmIChsb2dnZXIubWVzc2FnZUVuYWJsZWQoKSkgewogICAgICAgIGxvZ2dlci5tZXNzYWdlKCJHZW9sb2NhdGlvbkNvbXBhcmF0b3IuY29tcGFyZTpjdXJyZW50VmFsdWU6ICIgKyBKU09OLnN0cmluZ2lmeShjdXJyZW50VmFsdWUpKTsKICAgICAgICBsb2dnZXIubWVzc2FnZSgiR2VvbG9jYXRpb25Db21wYXJhdG9yLmNvbXBhcmU6c3RvcmVkVmFsdWU6ICIgKyBKU09OLnN0cmluZ2lmeShzdG9yZWRWYWx1ZSkpOwogICAgICAgIGxvZ2dlci5tZXNzYWdlKCJHZW9sb2NhdGlvbkNvbXBhcmF0b3IuY29tcGFyZTpjb25maWc6ICIgKyBKU09OLnN0cmluZ2lmeShjb25maWcpKTsKICAgIH0KCiAgICAvLyBDaGVjayBmb3IgdW5kZWZpbmVkIHN0b3JlZCBvciBjdXJyZW50IGxvY2F0aW9ucwoKICAgIGlmICh1bmRlZmluZWRMb2NhdGlvbihjdXJyZW50VmFsdWUpICYmIHVuZGVmaW5lZExvY2F0aW9uKHN0b3JlZFZhbHVlKSkgewogICAgICAgIHJldHVybiBDb21wYXJpc29uUmVzdWx0LlpFUk9fUEVOQUxUWV9QT0lOVFM7CiAgICB9CiAgICBpZiAodW5kZWZpbmVkTG9jYXRpb24oY3VycmVudFZhbHVlKSAmJiAhdW5kZWZpbmVkTG9jYXRpb24oc3RvcmVkVmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIG5ldyBDb21wYXJpc29uUmVzdWx0KGNvbmZpZy5wZW5hbHR5UG9pbnRzKTsKICAgIH0KICAgIGlmICghdW5kZWZpbmVkTG9jYXRpb24oY3VycmVudFZhbHVlKSAmJiB1bmRlZmluZWRMb2NhdGlvbihzdG9yZWRWYWx1ZSkpIHsKICAgICAgICByZXR1cm4gbmV3IENvbXBhcmlzb25SZXN1bHQodHJ1ZSk7CiAgICB9CgogICAgLy8gQm90aCBsb2NhdGlvbnMgZGVmaW5lZCwgdGhlcmVmb3JlIHBlcmZvcm0gY29tcGFyaXNvbgoKICAgIHZhciBkaXN0YW5jZSA9IGNhbGN1bGF0ZURpc3RhbmNlKGN1cnJlbnRWYWx1ZSwgc3RvcmVkVmFsdWUpOwoKICAgIGlmIChsb2dnZXIubWVzc2FnZUVuYWJsZWQoKSkgewogICAgICAgIGxvZ2dlci5tZXNzYWdlKCJEaXN0YW5jZSBiZXR3ZWVuICgiICsgY3VycmVudFZhbHVlLmxhdGl0dWRlICsgIiwiICsgY3VycmVudFZhbHVlLmxvbmdpdHVkZSArICIpIGFuZCAoIiArCiAgICAgICAgICAgIHN0b3JlZFZhbHVlLmxhdGl0dWRlICsgIiwiICsgc3RvcmVkVmFsdWUubG9uZ2l0dWRlICsgIikgaXMgIiArIGRpc3RhbmNlICsgIiBtaWxlcyIpOwogICAgfQoKICAgIGlmIChwYXJzZUZsb2F0KGRpc3RhbmNlLnRvUHJlY2lzaW9uKDUpKSA9PT0gMCkgewogICAgICAgIGxvZ2dlci5tZXNzYWdlKCJMb2NhdGlvbiBpcyB0aGUgc2FtZSIpOwogICAgICAgIHJldHVybiBDb21wYXJpc29uUmVzdWx0LlpFUk9fUEVOQUxUWV9QT0lOVFM7CiAgICB9CgogICAgaWYgKGRpc3RhbmNlIDw9IGNvbmZpZy5hbGxvd2VkUmFuZ2UpIHsKICAgICAgICBpZiAobG9nZ2VyLm1lc3NhZ2VFbmFibGVkKCkpIHsKICAgICAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoIlRvbGVyYXRlZCBiZWNhdXNlIGRpc3RhbmNlIG5vdCBtb3JlIHRoZW4gIiArIGNvbmZpZy5hbGxvd2VkUmFuZ2UpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IENvbXBhcmlzb25SZXN1bHQodHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChsb2dnZXIubWVzc2FnZUVuYWJsZWQoKSkgewogICAgICAgICAgICBsb2dnZXIubWVzc2FnZSgiV291bGQgYmUgaWdub3JlZCBpZiBkaXN0YW5jZSBub3QgbW9yZSB0aGVuICIgKyBjb25maWcuYWxsb3dlZFJhbmdlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBDb21wYXJpc29uUmVzdWx0KGNvbmZpZy5wZW5hbHR5UG9pbnRzKTsKICAgIH0KfTsKCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi8vICAgICAgICAgICAgICAgICAgICBEZXZpY2UgUHJpbnQgTG9naWMgLSBETyBOT1QgTU9ESUZZICAgICAgICAgICAgICAgICAgICAgLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoKLy8gVXRpbGl0eSBmdW5jdGlvbnMKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgZXZhbHVhdGluZyBmdW5jdGlvbiBmIG9uIGVhY2ggZWxlbWVudCBvZiB0aGUgQXJyYXkgYSByZXR1cm5zIHRydWUuCiAqCiAqIEBwYXJhbSBhOiAoQXJyYXkpIFRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBldmFsdWF0ZQogKiBAcGFyYW0gZjogKEZ1bmN0aW9uKSBBIHNpbmdsZSBhcmd1bWVudCBmdW5jdGlvbiBmb3IgbWFwcGluZyBlbGVtZW50cyBvZiB0aGUgYXJyYXkgdG8gYm9vbGVhbi4KICogQHJldHVybiBib29sZWFuLgogKi8KYWxsID0gZnVuY3Rpb24oYSwgZikgewogICAgdmFyIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChmKGFbaV0pID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7Cn07CgovKioKICogUmV0dXJucyB0cnVlIGlmIGV2YWx1YXRpbmcgZnVuY3Rpb24gZiBvbiBhbnkgZWxlbWVudCBvZiB0aGUgQXJyYXkgYSByZXR1cm5zIHRydWUuCiAqCiAqIEBwYXJhbSBhOiAoQXJyYXkpIFRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBldmFsdWF0ZQogKiBAcGFyYW0gZjogKEZ1bmN0aW9uKSBBIHNpbmdsZSBhcmd1bWVudCBmdW5jdGlvbiBmb3IgbWFwcGluZyBlbGVtZW50cyBvZiB0aGUgYXJyYXkgdG8gYm9vbGVhbi4KICogQHJldHVybiBib29sZWFuLgogKi8KYW55ID0gZnVuY3Rpb24oYSwgZikgewogICAgdmFyIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChmKGFbaV0pID09PSB0cnVlKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKfTsKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIGxvY2F0aW9uIGlzIG51bGwgb3IgaGFzIHVuZGVmaW5lZCBsb25naXR1ZGUgb3IgbGF0aXR1ZGUgdmFsdWVzLgogKgogKiBAcGFyYW0gbG9jYXRpb246IHsKICogICAgICAgICAgICAibGF0aXR1ZGUiOiAoTnVtYmVyKSBUaGUgbGF0aXR1ZGUuCiAqICAgICAgICAgICAgImxvbmdpdHVkZSI6IChOdW1iZXIpIFRoZSBsb25naXR1ZGUuCiAqICAgICAgICB9CiAqIEByZXR1cm4gYm9vbGVhbgogKi8KdW5kZWZpbmVkTG9jYXRpb24gPSBmdW5jdGlvbihsb2NhdGlvbikgewogICAgcmV0dXJuIG51bGxPclVuZGVmaW5lZChsb2NhdGlvbikgfHwgbnVsbE9yVW5kZWZpbmVkKGxvY2F0aW9uLmxhdGl0dWRlKSB8fCBudWxsT3JVbmRlZmluZWQobG9jYXRpb24ubG9uZ2l0dWRlKTsKfTsKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkLgogKgogKiBAcGFyYW0gdmFsdWU6IGEgdmFsdWUgb2YgYW55IHR5cGUKICogQHJldHVybiBib29sZWFuCiAqLwpudWxsT3JVbmRlZmluZWQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7Cn07CgovKioKICogQ2FsY3VsYXRlcyB0aGUgZGlzdGFuY2VzIGJldHdlZW4gdGhlIHR3byBsb2NhdGlvbnMuCiAqCiAqIEBwYXJhbSBmaXJzdDogewogKiAgICAgICAgICAgICJsYXRpdHVkZSI6IChOdW1iZXIpIFRoZSBmaXJzdCBsYXRpdHVkZS4KICogICAgICAgICAgICAibG9uZ2l0dWRlIjogKE51bWJlcikgVGhlIGZpcnN0IGxvbmdpdHVkZS4KICogICAgICAgIH0KICogQHBhcmFtIHNlY29uZDogewogKiAgICAgICAgICAgICJsYXRpdHVkZSI6IChOdW1iZXIpIFRoZSBzZWNvbmQgbGF0aXR1ZGUuCiAqICAgICAgICAgICAgImxvbmdpdHVkZSI6IChOdW1iZXIpIFRoZSBzZWNvbmQgbG9uZ2l0dWRlLgogKiAgICAgICAgfQogKiBAcmV0dXJuIE51bWJlciBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIGxvY2F0aW9ucy4KICovCmNhbGN1bGF0ZURpc3RhbmNlID0gZnVuY3Rpb24oZmlyc3QsIHNlY29uZCkgewogICAgdmFyIGZhY3RvciA9IChNYXRoLlBJIC8gMTgwKSwKICAgICAgICB0aGV0YSwKICAgICAgICBkaXN0OwogICAgZnVuY3Rpb24gZGVncmVlc1RvUmFkaWFucyhkZWdyZWVzKSB7CiAgICAgICAgcmV0dXJuIGRlZ3JlZXMgKiBmYWN0b3I7CiAgICB9CiAgICBmdW5jdGlvbiByYWRpYW5zVG9EZWdyZWVzKHJhZGlhbnMpIHsKICAgICAgICByZXR1cm4gcmFkaWFucyAvIGZhY3RvcjsKICAgIH0KICAgIHRoZXRhID0gZmlyc3QubG9uZ2l0dWRlIC0gc2Vjb25kLmxvbmdpdHVkZTsKICAgIGRpc3QgPSBNYXRoLnNpbihkZWdyZWVzVG9SYWRpYW5zKGZpcnN0LmxhdGl0dWRlKSkgKiBNYXRoLnNpbihkZWdyZWVzVG9SYWRpYW5zKHNlY29uZC5sYXRpdHVkZSkpCiAgICAgICAgKyBNYXRoLmNvcyhkZWdyZWVzVG9SYWRpYW5zKGZpcnN0LmxhdGl0dWRlKSkgKiBNYXRoLmNvcyhkZWdyZWVzVG9SYWRpYW5zKHNlY29uZC5sYXRpdHVkZSkpCiAgICAgICAgKiBNYXRoLmNvcyhkZWdyZWVzVG9SYWRpYW5zKHRoZXRhKSk7CiAgICBkaXN0ID0gTWF0aC5hY29zKGRpc3QpOwogICAgZGlzdCA9IHJhZGlhbnNUb0RlZ3JlZXMoZGlzdCk7CiAgICBkaXN0ID0gZGlzdCAqIDYwICogMS4xNTE1OwogICAgcmV0dXJuIGRpc3Q7Cn07CgovKioKICogQ29udmVydHMgYSBTdHJpbmcgaG9sZGluZyBhIGRlbGltaXRlZCBzZXF1ZW5jZSBvZiB2YWx1ZXMgaW50byBhbiBhcnJheS4KICoKICogQHBhcmFtIHRleHQgKFN0cmluZykgVGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGRlbGltaXRlZCBzZXF1ZW5jZSBvZiB2YWx1ZXMuCiAqIEBwYXJhbSBkZWxpbWl0ZXIgKFN0cmluZykgVGhlIGNoYXJhY3RlciBkZWxpbWl0aW5nIHZhbHVlcyB3aXRoaW4gdGhlIHRleHQgU3RyaW5nLgogKiBAcmV0dXJuIChBcnJheSkgVGhlIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMuCiAqLwpzcGxpdEFuZFRyaW0gPSBmdW5jdGlvbih0ZXh0LCBkZWxpbWl0ZXIpIHsKCiAgICB2YXIgcmVzdWx0cyA9IFtdLAogICAgICAgIGksCiAgICAgICAgdmFsdWVzLAogICAgICAgIHZhbHVlOwogICAgaWYgKHRleHQgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0KCiAgICB2YWx1ZXMgPSB0ZXh0LnNwbGl0KGRlbGltaXRlcik7CiAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZXNbaV0udHJpbSgpOwogICAgICAgIGlmICh2YWx1ZSAhPT0gIiIpIHsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdHM7Cn07CgovKioKICogQ29udmVydHMgdmFsdWUgdG8gYSBwZXJjZW50YWdlIG9mIHJhbmdlLgogKgogKiBAcGFyYW0gdmFsdWUgKE51bWJlcikgVGhlIGFjdHVhbCBudW1iZXIgdG8gYmUgY29udmVydGVkIHRvIGEgcGVyY2VudGFnZS4KICogQHBhcmFtIHJhbmdlIChOdW1iZXIpIFRoZSB0b3RhbCBudW1iZXIgb2YgdmFsdWVzIChpLmUuIHJlcHJlc2VudHMgMTAwJSkuCiAqIEByZXR1cm4gKE51bWJlcikgVGhlIHBlcmNlbnRhZ2UuCiAqLwpjYWxjdWxhdGVQZXJjZW50YWdlID0gZnVuY3Rpb24odmFsdWUsIHJhbmdlKSB7CiAgICBpZiAocmFuZ2UgPT09IDApIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiBwYXJzZUZsb2F0KCh2YWx1ZSAvIHJhbmdlKS50b1ByZWNpc2lvbigyKSkgKiAxMDA7Cn07CgovKioKICogQ3JlYXRlcyBhIG5ldyBhcnJheSBjb250YWluaW5nIG9ubHkgdGhvc2UgZWxlbWVudHMgZm91bmQgaW4gYm90aCBhcnJheXMgcmVjZWl2ZWQgYXMgYXJndW1lbnRzLgogKgogKiBAcGFyYW0gZmlyc3QgKEFycmF5KSBUaGUgZmlyc3QgYXJyYXkuCiAqIEBwYXJhbSBzZWNvbmQgKEFycmF5KSBUaGUgc2Vjb25kIGFycmF5LgogKiBAcmV0dXJuIChBcnJheSkgVGhlIGVsZW1lbnRzIHRoYXQgZm91bmQgaW4gZmlyc3QgYW5kIHNlY29uZC4KICovCmNhbGN1bGF0ZUludGVyc2VjdGlvbiA9IGZ1bmN0aW9uKGZpcnN0LCBzZWNvbmQpIHsKICAgIHJldHVybiBmaXJzdC5maWx0ZXIoZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgIHJldHVybiBzZWNvbmQuaW5kZXhPZihlbGVtZW50KSAhPT0gLTE7CiAgICB9KTsKfTsKCmZ1bmN0aW9uIGdldFZhbHVlKG9iaiwgYXR0cmlidXRlUGF0aCkgewogICAgdmFyIHZhbHVlID0gb2JqLAogICAgICAgIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgYXR0cmlidXRlUGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICB2YWx1ZSA9IHZhbHVlW2F0dHJpYnV0ZVBhdGhbaV1dOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwp9CgoKZnVuY3Rpb24gaXNMZWFmTm9kZShhdHRyaWJ1dGVDb25maWcpIHsKICAgIHJldHVybiBhdHRyaWJ1dGVDb25maWcuY29tcGFyYXRvciAhPT0gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBnZXRBdHRyaWJ1dGVQYXRocyhhdHRyaWJ1dGVDb25maWcsIGF0dHJpYnV0ZVBhdGgpIHsKCiAgICB2YXIgYXR0cmlidXRlUGF0aHMgPSBbXSwKICAgICAgICBhdHRyaWJ1dGVOYW1lLAogICAgICAgIGF0dHJQYXRocywKICAgICAgICBhdHRyUGF0aCwKICAgICAgICBpOwoKICAgIGZvciAoYXR0cmlidXRlTmFtZSBpbiBhdHRyaWJ1dGVDb25maWcpIHsKICAgICAgICBpZiAoYXR0cmlidXRlQ29uZmlnLmhhc093blByb3BlcnR5KGF0dHJpYnV0ZU5hbWUpKSB7CgogICAgICAgICAgICBpZiAoaXNMZWFmTm9kZShhdHRyaWJ1dGVDb25maWdbYXR0cmlidXRlTmFtZV0pKSB7CiAgICAgICAgICAgICAgICBhdHRyUGF0aCA9IGF0dHJpYnV0ZVBhdGguc2xpY2UoKTsKICAgICAgICAgICAgICAgIGF0dHJQYXRoLnB1c2goYXR0cmlidXRlTmFtZSk7CiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQYXRocy5wdXNoKGF0dHJQYXRoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGF0dHJQYXRoID0gYXR0cmlidXRlUGF0aC5zbGljZSgpOwogICAgICAgICAgICAgICAgYXR0clBhdGgucHVzaChhdHRyaWJ1dGVOYW1lKTsKICAgICAgICAgICAgICAgIGF0dHJQYXRocyA9IGdldEF0dHJpYnV0ZVBhdGhzKGF0dHJpYnV0ZUNvbmZpZ1thdHRyaWJ1dGVOYW1lXSwgYXR0clBhdGgpOwogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0dHJQYXRocy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVBhdGhzLnB1c2goYXR0clBhdGhzW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gYXR0cmlidXRlUGF0aHM7Cn0KCmZ1bmN0aW9uIGdldERldmljZVByaW50QXR0cmlidXRlUGF0aHMoYXR0cmlidXRlQ29uZmlnKSB7CiAgICByZXR1cm4gZ2V0QXR0cmlidXRlUGF0aHMoYXR0cmlidXRlQ29uZmlnLCBbXSk7Cn0KCmZ1bmN0aW9uIGhhc1JlcXVpcmVkQXR0cmlidXRlcyhkZXZpY2VQcmludCwgYXR0cmlidXRlQ29uZmlnKSB7CgogICAgdmFyIGF0dHJpYnV0ZVBhdGhzID0gZ2V0RGV2aWNlUHJpbnRBdHRyaWJ1dGVQYXRocyhhdHRyaWJ1dGVDb25maWcpLAogICAgICAgIGksCiAgICAgICAgYXR0clZhbHVlLAogICAgICAgIGF0dHJDb25maWc7CgogICAgZm9yIChpID0gMDsgaSA8IGF0dHJpYnV0ZVBhdGhzLmxlbmd0aDsgaSsrKSB7CgogICAgICAgIGF0dHJWYWx1ZSA9IGdldFZhbHVlKGRldmljZVByaW50LCBhdHRyaWJ1dGVQYXRoc1tpXSk7CiAgICAgICAgYXR0ckNvbmZpZyA9IGdldFZhbHVlKGF0dHJpYnV0ZUNvbmZpZywgYXR0cmlidXRlUGF0aHNbaV0pOwoKICAgICAgICBpZiAoYXR0ckNvbmZpZy5yZXF1aXJlZCAmJiBhdHRyVmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBsb2dnZXIud2FybmluZygiRGV2aWNlIFByaW50IHByb2ZpbGUgbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUsICIgKyBhdHRyaWJ1dGVQYXRoc1tpXSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgbG9nZ2VyLm1lc3NhZ2UoImRldmljZSBwcmludCBoYXMgcmVxdWlyZWQgYXR0cmlidXRlcyIpOwogICAgcmV0dXJuIHRydWU7Cn0KCmZ1bmN0aW9uIGNvbXBhcmVEZXZpY2VQcmludFByb2ZpbGVzKGF0dHJpYnV0ZUNvbmZpZywgZGV2aWNlUHJpbnQsIGRldmljZVByaW50UHJvZmlsZXMsIG1heFBlbmFsdHlQb2ludHMpIHsKCiAgICB2YXIgYXR0cmlidXRlUGF0aHMgPSBnZXREZXZpY2VQcmludEF0dHJpYnV0ZVBhdGhzKGF0dHJpYnV0ZUNvbmZpZyksCiAgICAgICAgZGFvID0gc2hhcmVkU3RhdGUuZ2V0KCdfRGV2aWNlSWREYW8nKSwKICAgICAgICByZXN1bHRzLAogICAgICAgIGosCiAgICAgICAgYWdncmVnYXRlZENvbXBhcmlzb25SZXN1bHQsCiAgICAgICAgaSwKICAgICAgICBjdXJyZW50VmFsdWUsCiAgICAgICAgc3RvcmVkVmFsdWUsCiAgICAgICAgYXR0ckNvbmZpZywKICAgICAgICBjb21wYXJpc29uUmVzdWx0LAogICAgICAgIHNlbGVjdGVkQ29tcGFyaXNvblJlc3VsdCwKICAgICAgICBzZWxlY3RlZFByb2ZpbGUsCiAgICAgICAgY3VyRGV2aWNlUHJpbnRQcm9maWxlLAogICAgICAgIHZhbHM7CgogICAgcmVzdWx0cyA9IFtdOwogICAgZm9yIChqID0gMDsgaiA8IGRldmljZVByaW50UHJvZmlsZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICBjdXJEZXZpY2VQcmludFByb2ZpbGUgPSBKU09OLnBhcnNlKG9yZy5mb3JnZXJvY2suanNvbi5Kc29uVmFsdWUuanNvbihkZXZpY2VQcmludFByb2ZpbGVzW2pdKSk7CiAgICAgICAgYWdncmVnYXRlZENvbXBhcmlzb25SZXN1bHQgPSBuZXcgQ29tcGFyaXNvblJlc3VsdCgpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdHRyaWJ1dGVQYXRocy5sZW5ndGg7IGkrKykgewoKICAgICAgICAgICAgY3VycmVudFZhbHVlID0gZ2V0VmFsdWUoZGV2aWNlUHJpbnQsIGF0dHJpYnV0ZVBhdGhzW2ldKTsKICAgICAgICAgICAgc3RvcmVkVmFsdWUgPSBnZXRWYWx1ZShjdXJEZXZpY2VQcmludFByb2ZpbGUuZGV2aWNlUHJpbnQsIGF0dHJpYnV0ZVBhdGhzW2ldKTsKICAgICAgICAgICAgYXR0ckNvbmZpZyA9IGdldFZhbHVlKGF0dHJpYnV0ZUNvbmZpZywgYXR0cmlidXRlUGF0aHNbaV0pOwoKICAgICAgICAgICAgaWYgKHN0b3JlZFZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBjb21wYXJpc29uUmVzdWx0ID0gbmV3IENvbXBhcmlzb25SZXN1bHQoYXR0ckNvbmZpZy5wZW5hbHR5UG9pbnRzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbXBhcmlzb25SZXN1bHQgPSBhdHRyQ29uZmlnLmNvbXBhcmF0b3IuY29tcGFyZShjdXJyZW50VmFsdWUsIHN0b3JlZFZhbHVlLCBhdHRyQ29uZmlnLmFyZ3MpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAobG9nZ2VyLm1lc3NhZ2VFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgIGxvZ2dlci5tZXNzYWdlKCJDb21wYXJpbmcgYXR0cmlidXRlIHBhdGg6ICIgKyBhdHRyaWJ1dGVQYXRoc1tpXQogICAgICAgICAgICAgICAgICAgICsgIiwgQ29tcGFyaXNvbiByZXN1bHQ6IHN1Y2Nlc3NmdWw9IiArIGNvbXBhcmlzb25SZXN1bHQuaXNTdWNjZXNzZnVsKCkgKyAiLCBwZW5hbHR5UG9pbnRzPSIKICAgICAgICAgICAgICAgICAgICArIGNvbXBhcmlzb25SZXN1bHQucGVuYWx0eVBvaW50cyArICIsIGFkZGl0aW9uYWxJbmZvSW5DdXJyZW50VmFsdWU9IgogICAgICAgICAgICAgICAgICAgICsgY29tcGFyaXNvblJlc3VsdC5hZGRpdGlvbmFsSW5mb0luQ3VycmVudFZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhZ2dyZWdhdGVkQ29tcGFyaXNvblJlc3VsdC5hZGRDb21wYXJpc29uUmVzdWx0KGNvbXBhcmlzb25SZXN1bHQpOwogICAgICAgIH0KICAgICAgICBpZiAobG9nZ2VyLm1lc3NhZ2VFbmFibGVkKCkpIHsKICAgICAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoIkFnZ3JlZ2F0ZWQgY29tcGFyaXNvbiByZXN1bHQ6IHN1Y2Nlc3NmdWw9IgogICAgICAgICAgICAgICAgKyBhZ2dyZWdhdGVkQ29tcGFyaXNvblJlc3VsdC5pc1N1Y2Nlc3NmdWwoKSArICIsIHBlbmFsdHlQb2ludHM9IgogICAgICAgICAgICAgICAgKyBhZ2dyZWdhdGVkQ29tcGFyaXNvblJlc3VsdC5wZW5hbHR5UG9pbnRzICsgIiwgYWRkaXRpb25hbEluZm9JbkN1cnJlbnRWYWx1ZT0iCiAgICAgICAgICAgICAgICArIGFnZ3JlZ2F0ZWRDb21wYXJpc29uUmVzdWx0LmFkZGl0aW9uYWxJbmZvSW5DdXJyZW50VmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAga2V5OiBhZ2dyZWdhdGVkQ29tcGFyaXNvblJlc3VsdCwKICAgICAgICAgICAgdmFsdWU6IGRldmljZVByaW50UHJvZmlsZXNbal0KICAgICAgICB9KTsKICAgIH0KCiAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICByZXN1bHRzLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgIHJldHVybiBDb21wYXJpc29uUmVzdWx0LmNvbXBhcmUoYS5rZXksIGIua2V5KTsKICAgIH0pOwogICAgc2VsZWN0ZWRDb21wYXJpc29uUmVzdWx0ID0gcmVzdWx0c1swXS5rZXk7CiAgICBpZiAobG9nZ2VyLm1lc3NhZ2VFbmFibGVkKCkpIHsKICAgICAgICBsb2dnZXIubWVzc2FnZSgiU2VsZWN0ZWQgY29tcGFyaXNvbiByZXN1bHQ6IHN1Y2Nlc3NmdWw9IiArIHNlbGVjdGVkQ29tcGFyaXNvblJlc3VsdC5pc1N1Y2Nlc3NmdWwoKQogICAgICAgICAgICArICIsIHBlbmFsdHlQb2ludHM9IiArIHNlbGVjdGVkQ29tcGFyaXNvblJlc3VsdC5wZW5hbHR5UG9pbnRzICsgIiwgYWRkaXRpb25hbEluZm9JbkN1cnJlbnRWYWx1ZT0iCiAgICAgICAgICAgICsgc2VsZWN0ZWRDb21wYXJpc29uUmVzdWx0LmFkZGl0aW9uYWxJbmZvSW5DdXJyZW50VmFsdWUpOwogICAgfQoKICAgIHNlbGVjdGVkUHJvZmlsZSA9IG51bGw7CiAgICBpZiAoc2VsZWN0ZWRDb21wYXJpc29uUmVzdWx0LnBlbmFsdHlQb2ludHMgPD0gbWF4UGVuYWx0eVBvaW50cykgewogICAgICAgIHNlbGVjdGVkUHJvZmlsZSA9IHJlc3VsdHNbMF0udmFsdWU7CiAgICAgICAgaWYgKGxvZ2dlci5tZXNzYWdlRW5hYmxlZCgpKSB7CiAgICAgICAgICAgIGxvZ2dlci5tZXNzYWdlKCJTZWxlY3RlZCBwcm9maWxlOiAiICsgc2VsZWN0ZWRQcm9maWxlICsKICAgICAgICAgICAgICAgICIgd2l0aCAiICsgc2VsZWN0ZWRDb21wYXJpc29uUmVzdWx0LnBlbmFsdHlQb2ludHMgKyAiIHBlbmFsdHkgcG9pbnRzIik7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChzZWxlY3RlZFByb2ZpbGUgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyogdXBkYXRlIHByb2ZpbGUgKi8KICAgIHNlbGVjdGVkUHJvZmlsZS5wdXQoInNlbGVjdGlvbkNvdW50ZXIiLAogICAgICAgIGphdmEubGFuZy5JbnRlZ2VyLnZhbHVlT2YocGFyc2VJbnQoc2VsZWN0ZWRQcm9maWxlLmdldCgic2VsZWN0aW9uQ291bnRlciIpLCAxMCkgKyAxKSk7CiAgICBzZWxlY3RlZFByb2ZpbGUucHV0KCJsYXN0U2VsZWN0ZWREYXRlIiwgamF2YS5sYW5nLkxvbmcudmFsdWVPZihuZXcgRGF0ZSgpLmdldFRpbWUoKSkpOwogICAgc2VsZWN0ZWRQcm9maWxlLnB1dCgiZGV2aWNlUHJpbnQiLCBkZXZpY2VQcmludCk7CgogICAgdmFscyA9IFtdOwogICAgZm9yIChpID0gMDsgaSA8IGRldmljZVByaW50UHJvZmlsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YWxzLnB1c2gob3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uKGRldmljZVByaW50UHJvZmlsZXNbaV0pKTsKICAgIH0KCiAgICBkYW8uc2F2ZURldmljZVByb2ZpbGVzKHVzZXJuYW1lLCByZWFsbSwgdmFscyk7CgogICAgcmV0dXJuIHRydWU7Cn0KCmZ1bmN0aW9uIG1hdGNoRGV2aWNlUHJpbnQoKSB7CgogICAgaWYgKCF1c2VybmFtZSkgewogICAgICAgIGxvZ2dlci5lcnJvcigiVXNlcm5hbWUgbm90IHNldC4gQ2Fubm90IGNvbXBhcmUgdXNlcidzIGRldmljZSBwcmludCBwcm9maWxlcy4iKTsKICAgICAgICBhdXRoU3RhdGUgPSBGQUlMRUQ7CiAgICB9IGVsc2UgewoKICAgICAgICBpZiAobG9nZ2VyLm1lc3NhZ2VFbmFibGVkKCkpIHsKICAgICAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoImNsaWVudCBkZXZpY2VQcmludDogIiArIGNsaWVudFNjcmlwdE91dHB1dERhdGEpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGdldFByb2ZpbGVzID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzRXhwaXJlZFByb2ZpbGUoZGV2aWNlUHJpbnRQcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4cGlyYXRpb25EYXRlID0gbmV3IERhdGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlbGVjdGVkRGF0ZTsKICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uRGF0ZS5zZXREYXRlKGV4cGlyYXRpb25EYXRlLmdldERhdGUoKSAtIGNvbmZpZy5wcm9maWxlRXhwaXJhdGlvbik7CgogICAgICAgICAgICAgICAgICAgIGxhc3RTZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShkZXZpY2VQcmludFByb2ZpbGUubGFzdFNlbGVjdGVkRGF0ZSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0U2VsZWN0ZWREYXRlIDwgZXhwaXJhdGlvbkRhdGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0Tm90RXhwaXJlZFByb2ZpbGVzKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICBkYW8gPSBzaGFyZWRTdGF0ZS5nZXQoJ19EZXZpY2VJZERhbycpLAogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gW10sCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgICBpdGVyOwoKICAgICAgICAgICAgICAgICAgICBwcm9maWxlcyA9IGRhby5nZXREZXZpY2VQcm9maWxlcyh1c2VybmFtZSwgcmVhbG0pOwoKICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlciA9IHByb2ZpbGVzLml0ZXJhdG9yKCk7CgogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBpdGVyLm5leHQoKS5nZXRPYmplY3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNFeHBpcmVkUHJvZmlsZShwcm9maWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChwcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLm1lc3NhZ2VFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoInN0b3JlZCBub24tZXhwaXJlZCBwcm9maWxlczogIiArIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Tm90RXhwaXJlZFByb2ZpbGVzKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRldmljZVByaW50ID0gSlNPTi5wYXJzZShjbGllbnRTY3JpcHRPdXRwdXREYXRhKSwKICAgICAgICAgICAgZGV2aWNlUHJpbnRQcm9maWxlcyA9IGdldFByb2ZpbGVzKCk7CgogICAgICAgIGlmICghaGFzUmVxdWlyZWRBdHRyaWJ1dGVzKGRldmljZVByaW50LCBjb25maWcuYXR0cmlidXRlcykpIHsKICAgICAgICAgICAgbG9nZ2VyLm1lc3NhZ2UoImRldmljZVByaW50Lmhhc1JlcXVpcmVkQXR0cmlidXRlczogZmFsc2UiKTsKICAgICAgICAgICAgLy8gV2lsbCBmYWlsIHRoaXMgbW9kdWxlIGJ1dCBmYWxsLXRocm91Z2ggdG8gbmV4dCBtb2R1bGUuIFdoaWNoIHNob3VsZCBiZSBPVFAuCiAgICAgICAgICAgIGF1dGhTdGF0ZSA9IEZBSUxFRDsKICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmVEZXZpY2VQcmludFByb2ZpbGVzKGNvbmZpZy5hdHRyaWJ1dGVzLCBkZXZpY2VQcmludCwgZGV2aWNlUHJpbnRQcm9maWxlcywgY29uZmlnLm1heFBlbmFsdHlQb2ludHMpKSB7CiAgICAgICAgICAgIGxvZ2dlci5tZXNzYWdlKCJkZXZpY2VQcmludC5oYXNWYWxpZFByb2ZpbGU6IHRydWUiKTsKICAgICAgICAgICAgYXV0aFN0YXRlID0gU1VDQ0VTUzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb2dnZXIubWVzc2FnZSgiZGV2aWNlUHJpbnQuaGFzVmFsaWRQcm9maWxlOiBmYWxzZSIpOwogICAgICAgICAgICBzaGFyZWRTdGF0ZS5wdXQoJ2RldmljZVByaW50UHJvZmlsZScsIEpTT04uc3RyaW5naWZ5KGRldmljZVByaW50KSk7CiAgICAgICAgICAgIC8vIFdpbGwgZmFpbCB0aGlzIG1vZHVsZSBidXQgZmFsbC10aHJvdWdoIHRvIG5leHQgbW9kdWxlLiBXaGljaCBzaG91bGQgYmUgT1RQLgogICAgICAgICAgICBhdXRoU3RhdGUgPSBGQUlMRUQ7CiAgICAgICAgfQogICAgfQp9CgptYXRjaERldmljZVByaW50KCk7Cg==\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_SERVER_SIDE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"9de3eb62-f131-4fac-a294-7bd170fd4acb\",\"name\":\"Scripted Policy Condition\",\"description\":\"Default global script for Scripted Policy Conditions\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMTUtMjAyMyBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCi8qKgogKiBUaGlzIGlzIGEgUG9saWN5IENvbmRpdGlvbiBleGFtcGxlIHNjcmlwdC4gSXQgZGVtb25zdHJhdGVzIGhvdyB0byBhY2Nlc3MgYSB1c2VyJ3MgaW5mb3JtYXRpb24sCiAqIHVzZSB0aGF0IGluZm9ybWF0aW9uIGluIGV4dGVybmFsIEhUVFAgY2FsbHMgYW5kIG1ha2UgYSBwb2xpY3kgZGVjaXNpb24gYmFzZWQgb24gdGhlIG91dGNvbWUuCiAqLwoKdmFyIHVzZXJBZGRyZXNzLCB1c2VySVAsIHJlc291cmNlSG9zdDsKCmlmICh2YWxpZGF0ZUFuZEluaXRpYWxpemVQYXJhbWV0ZXJzKCkpIHsKCiAgICB2YXIgY291bnRyeUZyb21Vc2VyQWRkcmVzcyA9IGdldENvdW50cnlGcm9tVXNlckFkZHJlc3MoKTsKICAgIGxvZ2dlci5tZXNzYWdlKCJDb3VudHJ5IHJldHJpZXZlZCBmcm9tIHVzZXIncyBhZGRyZXNzOiAiICsgY291bnRyeUZyb21Vc2VyQWRkcmVzcyk7CiAgICB2YXIgY291bnRyeUZyb21Vc2VySVAgPSBnZXRDb3VudHJ5RnJvbVVzZXJJUCgpOwogICAgbG9nZ2VyLm1lc3NhZ2UoIkNvdW50cnkgcmV0cmlldmVkIGZyb20gdXNlcidzIElQOiAiICsgY291bnRyeUZyb21Vc2VySVApOwogICAgdmFyIGNvdW50cnlGcm9tUmVzb3VyY2VVUkkgPSBnZXRDb3VudHJ5RnJvbVJlc291cmNlVVJJKCk7CiAgICBsb2dnZXIubWVzc2FnZSgiQ291bnRyeSByZXRyaWV2ZWQgZnJvbSByZXNvdXJjZSBVUkk6ICIgKyBjb3VudHJ5RnJvbVJlc291cmNlVVJJKTsKCiAgICBpZiAoY291bnRyeUZyb21Vc2VyQWRkcmVzcyA9PT0gY291bnRyeUZyb21Vc2VySVAgJiYgY291bnRyeUZyb21Vc2VyQWRkcmVzcyA9PT0gY291bnRyeUZyb21SZXNvdXJjZVVSSSkgewogICAgICAgIGxvZ2dlci5tZXNzYWdlKCJBdXRob3JpemF0aW9uIFN1Y2NlZWRlZCIpOwogICAgICAgIHJlc3BvbnNlQXR0cmlidXRlcy5wdXQoImNvdW50cnlPZk9yaWdpbiIsIFtjb3VudHJ5RnJvbVVzZXJBZGRyZXNzXSk7CiAgICAgICAgYXV0aG9yaXplZCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICAgIGxvZ2dlci5tZXNzYWdlKCJBdXRob3JpemF0aW9uIEZhaWxlZCIpOwogICAgICAgIGF1dGhvcml6ZWQgPSBmYWxzZTsKICAgIH0KCn0gZWxzZSB7CiAgICBsb2dnZXIubWVzc2FnZSgiUmVxdWlyZWQgcGFyYW1ldGVycyBub3QgZm91bmQuIEF1dGhvcml6YXRpb24gRmFpbGVkLiIpOwogICAgYXV0aG9yaXplZCA9IGZhbHNlOwp9CgovKioKICogVXNlIHRoZSB1c2VyJ3MgYWRkcmVzcyB0byBsb29rdXAgdGhlaXIgY291bnRyeSBvZiByZXNpZGVuY2UuCiAqCiAqIEByZXR1cm5zIHsqfSBUaGUgdXNlcidzIGNvdW50cnkgb2YgcmVzaWRlbmNlLgogKi8KZnVuY3Rpb24gZ2V0Q291bnRyeUZyb21Vc2VyQWRkcmVzcygpIHsKCiAgICB2YXIgcmVxdWVzdCA9IG5ldyBvcmcuZm9yZ2Vyb2NrLmh0dHAucHJvdG9jb2wuUmVxdWVzdCgpOwogICAgcmVxdWVzdC5zZXRVcmkoImh0dHA6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2dlb2NvZGUvanNvbj9hZGRyZXNzPSIgKyBlbmNvZGVVUklDb21wb25lbnQodXNlckFkZHJlc3MpKTsKICAgICAgcmVxdWVzdC5zZXRNZXRob2QoIkdFVCIpOwoKICAgIHZhciByZXNwb25zZSA9IGh0dHBDbGllbnQuc2VuZChyZXF1ZXN0KS5nZXQoKTsKICAgIGxvZ1Jlc3BvbnNlKHJlc3BvbnNlKTsKCiAgICB2YXIgZ2VvY29kZSA9IEpTT04ucGFyc2UocmVzcG9uc2UuZ2V0RW50aXR5KCkuZ2V0U3RyaW5nKCkpOwogICAgdmFyIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvY29kZS5yZXN1bHRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IGdlb2NvZGUucmVzdWx0c1tpXTsKICAgICAgICB2YXIgajsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmVzdWx0LmFkZHJlc3NfY29tcG9uZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAocmVzdWx0LmFkZHJlc3NfY29tcG9uZW50c1tpXS50eXBlc1swXSA9PSAiY291bnRyeSIpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuYWRkcmVzc19jb21wb25lbnRzW2ldLmxvbmdfbmFtZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIFVzZSB0aGUgdXNlcidzIElQIHRvIGxvb2t1cCB0aGUgY291bnRyeSBmcm9tIHdoaWNoIHRoZSByZXF1ZXN0IG9yaWdpbmF0ZWQuCiAqCiAqIEByZXR1cm5zIHsqfSBUaGUgY291bnRyeSBmcm9tIHdoaWNoIHRoZSByZXF1ZXN0IG9yaWdpbmF0ZWQuCiAqLwpmdW5jdGlvbiBnZXRDb3VudHJ5RnJvbVVzZXJJUCgpIHsKICAgIHZhciByZXF1ZXN0ID0gbmV3IG9yZy5mb3JnZXJvY2suaHR0cC5wcm90b2NvbC5SZXF1ZXN0KCk7CiAgICByZXF1ZXN0LnNldFVyaSgiaHR0cDovL2lwLWFwaS5jb20vanNvbi8iICsgdXNlcklQKTsKICAgICAgcmVxdWVzdC5zZXRNZXRob2QoIkdFVCIpOwoKICAgIHZhciByZXNwb25zZSA9IGh0dHBDbGllbnQuc2VuZChyZXF1ZXN0KS5nZXQoKTsKICAgIGxvZ1Jlc3BvbnNlKHJlc3BvbnNlKTsKCiAgICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXNwb25zZS5nZXRFbnRpdHkoKS5nZXRTdHJpbmcoKSk7CiAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdC5jb3VudHJ5OwogICAgfQp9CgovKioKICogVXNlIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UncyBob3N0IG5hbWUgdG8gbG9va3VwIHRoZSBjb3VudHJ5IHdoZXJlIHRoZSByZXNvdXJjZSBpcyBob3N0ZWQuCiAqCiAqIEByZXR1cm5zIHsqfSBUaGUgY291bnRyeSBpbiB3aGljaCB0aGUgcmVzb3VyY2UgaXMgaG9zdGVkLgogKi8KZnVuY3Rpb24gZ2V0Q291bnRyeUZyb21SZXNvdXJjZVVSSSgpIHsKICAgIHZhciByZXF1ZXN0ID0gbmV3IG9yZy5mb3JnZXJvY2suaHR0cC5wcm90b2NvbC5SZXF1ZXN0KCk7CiAgICByZXF1ZXN0LnNldFVyaSgiaHR0cDovL2lwLWFwaS5jb20vanNvbi8iICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlc291cmNlSG9zdCkpOwogICAgICByZXF1ZXN0LnNldE1ldGhvZCgiR0VUIik7CgogICAgdmFyIHJlc3BvbnNlID0gaHR0cENsaWVudC5zZW5kKHJlcXVlc3QpLmdldCgpOwogICAgbG9nUmVzcG9uc2UocmVzcG9uc2UpOwoKICAgIHZhciByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3BvbnNlLmdldEVudGl0eSgpLmdldFN0cmluZygpKTsKICAgIGlmIChyZXN1bHQpIHsKICAgICAgICByZXR1cm4gcmVzdWx0LmNvdW50cnk7CiAgICB9Cn0KCi8qKgogKiBSZXRyaWV2ZSBhbmQgdmFsaWRhdGUgdGhlIHZhcmlhYmxlcyByZXF1aXJlZCB0byBtYWtlIHRoZSBleHRlcm5hbCBIVFRQIGNhbGxzLgogKgogKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2lsbCBiZSB0cnVlIGlmIHZhbGlkYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCiAqLwpmdW5jdGlvbiB2YWxpZGF0ZUFuZEluaXRpYWxpemVQYXJhbWV0ZXJzKCkgewogICAgdmFyIHVzZXJBZGRyZXNzU2V0ID0gaWRlbnRpdHkuZ2V0QXR0cmlidXRlKCJwb3N0YWxBZGRyZXNzIik7CiAgICBpZiAodXNlckFkZHJlc3NTZXQgPT0gbnVsbCB8fCB1c2VyQWRkcmVzc1NldC5pc0VtcHR5KCkpIHsKICAgICAgICBsb2dnZXIud2FybmluZygiTm8gYWRkcmVzcyBzcGVjaWZpZWQgZm9yIHVzZXI6ICIgKyB1c2VybmFtZSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdXNlckFkZHJlc3MgPSB1c2VyQWRkcmVzc1NldC5pdGVyYXRvcigpLm5leHQoKTsKICAgIGxvZ2dlci5tZXNzYWdlKCJVc2VyIGFkZHJlc3M6ICIgKyB1c2VyQWRkcmVzcyk7CgogICAgaWYgKCFlbnZpcm9ubWVudCkgewogICAgICAgIGxvZ2dlci53YXJuaW5nKCJObyBlbnZpcm9ubWVudCBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgZXZhbHVhdGlvbiByZXF1ZXN0LiIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB2YXIgaXBTZXQgPSBlbnZpcm9ubWVudC5nZXQoIklQIik7CiAgICBpZiAoaXBTZXQgPT0gbnVsbCB8fCBpcFNldC5pc0VtcHR5KCkpIHsKICAgICAgICBsb2dnZXIud2FybmluZygiTm8gSVAgc3BlY2lmaWVkIGluIHRoZSBldmFsdWF0aW9uIHJlcXVlc3QgZW52aXJvbm1lbnQgcGFyYW1ldGVycy4iKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB1c2VySVAgPSBpcFNldC5pdGVyYXRvcigpLm5leHQoKTsKICAgIGxvZ2dlci5tZXNzYWdlKCJVc2VyIElQOiAiICsgdXNlcklQKTsKCiAgICBpZiAoIXJlc291cmNlVVJJKSB7CiAgICAgICAgbG9nZ2VyLndhcm5pbmcoIk5vIHJlc291cmNlIFVSSSBzcGVjaWZpZWQuIik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmVzb3VyY2VIb3N0ID0gcmVzb3VyY2VVUkkubWF0Y2goL14oLio6XC9cLykod3d3XC4pPyhbQS1aYS16MC05XC1cLl0rKSg6WzAtOV0rKT8oLiopJC8pWzNdOwogICAgbG9nZ2VyLm1lc3NhZ2UoIlJlc291cmNlIGhvc3Q6ICIgKyByZXNvdXJjZUhvc3QpOwoKICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBsb2dSZXNwb25zZShyZXNwb25zZSkgewogICAgbG9nZ2VyLm1lc3NhZ2UoIlVzZXIgUkVTVCBDYWxsLiBTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSArICIsIEJvZHk6ICIgKyByZXNwb25zZS5nZXRFbnRpdHkoKS5nZXRTdHJpbmcoKSk7Cn0K\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"POLICY_CONDITION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"3d97c436-42c0-4dd0-a571-ea6f34f752b3\",\"name\":\"Itsme Profile Normalization\",\"description\":\"Normalizes raw profile data from Itsme\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAtMjAyMSBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgppbXBvcnQgc3RhdGljIG9yZy5mb3JnZXJvY2suanNvbi5Kc29uVmFsdWUuZmllbGQKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmpzb24KaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLm9iamVjdAoKaW1wb3J0IG9yZy5mb3JnZXJvY2suanNvbi5Kc29uVmFsdWUKCkpzb25WYWx1ZSBtYW5hZ2VkVXNlciA9IGpzb24ob2JqZWN0KAogICAgICAgIGZpZWxkKCJpZCIsIHJhd1Byb2ZpbGUuc3ViKSwKICAgICAgICBmaWVsZCgiZGlzcGxheU5hbWUiLCByYXdQcm9maWxlLm5hbWUpLAogICAgICAgIGZpZWxkKCJnaXZlbk5hbWUiLCByYXdQcm9maWxlLmdpdmVuX25hbWUpLAogICAgICAgIGZpZWxkKCJmYW1pbHlOYW1lIiwgcmF3UHJvZmlsZS5mYW1pbHlfbmFtZSksCiAgICAgICAgZmllbGQoInVzZXJuYW1lIiwgcmF3UHJvZmlsZS5lbWFpbCksCiAgICAgICAgZmllbGQoImVtYWlsIiwgcmF3UHJvZmlsZS5lbWFpbCkpKQpyZXR1cm4gbWFuYWdlZFVzZXI=\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"207f172f-ffb5-439d-b7df-e8e80408830b\",\"name\":\"GitHub Profile Normalization (VS) - imported (1)\",\"description\":\"Normalizes raw profile data from GitHub\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCmxvZ2dlci53YXJuaW5nKCJHaXRIdWIgcmF3UHJvZmlsZTogIityYXdQcm9maWxlKQoKcmV0dXJuIGpzb24ob2JqZWN0KAogICAgICAgIGZpZWxkKCJpZCIsIHJhd1Byb2ZpbGUuaWQpLAogICAgICAgIGZpZWxkKCJkaXNwbGF5TmFtZSIsIHJhd1Byb2ZpbGUubmFtZSksCiAgICAgICAgZmllbGQoImdpdmVuTmFtZSIsIHJhd1Byb2ZpbGUuZmlyc3RfbmFtZSksCiAgICAgICAgZmllbGQoImZhbWlseU5hbWUiLCByYXdQcm9maWxlLmxhc3RfbmFtZSksCiAgICAgICAgZmllbGQoInBob3RvVXJsIiwgcmF3UHJvZmlsZS5waWN0dXJlLmRhdGEudXJsKSwKICAgICAgICBmaWVsZCgiZW1haWwiLCByYXdQcm9maWxlLmVtYWlsKSwKICAgICAgICBmaWVsZCgidXNlcm5hbWUiLCByYXdQcm9maWxlLmVtYWlsKSkp\",\"default\":false,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"8862ca8f-7770-4af5-a888-ac0df0947f36\",\"name\":\"LinkedIn Profile Normalization\",\"description\":\"Normalizes raw profile data from LinkedIn\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLmlkKSwKICAgICAgICBmaWVsZCgiZ2l2ZW5OYW1lIiwgcmF3UHJvZmlsZS5maXJzdE5hbWUubG9jYWxpemVkLmdldCgwKSksCiAgICAgICAgZmllbGQoImZhbWlseU5hbWUiLCByYXdQcm9maWxlLmxhc3ROYW1lLmxvY2FsaXplZC5nZXQoMCkpLAogICAgICAgIGZpZWxkKCJwaG90b1VybCIsIHJhd1Byb2ZpbGUucHJvZmlsZVBpY3R1cmUuZGlzcGxheUltYWdlKSwKICAgICAgICBmaWVsZCgiZW1haWwiLCByYXdQcm9maWxlLmVsZW1lbnRzLmdldCgwKS5nZXQoImhhbmRsZX4iKS5lbWFpbEFkZHJlc3MpLAogICAgICAgIGZpZWxkKCJ1c2VybmFtZSIsIHJhd1Byb2ZpbGUuZWxlbWVudHMuZ2V0KDApLmdldCgiaGFuZGxlfiIpLmVtYWlsQWRkcmVzcykpKQ==\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"248b8a56-df81-4b1b-b4ba-45d994f6504c\",\"name\":\"SAML2 IDP Adapter Script\",\"description\":\"Default global script for SAML2 IDP Adapter\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjEtMjAyMyBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogVXNlIG9mIHRoaXMgY29kZSByZXF1aXJlcyBhIGNvbW1lcmNpYWwgc29mdHdhcmUgbGljZW5zZSB3aXRoIEZvcmdlUm9jayBBUy4KICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgovKgogKiBUaGUgc2NyaXB0IGhhcyB0aGVzZSB0b3AgbGV2ZWwgZnVuY3Rpb25zIHRoYXQgY291bGQgYmUgZXhlY3V0ZWQgZHVyaW5nIGEgU0FNTDIgZmxvdy4KICogICAgICAtIHByZVNpbmdsZVNpZ25PbgogKiAgICAgIC0gcHJlQXV0aGVudGljYXRpb24KICogICAgICAtIHByZVNlbmRSZXNwb25zZQogKiAgICAgIC0gcHJlU2lnblJlc3BvbnNlCiAqICAgICAgLSBwcmVTZW5kRmFpbHVyZVJlc3BvbnNlCiAqCiAqIFBsZWFzZSBzZWUgdGhlIGphdmFkb2MgZm9yIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBhbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBtZXRob2RzLgogKiBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcGx1Z2lucy9TQU1MMklkZW50aXR5UHJvdmlkZXJBZGFwdGVyLmh0bWwKICogTm90ZSB0aGF0IHRoZSBpbml0aWFsaXplIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBzY3JpcHRzLgogKgogKiBEZWZpbmVkIHZhcmlhYmxlcy4gQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlIHJlc3BlY3RpdmUgZnVuY3Rpb25zIGZvciB0aGUgdmFyaWFibGVzIGF2YWlsYWJsZSB0byBpdC4KICoKICogaG9zdGVkRW50aXR5SWQgLSBTdHJpbmcKICogICAgIEVudGl0eSBJRCBmb3IgdGhlIGhvc3RlZCBJRFAKICogcmVhbG0gLSBTdHJpbmcKICogICAgIFJlYWxtIG9mIHRoZSBob3N0ZWQgSURQCiAqIGlkcEFkYXB0ZXJTY3JpcHRIZWxwZXIgLSBJZHBBZGFwdGVyU2NyaXB0SGVscGVyICgxKQogKiAgICAgQW4gaW5zdGFuY2Ugb2YgSWRwQWRhcHRlclNjcmlwdEhlbHBlciBjb250YWluaW5nIGhlbHBlciBtZXRob2RzLiBTZWUgSmF2YWRvYyBmb3IgbW9yZSBkZXRhaWxzLgogKiByZXF1ZXN0IC0gSHR0cFNlcnZsZXRSZXF1ZXN0ICgyKQogKiAgICAgU2VydmxldCByZXF1ZXN0IG9iamVjdAogKiByZXNwb25zZSAtIEh0dHBTZXJ2bGV0UmVzcG9uc2UgKDMpCiAqICAgICBTZXJ2bGV0IHJlc3BvbnNlIG9iamVjdAogKiBhdXRoblJlcXVlc3QgLSBBdXRoblJlcXVlc3QgKDQpCiAqICAgICBUaGUgb3JpZ2luYWwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBzZW50IGZyb20gU1AKICogcmVxSWQgLSBTdHJpbmcKICogICAgIFRoZSBpZCB0byB1c2UgZm9yIGNvbnRpbnVhdGlvbiBvZiBwcm9jZXNzaW5nIGlmIHRoZSBhZGFwdGVyIHJlZGlyZWN0cwogKiByZXMgLSBSZXNwb25zZSAoNSkKICogICAgIFRoZSBTQU1MIFJlc3BvbnNlCiAqIHNlc3Npb24gLSBTU09Ub2tlbiAoNikKICogICAgIFRoZSBzaW5nbGUgc2lnbi1vbiBzZXNzaW9uLiBUaGUgcmVmZXJlbmNlIHR5cGUgb2YgdGhpcyBpcyBPYmplY3QgYW5kIHdvdWxkIG5lZWQgdG8gYmUgY2FzdGVkIHRvIFNTT1Rva2VuLgogKiByZWxheVN0YXRlIC0gU3RyaW5nCiAqICAgICBUaGUgcmVsYXlTdGF0ZSB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgcmVkaXJlY3QKICogZmF1bHRDb2RlIC0gU3RyaW5nCiAqICAgICB0aGUgZmF1bHQgY29kZSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIFNBTUwgcmVzcG9uc2UKICogZmF1bHREZXRhaWwgLSBTdHJpbmcKICogICAgIHRoZSBmYXVsdCBkZXRhaWwgdGhhdCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBTQU1MIHJlc3BvbnNlCiAqIGxvZ2dlciAtIExvZ2dlciBpbnN0YW5jZQogKiAgICAgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMy9zY3JpcHRpbmctZ3VpZGUvc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLmh0bWwuCiAqICAgICBDb3JyZXNwb25kaW5nIGxvZyBmaWxlcyB3aWxsIGJlIHByZWZpeGVkIHdpdGg6IHNjcmlwdHMuPHNjcmlwdCBuYW1lPgogKgogKiBUaHJvd3MgU0FNTDJFeGNlcHRpb24gKDcpOgogKiAgICAgZm9yIGFueSBleGNlcHRpb25zIG9jY3VycmluZyBpbiB0aGUgYWRhcHRlci4gVGhlIGZlZGVyYXRpb24gcHJvY2VzcyB3aWxsIGNvbnRpbnVlCiAqCiAqIENsYXNzIHJlZmVyZW5jZToKICogKDEpIGlkcEFkYXB0ZXJTY3JpcHRIZWxwZXIgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcGx1Z2lucy9zY3JpcHRlZC9JZHBBZGFwdGVyU2NyaXB0SGVscGVyLmh0bWwuCiAqICgyKSBIdHRwU2VydmxldFJlcXVlc3QgLSBodHRwczovL3RvbWNhdC5hcGFjaGUub3JnL3RvbWNhdC03LjAtZG9jL3NlcnZsZXRhcGkvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdC5odG1sLgogKiAoMykgSHR0cFNlcnZsZXRSZXNwb25zZSAtIGh0dHBzOi8vdG9tY2F0LmFwYWNoZS5vcmcvdG9tY2F0LTcuMC1kb2Mvc2VydmxldGFwaS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZS5odG1sLgogKiAoNCkgQXV0aG5SZXF1ZXN0IC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMy9fYXR0YWNobWVudHMvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL3Byb3RvY29sL0F1dGhuUmVxdWVzdC5odG1sLgogKiAoNSkgUmVzcG9uc2UgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy4zL19hdHRhY2htZW50cy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvc2FtbDIvcHJvdG9jb2wvUmVzcG9uc2UuaHRtbC4KICogKDYpIFNTT1Rva2VuIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMy9fYXR0YWNobWVudHMvYXBpZG9jcy9jb20vaXBsYW5ldC9zc28vU1NPVG9rZW4uaHRtbC4KICogKDcpIFNBTUwyRXhjZXB0aW9uIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcuMy9fYXR0YWNobWVudHMvYXBpZG9jcy9jb20vc3VuL2lkZW50aXR5L3NhbWwyL2NvbW1vbi9TQU1MMkV4Y2VwdGlvbi5odG1sLgogKi8KCi8qCiAqIFRlbXBsYXRlL2RlZmF1bHQgc2NyaXB0IGZvciBTQU1MMiBJRFAgQWRhcHRlciBzY3JpcHRlZCBwbHVnaW4uCiAqLwoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcHJlU2luZ2xlU2lnbk9uOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICBpZHBBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICByZXF1ZXN0CiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHJlc3BvbnNlCiAqICAgICByZXFJZAogKiAgICAgbG9nZ2VyCiAqCiAqIFJldHVybiAtIHRydWUgaWYgYnJvd3NlciByZWRpcmVjdGlvbiBpcyBoYXBwZW5pbmcgYWZ0ZXIgcHJvY2Vzc2luZywgZmFsc2Ugb3RoZXJ3aXNlLiBEZWZhdWx0IHRvIGZhbHNlLgogKi8KZnVuY3Rpb24gcHJlU2luZ2xlU2lnbk9uICgpIHsKICAgIHJldHVybiBmYWxzZTsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcHJlQXV0aGVudGljYXRpb246CiAqICAgICBob3N0ZWRFbnRpdHlJZAogKiAgICAgcmVhbG0KICogICAgIGlkcEFkYXB0ZXJTY3JpcHRIZWxwZXIKICogICAgIHJlcXVlc3QKICogICAgIGF1dGhuUmVxdWVzdAogKiAgICAgcmVzcG9uc2UKICogICAgIHJlcUlkCiAqICAgICBzZXNzaW9uCiAqICAgICByZWxheVN0YXRlCiAqICAgICBsb2dnZXIKICoKICogUmV0dXJuIC0gdHJ1ZSBpZiBicm93c2VyIHJlZGlyZWN0aW9uIGlzIGhhcHBlbmluZyBhZnRlciBwcm9jZXNzaW5nLCBmYWxzZSBvdGhlcndpc2UuIERlZmF1bHQgdG8gZmFsc2UuCiAqLwpmdW5jdGlvbiBwcmVBdXRoZW50aWNhdGlvbiAoKSB7CiAgICByZXR1cm4gZmFsc2U7Cn0KCi8qCiAqIEF2YWlsYWJsZSB2YXJpYWJsZXMgZm9yIHByZVNlbmRSZXNwb25zZToKICogICAgIGhvc3RlZEVudGl0eUlkCiAqICAgICByZWFsbQogKiAgICAgaWRwQWRhcHRlclNjcmlwdEhlbHBlcgogKiAgICAgcmVxdWVzdAogKiAgICAgYXV0aG5SZXF1ZXN0CiAqICAgICByZXNwb25zZQogKiAgICAgcmVxSWQKICogICAgIHNlc3Npb24KICogICAgIHJlbGF5U3RhdGUKICogICAgIGxvZ2dlcgogKgogKiBSZXR1cm4gLSB0cnVlIGlmIGJyb3dzZXIgcmVkaXJlY3Rpb24gaGFwcGVuZWQgYWZ0ZXIgcHJvY2Vzc2luZywgZmFsc2Ugb3RoZXJ3aXNlLiBEZWZhdWx0IHRvIGZhbHNlLgogKi8KZnVuY3Rpb24gcHJlU2VuZFJlc3BvbnNlICgpIHsKICAgIHJldHVybiBmYWxzZTsKfQoKLyoKICogQXZhaWxhYmxlIHZhcmlhYmxlcyBmb3IgcHJlU2lnblJlc3BvbnNlOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICBpZHBBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICByZXF1ZXN0CiAqICAgICBhdXRoblJlcXVlc3QKICogICAgIHNlc3Npb24KICogICAgIHJlbGF5U3RhdGUKICogICAgIHJlcwogKiAgICAgbG9nZ2VyCiAqLwpmdW5jdGlvbiBwcmVTaWduUmVzcG9uc2UgKCkgewp9CgovKgogKiBBdmFpbGFibGUgdmFyaWFibGVzIGZvciBwcmVTZW5kRmFpbHVyZVJlc3BvbnNlOgogKiAgICAgaG9zdGVkRW50aXR5SWQKICogICAgIHJlYWxtCiAqICAgICBpZHBBZGFwdGVyU2NyaXB0SGVscGVyCiAqICAgICByZXF1ZXN0CiAqICAgICByZXNwb25zZQogKiAgICAgZmF1bHRDb2RlCiAqICAgICBmYXVsdERldGFpbAogKiAgICAgbG9nZ2VyCiAqLwpmdW5jdGlvbiBwcmVTZW5kRmFpbHVyZVJlc3BvbnNlICgpIHsKfQ==\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"SAML2_IDP_ADAPTER\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"6325cf19-a49b-471e-8d26-7e4df76df0e2\",\"name\":\"Okta Profile Normalization\",\"description\":\"Normalizes raw profile data from GitHub\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjIgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCmxvZ2dlci53YXJuaW5nKCJPa3RhIHJhd1Byb2ZpbGU6ICIrcmF3UHJvZmlsZSkKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLmlkKSwKICAgICAgICBmaWVsZCgiZGlzcGxheU5hbWUiLCByYXdQcm9maWxlLm5hbWUpLAogICAgICAgIGZpZWxkKCJnaXZlbk5hbWUiLCByYXdQcm9maWxlLmZpcnN0X25hbWUpLAogICAgICAgIGZpZWxkKCJmYW1pbHlOYW1lIiwgcmF3UHJvZmlsZS5sYXN0X25hbWUpLAogICAgICAgIGZpZWxkKCJwaG90b1VybCIsIHJhd1Byb2ZpbGUucGljdHVyZS5kYXRhLnVybCksCiAgICAgICAgZmllbGQoImVtYWlsIiwgcmF3UHJvZmlsZS5lbWFpbCksCiAgICAgICAgZmllbGQoInVzZXJuYW1lIiwgcmF3UHJvZmlsZS5wcmVmZXJyZWRfdXNlcm5hbWUpKSk=\",\"default\":false,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"d22f9a0c-426a-4466-b95e-d0f125b0d5fa\",\"name\":\"OAuth2 Access Token Modification Script\",\"description\":\"Default global script for OAuth2 Access Token Modification\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMTktMjAyMyBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMKICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdAogKiB0byBzdWNoIGxpY2Vuc2UgYmV0d2VlbiB0aGUgbGljZW5zZWUgYW5kIEZvcmdlUm9jayBBUy4KICovCgovKgogKiBUaGlzIHNjcmlwdCBsZXRzIHlvdSBtb2RpZnkgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIE9BdXRoMiBhY2Nlc3MgdG9rZW4KICogd2l0aCBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZSBBY2Nlc3NUb2tlbiAoMSkgaW50ZXJmYWNlLgogKiBUaGUgY2hhbmdlcyBtYWRlIHRvIE9BdXRoMiBhY2Nlc3MgdG9rZW5zIHdpbGwgZGlyZWN0bHkgaW1wYWN0IHRoZSBzaXplIG9mIHRoZSBDVFMgdG9rZW5zLAogKiBhbmQsIHNpbWlsYXJseSwgdGhlIHNpemUgb2YgdGhlIEpXVHMgaWYgY2xpZW50LWJhc2VkIE9BdXRoMiB0b2tlbnMgYXJlIHV0aWxpemVkLgogKiBXaGVuIGFkZGluZy91cGRhdGluZyBmaWVsZHMgbWFrZSBzdXJlIHRoYXQgdGhlIHRva2VuIHNpemUgcmVtYWlucyB3aXRoaW4gY2xpZW50L3VzZXItYWdlbnQgbGltaXRzLgogKgogKiBEZWZpbmVkIHZhcmlhYmxlczoKICogYWNjZXNzVG9rZW4gLSBBY2Nlc3NUb2tlbiAoMSkuCiAqICAgICAgICAgICAgICAgVGhlIGFjY2VzcyB0b2tlbiB0byBiZSB1cGRhdGVkLgogKiAgICAgICAgICAgICAgIE11dGFibGUgb2JqZWN0LCBhbGwgY2hhbmdlcyB0byB0aGUgYWNjZXNzIHRva2VuIHdpbGwgYmUgcmVmbGVjdGVkLgogKiBzY29wZXMgLSBTZXQ8U3RyaW5nPiAoNikuCiAqICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCB0aGUgcmVxdWVzdGVkIHNjb3Blcy4KICogcmVxdWVzdFByb3BlcnRpZXMgLSBVbm1vZGlmaWFibGUgTWFwICg1KS4KICogICAgICAgICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgY29udGFpbnMgYSBtYXAgb2YgcmVxdWVzdCBwcm9wZXJ0aWVzOgogKiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RVcmkgLSBUaGUgcmVxdWVzdCBVUkkuCiAqICAgICAgICAgICAgICAgICAgICAgcmVhbG0gLSBUaGUgcmVhbG0gdGhhdCB0aGUgcmVxdWVzdCByZWxhdGVzIHRvLgogKiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXJhbXMgLSBBIG1hcCBvZiB0aGUgcmVxdWVzdCBwYXJhbXMgYW5kL29yIHBvc3RlZCBkYXRhLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFYWNoIHZhbHVlIGlzIGEgbGlzdCBvZiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIHNob3VsZCBiZSBoYW5kbGVkIGluIGFjY29yZGFuY2Ugd2l0aCBPV0FTUCBiZXN0IHByYWN0aWNlczoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9vd2FzcC5vcmcvd3d3LWNvbW11bml0eS92dWxuZXJhYmlsaXRpZXMvVW5zYWZlX3VzZV9vZl9SZWZsZWN0aW9uLgogKiBjbGllbnRQcm9wZXJ0aWVzIC0gVW5tb2RpZmlhYmxlIE1hcCAoNSkuCiAqICAgICAgICAgICAgICAgICAgICBQcmVzZW50IGlmIHRoZSBjbGllbnQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyBpZGVudGlmaWVkLCBjb250YWlucyBhIG1hcCBvZiBjbGllbnQgcHJvcGVydGllczoKICogICAgICAgICAgICAgICAgICAgIGNsaWVudElkIC0gVGhlIGNsaWVudCdzIFVSSSBmb3IgdGhlIHJlcXVlc3QgbG9jYWxlLgogKiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyYW50VHlwZXMgLSBMaXN0IG9mIHRoZSBhbGxvd2VkIGdyYW50IHR5cGVzIChvcmcuZm9yZ2Vyb2NrLm9hdXRoMi5jb3JlLkdyYW50VHlwZSkgZm9yIHRoZSBjbGllbnQuCiAqICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUmVzcG9uc2VUeXBlcyAtIExpc3Qgb2YgdGhlIGFsbG93ZWQgcmVzcG9uc2UgdHlwZXMgZm9yIHRoZSBjbGllbnQuCiAqICAgICAgICAgICAgICAgICAgICBhbGxvd2VkU2NvcGVzIC0gTGlzdCBvZiB0aGUgYWxsb3dlZCBzY29wZXMgZm9yIHRoZSBjbGllbnQuCiAqICAgICAgICAgICAgICAgICAgICBjdXN0b21Qcm9wZXJ0aWVzIC0gQSBtYXAgb2YgdGhlIGN1c3RvbSBwcm9wZXJ0aWVzIG9mIHRoZSBjbGllbnQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdHMgb3IgbWFwcyB3aWxsIGJlIGluY2x1ZGVkIGFzIHN1Yi1tYXBzOyBmb3IgZXhhbXBsZToKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21NYXBbS2V5MV09VmFsdWUxIHdpbGwgYmUgcmV0dXJuZWQgYXMgY3VzdG9tTWFwIC0+IEtleTEgLT4gVmFsdWUxLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvIGFkZCBjdXN0b20gcHJvcGVydGllcyB0byBhIGNsaWVudCwgdXBkYXRlIHRoZSBDdXN0b20gUHJvcGVydGllcyBmaWVsZAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEFNIENvbnNvbGUgPiBSZWFsbSBOYW1lID4gQXBwbGljYXRpb25zID4gT0F1dGggMi4wID4gQ2xpZW50cyA+IENsaWVudCBJRCA+IEFkdmFuY2VkLgogKiBpZGVudGl0eSAtIEFNSWRlbnRpdHkgKDMpLgogKiAgICAgICAgICAgIEFsd2F5cyBwcmVzZW50LCB0aGUgaWRlbnRpdHkgb2YgdGhlIHJlc291cmNlIG93bmVyLgogKiBzZXNzaW9uIC0gU1NPVG9rZW4gKDQpLgogKiAgICAgICAgICAgUHJlc2VudCBpZiB0aGUgcmVxdWVzdCBjb250YWlucyB0aGUgc2Vzc2lvbiBjb29raWUsIHRoZSB1c2VyJ3Mgc2Vzc2lvbiBvYmplY3QuCiAqIHNjcmlwdE5hbWUgLSBTdHJpbmcgKHByaW1pdGl2ZSkuCiAqICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgc2NyaXB0LgogKiBsb2dnZXIgLSBBbHdheXMgcHJlc2VudCwgdGhlICJPQXV0aDJQcm92aWRlciIgZGVidWcgbG9nZ2VyIGluc3RhbmNlOgogKiAgICAgICAgICBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9zY3JpcHRpbmctZ3VpZGUvc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLmh0bWwjc2NyaXB0aW5nLWFwaS1nbG9iYWwtbG9nZ2VyLgogKiAgICAgICAgICBDb3JyZXNwb25kaW5nIGxvZyBmaWxlcyB3aWxsIGJlIHByZWZpeGVkIHdpdGg6IHNjcmlwdHMuT0FVVEgyX0FDQ0VTU19UT0tFTl9NT0RJRklDQVRJT04uCiAqIGh0dHBDbGllbnQgLSBIVFRQIENsaWVudCAoOCkuCiAqICAgICAgICAgICAgICBBbHdheXMgcHJlc2VudCwgdGhlIEhUVFAgQ2xpZW50IGluc3RhbmNlOgogKiAgICAgICAgICAgICAgaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvc2NyaXB0aW5nLWd1aWRlL3NjcmlwdGluZy1hcGktZ2xvYmFsLWh0dHAtY2xpZW50Lmh0bWwjc2NyaXB0aW5nLWFwaS1nbG9iYWwtaHR0cC1jbGllbnQuCiAqCiAqIFJldHVybiAtIG5vIHZhbHVlIGlzIGV4cGVjdGVkLCBjaGFuZ2VzIHNoYWxsIGJlIG1hZGUgdG8gdGhlIGFjY2Vzc1Rva2VuIHBhcmFtZXRlciBkaXJlY3RseS4KICoKICogQ2xhc3MgcmVmZXJlbmNlOgogKiAoMSkgQWNjZXNzVG9rZW4gLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL29yZy9mb3JnZXJvY2svb2F1dGgyL2NvcmUvQWNjZXNzVG9rZW4uaHRtbC4KICogKDMpIEFNSWRlbnRpdHkgLSBodHRwczovL2JhY2tzdGFnZS5mb3JnZXJvY2suY29tL2RvY3MvYW0vNy9hcGlkb2NzL2NvbS9zdW4vaWRlbnRpdHkvaWRtL0FNSWRlbnRpdHkuaHRtbC4KICogKDQpIFNTT1Rva2VuIC0gaHR0cHM6Ly9iYWNrc3RhZ2UuZm9yZ2Vyb2NrLmNvbS9kb2NzL2FtLzcvYXBpZG9jcy9jb20vaXBsYW5ldC9zc28vU1NPVG9rZW4uaHRtbC4KICogKDUpIE1hcCAtIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL3V0aWwvSGFzaE1hcC5odG1sLAogKiAgICAgICAgICAgb3IgaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvdXRpbC9MaW5rZWRIYXNoTWFwLmh0bWwuCiAqICg2KSBTZXQgLSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS91dGlsL0hhc2hTZXQuaHRtbC4KICogKDgpIENsaWVudCAtIGh0dHBzOi8vYmFja3N0YWdlLmZvcmdlcm9jay5jb20vZG9jcy9hbS83L2FwaWRvY3Mvb3JnL2Zvcmdlcm9jay9odHRwL0NsaWVudC5odG1sLgogKi8KCi8qIEVYQU1QTEUKKGZ1bmN0aW9uICgpIHsKICAgIHZhciBmckphdmEgPSBKYXZhSW1wb3J0ZXIoCiAgICAgICAgb3JnLmZvcmdlcm9jay5odHRwLnByb3RvY29sLlJlcXVlc3QsCiAgICAgICAgb3JnLmZvcmdlcm9jay5odHRwLnByb3RvY29sLlJlc3BvbnNlCiAgICApOwoKICAgIC8vIEFsd2F5cyBpbmNsdWRlcyB0aGlzIGZpZWxkIGluIHRoZSB0b2tlbi4KICAgIGFjY2Vzc1Rva2VuLnNldEZpZWxkKCdrZXkxJywgJ3ZhbHVlMScpOwoKICAgIC8vIFJlY2VpdmVzIGFuZCBhZGRzIHRvIHRoZSBhY2Nlc3MgdG9rZW4gYWRkaXRpb25hbCB2YWx1ZXMgYnkgcGVyZm9ybWluZyBhIFJFU1QgY2FsbCB0byBhbiBleHRlcm5hbCBzZXJ2aWNlLgogICAgLy8gV0FSTklORzogQmVsb3csIHlvdSB3aWxsIGZpbmQgYSByZWZlcmVuY2UgdG8gYSB0aGlyZC1wYXJ0eSBzaXRlLCB3aGljaCBpcyBwcm92aWRlZCBvbmx5IGFzIGFuIGV4YW1wbGUuCiAgICB2YXIgdXJpID0gJ2h0dHBzOi8vanNvbnBsYWNlaG9sZGVyLnR5cGljb2RlLmNvbS9wb3N0cyc7CgogICAgdHJ5IHsKICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBmckphdmEuUmVxdWVzdCgpOwoKICAgICAgICAvLyBZb3UgY2FuIGNoYWluIG1ldGhvZHMgdGhhdCByZXR1cm4gdGhlIHJlcXVlc3Qgb2JqZWN0LgogICAgICAgIHJlcXVlc3Quc2V0VXJpKHVyaSkKICAgICAgICAgICAgLnNldE1ldGhvZCgnUE9TVCcpCiAgICAgICAgICAgIC5zZXRFbnRpdHkoSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgdXBkYXRlZEZpZWxkczogewogICAgICAgICAgICAgICAgICAgIGtleTI6ICd2YWx1ZTInLAogICAgICAgICAgICAgICAgICAgIGtleTM6ICd2YWx1ZTMnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKCiAgICAgICAgLy8gWW91IGNhbiBjYWxsIGEgbWV0aG9kIHdoZW4gY2hhaW5pbmcgaXMgbm90IHBvc3NpYmxlLgogICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLmFkZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgnKTsKCiAgICAgICAgLy8gU2VuZHMgdGhlIHJlcXVlc3QgYW5kIHJlY2VpdmVzIHRoZSByZXNwb25zZS4KICAgICAgICB2YXIgcmVzcG9uc2UgPSBodHRwQ2xpZW50LnNlbmQocmVxdWVzdCkuZ2V0T3JUaHJvdygpOwoKICAgICAgICAvLyBDaGVja3MgaWYgdGhlIHJlc3BvbnNlIHN0YXR1cyBpcyBhcyBleHBlY3RlZC4KICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzKCkgPT09IG9yZy5mb3JnZXJvY2suaHR0cC5wcm90b2NvbC5TdGF0dXMuQ1JFQVRFRCkgewogICAgICAgICAgICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXNwb25zZS5nZXRFbnRpdHkoKS5nZXRTdHJpbmcoKSk7CgogICAgICAgICAgICAvLyBTZXQgbXVsdGlwbGUgdG9rZW4gZmllbGRzIGF0IG9uY2UuCiAgICAgICAgICAgIGFjY2Vzc1Rva2VuLnNldEZpZWxkcyhyZXN1bHQudXBkYXRlZEZpZWxkcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gb2J0YWluIGFjY2VzcyB0b2tlbiBtb2RpZmljYXRpb25zLiBTdGF0dXM6ICcgKyByZXNwb25zZS5nZXRTdGF0dXMoKSArICcuIENvbnRlbnQ6ICcgKyByZXNwb25zZS5nZXRFbnRpdHkoKS5nZXRTdHJpbmcoKSk7CiAgICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAgIGxvZ2dlci5lcnJvcignVGhlIHJlcXVlc3QgcHJvY2Vzc2luZyB3YXMgaW50ZXJydXB0ZWQuICcgKyBlKTsKCiAgICAgICAgLy8gVGhlIGFjY2VzcyB0b2tlbiByZXF1ZXN0IGZhaWxzIHdpdGggdGhlIEhUVFAgNTAwIGVycm9yIGluIHRoaXMgY2FzZS4KICAgICAgICB0aHJvdyAoJ1VuYWJsZSB0byBvYnRhaW4gcmVzcG9uc2UgZnJvbTogJyArIHVyaSk7CiAgICB9CgogICAgLy8gQWRkcyBuZXcgZmllbGRzIGNvbnRhaW5pbmcgaWRlbnRpdHkgYXR0cmlidXRlIHZhbHVlcyB0byB0aGUgYWNjZXNzIHRva2VuLgogICAgYWNjZXNzVG9rZW4uc2V0RmllbGQoJ21haWwnLCBpZGVudGl0eS5nZXRBdHRyaWJ1dGUoJ21haWwnKSk7CiAgICBhY2Nlc3NUb2tlbi5zZXRGaWVsZCgncGhvbmUnLCBpZGVudGl0eS5nZXRBdHRyaWJ1dGUoJ3RlbGVwaG9uZU51bWJlcicpLnRvQXJyYXkoKVswXSk7CgogICAgLy8gQWRkcyBuZXcgZmllbGRzIGNvbnRhaW5pbmcgdGhlIHNlc3Npb24gcHJvcGVydHkgdmFsdWVzLgogICAgLy8gTk9URTogc2Vzc2lvbiBtYXkgbm90IGJlIGF2YWlsYWJsZSBmb3Igbm9uLWludGVyYWN0aXZlIGF1dGhvcml6YXRpb24gZ3JhbnRzLgogICAgaWYgKHNlc3Npb24pIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBhY2Nlc3NUb2tlbi5zZXRGaWVsZCgnaXBBZGRyZXNzJywgc2Vzc2lvbi5nZXRQcm9wZXJ0eSgnSG9zdCcpKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHJldHJpZXZlIHNlc3Npb24gcHJvcGVydHkgdmFsdWUuICcgKyBlKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gUmVtb3ZlcyBhIG5hdGl2ZSBmaWVsZCBmcm9tIHRoZSB0b2tlbiBlbnRyeSwgdGhhdCB3YXMgc2V0IGJ5IEFNLgogICAgLy8gV0FSTklORzogcmVtb3ZpbmcgbmF0aXZlIGZpZWxkcyBmcm9tIHRoZSB0b2tlbiBtYXkgcmVzdWx0IGluIGxvc3Mgb2YgZnVuY3Rpb25hbGl0eS4KICAgIC8vIGFjY2Vzc1Rva2VuLnJlbW92ZVRva2VuTmFtZSgpCgogICAgLy8gTm8gcmV0dXJuIHZhbHVlIGlzIGV4cGVjdGVkLiBMZXQgaXQgYmUgdW5kZWZpbmVkLgp9KCkpOwoqLwo=\",\"default\":true,\"language\":\"JAVASCRIPT\",\"context\":\"OAUTH2_ACCESS_TOKEN_MODIFICATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"4c963bb3-7084-43d0-bcdc-a47482cf1825\",\"name\":\"Dummy\",\"description\":\"Dummy\",\"script\":\"Cm91dGNvbWUgPSAidHJ1ZSI7Cg==\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"AUTHENTICATION_TREE_DECISION_NODE\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"2.0\"},{\"_id\":\"58d29080-4563-480b-89bb-1e7719776a21\",\"name\":\"Google Profile Normalization\",\"description\":\"Normalizes raw profile data from Google\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLnN1YiksCiAgICAgICAgZmllbGQoImRpc3BsYXlOYW1lIiwgcmF3UHJvZmlsZS5uYW1lKSwKICAgICAgICBmaWVsZCgiZ2l2ZW5OYW1lIiwgcmF3UHJvZmlsZS5naXZlbl9uYW1lKSwKICAgICAgICBmaWVsZCgiZmFtaWx5TmFtZSIsIHJhd1Byb2ZpbGUuZmFtaWx5X25hbWUpLAogICAgICAgIGZpZWxkKCJwaG90b1VybCIsIHJhd1Byb2ZpbGUucGljdHVyZSksCiAgICAgICAgZmllbGQoImVtYWlsIiwgcmF3UHJvZmlsZS5lbWFpbCksCiAgICAgICAgZmllbGQoInVzZXJuYW1lIiwgcmF3UHJvZmlsZS5lbWFpbCksCiAgICAgICAgZmllbGQoImxvY2FsZSIsIHJhd1Byb2ZpbGUubG9jYWxlKSkp\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"472534ec-a25f-468d-a606-3fb1935190df\",\"name\":\"WeChat Profile Normalization\",\"description\":\"Normalizes raw profile data from WeChat\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLm9wZW5pZCksCiAgICAgICAgZmllbGQoImRpc3BsYXlOYW1lIiwgcmF3UHJvZmlsZS5uaWNrbmFtZSksCiAgICAgICAgZmllbGQoInBob3RvVXJsIiwgcmF3UHJvZmlsZS5oZWFkaW1ndXJsKSwKICAgICAgICBmaWVsZCgidXNlcm5hbWUiLCByYXdQcm9maWxlLm5pY2tuYW1lKSkp\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"bae1d54a-e97d-4997-aa5d-c027f21af82c\",\"name\":\"Facebook Profile Normalization\",\"description\":\"Normalizes raw profile data from Facebook\",\"script\":\"LyoKICogQ29weXJpZ2h0IDIwMjAgRm9yZ2VSb2NrIEFTLiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqCiAqIFVzZSBvZiB0aGlzIGNvZGUgcmVxdWlyZXMgYSBjb21tZXJjaWFsIHNvZnR3YXJlIGxpY2Vuc2Ugd2l0aCBGb3JnZVJvY2sgQVMuCiAqIG9yIHdpdGggb25lIG9mIGl0cyBhZmZpbGlhdGVzLiBBbGwgdXNlIHNoYWxsIGJlIGV4Y2x1c2l2ZWx5IHN1YmplY3QKICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuCiAqLwoKaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5qc29uCmltcG9ydCBzdGF0aWMgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZS5vYmplY3QKCnJldHVybiBqc29uKG9iamVjdCgKICAgICAgICBmaWVsZCgiaWQiLCByYXdQcm9maWxlLmlkKSwKICAgICAgICBmaWVsZCgiZGlzcGxheU5hbWUiLCByYXdQcm9maWxlLm5hbWUpLAogICAgICAgIGZpZWxkKCJnaXZlbk5hbWUiLCByYXdQcm9maWxlLmZpcnN0X25hbWUpLAogICAgICAgIGZpZWxkKCJmYW1pbHlOYW1lIiwgcmF3UHJvZmlsZS5sYXN0X25hbWUpLAogICAgICAgIGZpZWxkKCJwaG90b1VybCIsIHJhd1Byb2ZpbGUucGljdHVyZS5kYXRhLnVybCksCiAgICAgICAgZmllbGQoImVtYWlsIiwgcmF3UHJvZmlsZS5lbWFpbCksCiAgICAgICAgZmllbGQoInVzZXJuYW1lIiwgcmF3UHJvZmlsZS5lbWFpbCkpKQ==\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"},{\"_id\":\"58c824ae-84ed-4724-82cd-db128fc3f6c\",\"name\":\"Normalized Profile to Managed User\",\"description\":\"Converts a normalized social profile into a managed user\",\"script\":\"Ii8qXG4gKiBDb3B5cmlnaHQgMjAyMCBGb3JnZVJvY2sgQVMuIEFsbCBSaWdodHMgUmVzZXJ2ZWRcbiAqXG4gKiBVc2Ugb2YgdGhpcyBjb2RlIHJlcXVpcmVzIGEgY29tbWVyY2lhbCBzb2Z0d2FyZSBsaWNlbnNlIHdpdGggRm9yZ2VSb2NrIEFTLlxuICogb3Igd2l0aCBvbmUgb2YgaXRzIGFmZmlsaWF0ZXMuIEFsbCB1c2Ugc2hhbGwgYmUgZXhjbHVzaXZlbHkgc3ViamVjdFxuICogdG8gc3VjaCBsaWNlbnNlIGJldHdlZW4gdGhlIGxpY2Vuc2VlIGFuZCBGb3JnZVJvY2sgQVMuXG4gKi9cblxuaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLmZpZWxkXG5pbXBvcnQgc3RhdGljIG9yZy5mb3JnZXJvY2suanNvbi5Kc29uVmFsdWUuanNvblxuaW1wb3J0IHN0YXRpYyBvcmcuZm9yZ2Vyb2NrLmpzb24uSnNvblZhbHVlLm9iamVjdFxuXG5pbXBvcnQgb3JnLmZvcmdlcm9jay5qc29uLkpzb25WYWx1ZVxuXG5Kc29uVmFsdWUgbWFuYWdlZFVzZXIgPSBqc29uKG9iamVjdChcbiAgICAgICAgZmllbGQoXCJnaXZlbk5hbWVcIiwgbm9ybWFsaXplZFByb2ZpbGUuZ2l2ZW5OYW1lKSxcbiAgICAgICAgZmllbGQoXCJzblwiLCBub3JtYWxpemVkUHJvZmlsZS5mYW1pbHlOYW1lKSxcbiAgICAgICAgZmllbGQoXCJtYWlsXCIsIG5vcm1hbGl6ZWRQcm9maWxlLmVtYWlsKSxcbiAgICAgICAgZmllbGQoXCJ1c2VyTmFtZVwiLCBub3JtYWxpemVkUHJvZmlsZS51c2VybmFtZSkpKVxuXG5pZiAobm9ybWFsaXplZFByb2ZpbGUucG9zdGFsQWRkcmVzcy5pc05vdE51bGwoKSkgbWFuYWdlZFVzZXIucHV0KFwicG9zdGFsQWRkcmVzc1wiLCBub3JtYWxpemVkUHJvZmlsZS5wb3N0YWxBZGRyZXNzKVxuaWYgKG5vcm1hbGl6ZWRQcm9maWxlLmFkZHJlc3NMb2NhbGl0eS5pc05vdE51bGwoKSkgbWFuYWdlZFVzZXIucHV0KFwiY2l0eVwiLCBub3JtYWxpemVkUHJvZmlsZS5hZGRyZXNzTG9jYWxpdHkpXG5pZiAobm9ybWFsaXplZFByb2ZpbGUuYWRkcmVzc1JlZ2lvbi5pc05vdE51bGwoKSkgbWFuYWdlZFVzZXIucHV0KFwic3RhdGVQcm92aW5jZVwiLCBub3JtYWxpemVkUHJvZmlsZS5hZGRyZXNzUmVnaW9uKVxuaWYgKG5vcm1hbGl6ZWRQcm9maWxlLnBvc3RhbENvZGUuaXNOb3ROdWxsKCkpIG1hbmFnZWRVc2VyLnB1dChcInBvc3RhbENvZGVcIiwgbm9ybWFsaXplZFByb2ZpbGUucG9zdGFsQ29kZSlcbmlmIChub3JtYWxpemVkUHJvZmlsZS5jb3VudHJ5LmlzTm90TnVsbCgpKSBtYW5hZ2VkVXNlci5wdXQoXCJjb3VudHJ5XCIsIG5vcm1hbGl6ZWRQcm9maWxlLmNvdW50cnkpXG5pZiAobm9ybWFsaXplZFByb2ZpbGUucGhvbmUuaXNOb3ROdWxsKCkpIG1hbmFnZWRVc2VyLnB1dChcInRlbGVwaG9uZU51bWJlclwiLCBub3JtYWxpemVkUHJvZmlsZS5waG9uZSlcblxuLy8gaWYgdGhlIGdpdmVuTmFtZSBhbmQgZmFtaWx5TmFtZSBpcyBudWxsIG9yIGVtcHR5XG4vLyB0aGVuIGFkZCBhIGJvb2xlYW4gZmxhZyB0byB0aGUgc2hhcmVkIHN0YXRlIHRvIGluZGljYXRlIG5hbWVzIGFyZSBub3QgcHJlc2VudFxuLy8gdGhpcyBjb3VsZCBiZSB1c2VkIGVsc2V3aGVyZVxuLy8gZm9yIGVnLiB0aGlzIGNvdWxkIGJlIHVzZWQgaW4gYSBzY3JpcHRlZCBkZWNpc2lvbiBub2RlIHRvIGJ5LXBhc3MgcGF0Y2hpbmdcbi8vIHRoZSB1c2VyIG9iamVjdCB3aXRoIGJsYW5rIHZhbHVlcyB3aGVuIGdpdmVuTmFtZSAgYW5kIGZhbWlseU5hbWUgaXMgbm90IHByZXNlbnRcbmJvb2xlYW4gbm9HaXZlbk5hbWUgPSBub3JtYWxpemVkUHJvZmlsZS5naXZlbk5hbWUuaXNOdWxsKCkgfHwgKCFub3JtYWxpemVkUHJvZmlsZS5naXZlbk5hbWUuYXNTdHJpbmcoKT8udHJpbSgpKVxuYm9vbGVhbiBub0ZhbWlseU5hbWUgPSBub3JtYWxpemVkUHJvZmlsZS5mYW1pbHlOYW1lLmlzTnVsbCgpIHx8ICghbm9ybWFsaXplZFByb2ZpbGUuZmFtaWx5TmFtZS5hc1N0cmluZygpPy50cmltKCkpXG5zaGFyZWRTdGF0ZS5wdXQoXCJuYW1lRW1wdHlPck51bGxcIiwgbm9HaXZlbk5hbWUgJiYgbm9GYW1pbHlOYW1lKVxuXG5yZXR1cm4gbWFuYWdlZFVzZXJcbiI=\",\"default\":true,\"language\":\"GROOVY\",\"context\":\"SOCIAL_IDP_PROFILE_TRANSFORMATION\",\"createdBy\":\"null\",\"creationDate\":0,\"lastModifiedBy\":\"null\",\"lastModifiedDate\":0,\"evaluatorVersion\":\"1.0\"}],\"resultCount\":74,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"NONE\",\"totalPagedResults\":-1,\"remainingPagedResults\":0}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.0,resource=1.1, resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:34:21 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + }, + { + "name": "transfer-encoding", + "value": "chunked" + } + ], + "headersSize": 800, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:34:21.972Z", + "time": 144, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 144 + } + }, + { + "_id": "dfb33de6f7d1b8dc5730a7f3eea09ad5", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "accept-api-version", + "value": "protocol=2.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 2036, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "name eq \"My Other Example Library Script\"" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/realms/root/realms/alpha/libraries?_queryFilter=name%20eq%20%22My%20Other%20Example%20Library%20Script%22" + }, + "response": { + "bodySize": 237, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 237, + "text": "{\"result\":[{\"_id\":\"4e053815-adde-46ac-9fe2-d3ae93517c14\",\"name\":\"My Other Example Library Script\",\"exports\":[]}],\"resultCount\":1,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"NONE\",\"totalPagedResults\":-1,\"remainingPagedResults\":0}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.0,resource=1.0, resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "237" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:34:21 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 793, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:34:22.122Z", + "time": 72, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 72 + } + }, + { + "_id": "a1925f1f53c4a64ae258898780fcb1f4", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "accept-api-version", + "value": "protocol=2.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 2019, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "name eq \"My Example Library\"" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/realms/root/realms/alpha/libraries?_queryFilter=name%20eq%20%22My%20Example%20Library%22" + }, + "response": { + "bodySize": 396, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 396, + "text": "{\"result\":[{\"_id\":\"2c38c998-aec0-4e56-8d46-bff6e24a704e\",\"name\":\"My Example Library\",\"exports\":[{\"id\":\"MSG\",\"type\":\"String\"},{\"id\":\"add\",\"type\":\"Function\",\"arity\":1},{\"id\":\"logTotal\",\"type\":\"Function\",\"arity\":1},{\"id\":\"logTotalWithMessage\",\"type\":\"Function\",\"arity\":2}]}],\"resultCount\":1,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"NONE\",\"totalPagedResults\":-1,\"remainingPagedResults\":0}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.0,resource=1.0, resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "396" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:34:21 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 793, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:34:22.199Z", + "time": 59, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 59 + } + }, + { + "_id": "ac02ebf96dde71d07ad40429340a7b32", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "accept-api-version", + "value": "protocol=2.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 2013, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "name eq \"Library Script\"" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/realms/root/realms/alpha/libraries?_queryFilter=name%20eq%20%22Library%20Script%22" + }, + "response": { + "bodySize": 404, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 404, + "text": "{\"result\":[{\"_id\":\"6c49bebe-3a62-11ed-a261-0242ac120002\",\"name\":\"Library Script\",\"exports\":[{\"id\":\"logError\",\"type\":\"Function\",\"arity\":2},{\"id\":\"logWarning\",\"type\":\"Function\",\"arity\":2},{\"id\":\"logInfo\",\"type\":\"Function\",\"arity\":2},{\"id\":\"logDebug\",\"type\":\"Function\",\"arity\":2}]}],\"resultCount\":1,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"NONE\",\"totalPagedResults\":-1,\"remainingPagedResults\":0}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.0,resource=1.0, resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "404" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:34:21 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 793, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:34:22.264Z", + "time": 59, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 59 + } + }, + { + "_id": "2eff2fc42a281a12b3a3d40175742e14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "accept-api-version", + "value": "protocol=2.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 2035, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "name eq \"test-script-with-secrets-and-variables\"" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/realms/root/realms/alpha/libraries?_queryFilter=name%20eq%20%22test-script-with-secrets-and-variables%22" + }, + "response": { + "bodySize": 244, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 244, + "text": "{\"result\":[{\"_id\":\"da7a96a8-7969-4dab-9c6e-a812938cc76d\",\"name\":\"test-script-with-secrets-and-variables\",\"exports\":[]}],\"resultCount\":1,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"NONE\",\"totalPagedResults\":-1,\"remainingPagedResults\":0}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.0,resource=1.0, resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "244" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:34:21 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 793, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:34:22.329Z", + "time": 70, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 70 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/script_540962730/export_4211608755/0_modified-properties_all-separate_no-metadata_default_extract_directory_1410389095/oauth2_393036114/recording.har b/test/e2e/mocks/script_540962730/export_4211608755/0_modified-properties_all-separate_no-metadata_default_extract_directory_1410389095/oauth2_393036114/recording.har new file mode 100644 index 000000000..59141410d --- /dev/null +++ b/test/e2e/mocks/script_540962730/export_4211608755/0_modified-properties_all-separate_no-metadata_default_extract_directory_1410389095/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "script/export/0_all-separate_no-metadata_default_extract_directory/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1339, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1339" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 442, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:autoaccess:* fr:idc:esv:* fr:iga:* fr:idc:analytics:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:certificate:read fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1818, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1818, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:autoaccess:* fr:idc:esv:* fr:iga:* fr:idc:analytics:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:certificate:read fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1818" + }, + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:34:21 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 561, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:34:21.694Z", + "time": 124, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 124 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/script_540962730/export_4211608755/0_modified-properties_all-separate_no-metadata_default_extract_directory_1410389095/openidm_3290118515/recording.har b/test/e2e/mocks/script_540962730/export_4211608755/0_modified-properties_all-separate_no-metadata_default_extract_directory_1410389095/openidm_3290118515/recording.har new file mode 100644 index 000000000..dd5eda820 --- /dev/null +++ b/test/e2e/mocks/script_540962730/export_4211608755/0_modified-properties_all-separate_no-metadata_default_extract_directory_1410389095/openidm_3290118515/recording.har @@ -0,0 +1,302 @@ +{ + "log": { + "_recordingName": "script/export/0_all-separate_no-metadata_default_extract_directory/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1948, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/7a031a92-f70d-4b30-9d70-da7cfb1d9c93?_fields=%2A" + }, + "response": { + "bodySize": 1382, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1382, + "text": "{\"_id\":\"7a031a92-f70d-4b30-9d70-da7cfb1d9c93\",\"_rev\":\"fd891c5f-b3b8-4ec3-933d-db614ea36542-142\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1720799681233\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:autoaccess:*\",\"fr:idc:certificate:*\",\"fr:idc:certificate:read\",\"fr:idc:content-security-policy:*\",\"fr:idc:custom-domain:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:iga:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"0XdDQoML6maEILSCc8AWtpjBlKNOzf_NTG_jT0M0wzk\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"mvVVosknqaMRfUPxzZKLpNIIEZCTHcVT3QGRsA2CpUaK0jNO5WOljqLe3XjJmE27b2vcO_GT29M9QIwUVYAx8cv9BnwTEuioTu_Tugp3O4X3VO9VmNTQkaM1gASCTkZ2u_VuZefusBmydrheMP_XlT7GvB_sSpLgpyiN88LEO1RVVZEiG9YAanSQZejtKYLpxV5-Sxu3kh3c1M2HGiw9LeGu0h1p6okCDWwaJUDIG7jXgcHYgFCcNLkklzMX82ozWXEyjQPaxg95sk3d1ZLl-hoAJAI2-bF_ANvqK60i3WCBBPpulUU_RGeVhgxcnMTbDJUm1KgFhlK9TcvgQmZtm1u9NF0hkNlfrYhDUiy3BVWnHCTi50JUZYTevfo6LS2waTE-ZWMAZ0CCeShPR92HkcyfFIYf_PFvrwk55pmvDbx4Fc4l2y_JXKckSuKf2ErmWN_8F7ou5zNsrYcmApCuNj7m0Is3BhnvafhIsI8nocyeJPiaH5oHm5aCSWbjVFvFyOmsuZQ3AAkHjBcET3iqBneHKqSe4-Zw9-u4W6iSw8L8fF7_RPFGYAnxidqEl2Y4WOB3GsaYXEOn5uT6yKJTDbtRABdvEswFfxdVcWwvnGItgmVbUnU_QFjkOgNC2U051jUE3crGZSpeTN8028NGikzvB4PhcvIFT0biHIXFr98\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:34:21 GMT" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"fd891c5f-b3b8-4ec3-933d-db614ea36542-142\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1382" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 667, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:34:21.852Z", + "time": 126, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 126 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/2.1.2-0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1948, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/7a031a92-f70d-4b30-9d70-da7cfb1d9c93?_fields=%2A" + }, + "response": { + "bodySize": 1382, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1382, + "text": "{\"_id\":\"7a031a92-f70d-4b30-9d70-da7cfb1d9c93\",\"_rev\":\"fd891c5f-b3b8-4ec3-933d-db614ea36542-142\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1720799681233\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:autoaccess:*\",\"fr:idc:certificate:*\",\"fr:idc:certificate:read\",\"fr:idc:content-security-policy:*\",\"fr:idc:custom-domain:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:iga:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"0XdDQoML6maEILSCc8AWtpjBlKNOzf_NTG_jT0M0wzk\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"mvVVosknqaMRfUPxzZKLpNIIEZCTHcVT3QGRsA2CpUaK0jNO5WOljqLe3XjJmE27b2vcO_GT29M9QIwUVYAx8cv9BnwTEuioTu_Tugp3O4X3VO9VmNTQkaM1gASCTkZ2u_VuZefusBmydrheMP_XlT7GvB_sSpLgpyiN88LEO1RVVZEiG9YAanSQZejtKYLpxV5-Sxu3kh3c1M2HGiw9LeGu0h1p6okCDWwaJUDIG7jXgcHYgFCcNLkklzMX82ozWXEyjQPaxg95sk3d1ZLl-hoAJAI2-bF_ANvqK60i3WCBBPpulUU_RGeVhgxcnMTbDJUm1KgFhlK9TcvgQmZtm1u9NF0hkNlfrYhDUiy3BVWnHCTi50JUZYTevfo6LS2waTE-ZWMAZ0CCeShPR92HkcyfFIYf_PFvrwk55pmvDbx4Fc4l2y_JXKckSuKf2ErmWN_8F7ou5zNsrYcmApCuNj7m0Is3BhnvafhIsI8nocyeJPiaH5oHm5aCSWbjVFvFyOmsuZQ3AAkHjBcET3iqBneHKqSe4-Zw9-u4W6iSw8L8fF7_RPFGYAnxidqEl2Y4WOB3GsaYXEOn5uT6yKJTDbtRABdvEswFfxdVcWwvnGItgmVbUnU_QFjkOgNC2U051jUE3crGZSpeTN8028NGikzvB4PhcvIFT0biHIXFr98\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 11 Sep 2024 17:34:21 GMT" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"fd891c5f-b3b8-4ec3-933d-db614ea36542-142\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1382" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-49a14c71-011f-41ab-97cf-c264acdeb763" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 667, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-09-11T17:34:21.900Z", + "time": 65, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 65 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/server_1085029842/export_4211608755/0_server-id_2035896751/am_1076162899/recording.har b/test/e2e/mocks/server_1085029842/export_4211608755/0_server-id_2035896751/am_1076162899/recording.har new file mode 100644 index 000000000..1e1d555a5 --- /dev/null +++ b/test/e2e/mocks/server_1085029842/export_4211608755/0_server-id_2035896751/am_1076162899/recording.har @@ -0,0 +1,1791 @@ +{ + "log": { + "_recordingName": "server/export/0_server-id/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 386, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/serverinfo/*" + }, + "response": { + "bodySize": 559, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 559, + "text": "{\"_id\":\"*\",\"_rev\":\"1352294768\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"secureCookie\":false,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":false,\"userIdAttributes\":[]}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1352294768\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "559" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 486, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.355Z", + "time": 12, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 12 + } + }, + { + "_id": "9f5671275c36a1c0090d0df26ce0e93f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 2, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "amadmin" + }, + { + "name": "x-openam-password", + "value": "Sup3rS3cr3t!" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 493, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{}" + }, + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/realms/root/authenticate" + }, + "response": { + "bodySize": 163, + "content": { + "mimeType": "application/json", + "size": 163, + "text": "{\"tokenId\":\"\",\"successUrl\":\"/am/console\",\"realm\":\"/\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "amlbcookie", + "path": "/", + "value": "" + }, + { + "httpOnly": true, + "name": "iPlanetDirectoryPro", + "path": "/", + "value": "" + } + ], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "amlbcookie=; Path=/; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "iPlanetDirectoryPro=; Path=/; HttpOnly" + }, + { + "name": "content-api-version", + "value": "resource=2.1" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "163" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 498, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.374Z", + "time": 10, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 10 + } + }, + { + "_id": "6a3744385d3fd7416ea7089e610fa7e7", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 124, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "resource=4.0" + }, + { + "name": "content-length", + "value": "124" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"tokenId\":\"\"}" + }, + "queryString": [ + { + "name": "_action", + "value": "getSessionInfo" + } + ], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/realms/root/sessions/?_action=getSessionInfo" + }, + "response": { + "bodySize": 309, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 309, + "text": "{\"username\":\"amadmin\",\"universalId\":\"id=amadmin,ou=user,dc=openam,dc=forgerock,dc=org\",\"realm\":\"/\",\"latestAccessTime\":\"2024-11-07T21:49:37Z\",\"maxIdleExpirationTime\":\"2024-11-07T22:19:37Z\",\"maxSessionExpirationTime\":\"2024-11-07T23:49:36Z\",\"properties\":{\"AMCtxId\":\"fa97f2df-2be7-47e0-a483-1bf46c344e20-384512\"}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=4.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "309" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 465, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.389Z", + "time": 3, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 3 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 532, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/serverinfo/version" + }, + "response": { + "bodySize": 258, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 258, + "text": "{\"_id\":\"version\",\"_rev\":\"-1772220916\",\"version\":\"7.5.0\",\"fullVersion\":\"ForgeRock Access Management 7.5.0 Build 89116d59a1ebe73ed1931dd3649adb7f217cd06b (2024-March-28 16:00)\",\"revision\":\"89116d59a1ebe73ed1931dd3649adb7f217cd06b\",\"date\":\"2024-March-28 16:00\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-1772220916\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "258" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 487, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.397Z", + "time": 2, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 2 + } + }, + { + "_id": "abb8dd3f96712be4ab833c9ee6024c2f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 551, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/01" + }, + "response": { + "bodySize": 81, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 81, + "text": "{\"_id\":\"01\",\"_rev\":\"-931963190\",\"url\":\"http://localhost:8080/am\",\"siteName\":null}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-931963190\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "81" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 484, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.405Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + }, + { + "_id": "c371ee1173e1bc4eaf9271a18c9a61fb", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 571, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/01/properties/advanced" + }, + "response": { + "bodySize": 646, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 646, + "text": "{\"_id\":\"01/properties/advanced\",\"_rev\":\"1060187524\",\"com.sun.identity.urlconnection.useCache\":false,\"com.iplanet.am.serverMode\":true,\"com.sun.identity.sm.sms_object_class_name\":\"com.sun.identity.sm.SmsWrapperObject\",\"org.forgerock.embedded.dsadminport\":\"4444\",\"com.sun.embedded.sync.servers\":\"on\",\"com.sun.embedded.replicationport\":\"\",\"com.iplanet.security.SSLSocketFactoryImpl\":\"com.sun.identity.shared.ldap.factory.JSSESocketFactory\",\"com.sun.identity.common.systemtimerpool.size\":\"3\",\"bootstrap.file\":\"/root/.openamcfg/AMConfig_usr_local_tomcat_webapps_am_\",\"com.iplanet.am.lbcookie.value\":\"01\",\"opensso.protocol.handler.pkgs\":\"\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1060187524\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "646" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.414Z", + "time": 25, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 25 + } + }, + { + "_id": "407a00ccaf1416887eaa19f40a52fce3", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 566, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/01/properties/cts" + }, + "response": { + "bodySize": 1198, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1198, + "text": "{\"_id\":\"01/properties/cts\",\"_rev\":\"718218626\",\"amconfig.org.forgerock.services.cts.store.common.section\":{\"org.forgerock.services.cts.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.cts.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.max.connections\":{\"value\":\"100\",\"inherited\":true},\"org.forgerock.services.cts.store.page.size\":{\"value\":\"0\",\"inherited\":true},\"org.forgerock.services.cts.store.vlv.page.size\":{\"value\":\"1000\",\"inherited\":true}},\"amconfig.org.forgerock.services.cts.store.external.section\":{\"org.forgerock.services.cts.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.cts.store.heartbeat\":{\"value\":\"10\",\"inherited\":true},\"org.forgerock.services.cts.store.affinity.enabled\":{\"value\":null,\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"718218626\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1198" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.444Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + }, + { + "_id": "dd3e5b3724c501435b017cd9653fe62d", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 585, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/01/properties/directoryConfiguration" + }, + "response": { + "bodySize": 439, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 439, + "text": "{\"_id\":\"01/properties/directoryConfiguration\",\"_rev\":\"1641752644\",\"directoryConfiguration\":{\"minConnectionPool\":1,\"maxConnectionPool\":10,\"mtlsEnabled\":false,\"mtlsAlias\":\"\",\"mtlsKeyStoreFile\":\"\",\"mtlsKeyStoreType\":null,\"mtlsKeyStorePasswordFile\":\"\",\"mtlsKeyPasswordFile\":\"\",\"bindDn\":\"cn=Directory Manager\",\"bindPassword\":null},\"directoryServers\":[{\"hostName\":\"localhost\",\"serverName\":\"Server1\",\"connectionType\":\"SSL\",\"portNumber\":\"50636\"}]}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1641752644\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "439" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.455Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + }, + { + "_id": "a48cd11caf79e01ae2cf5ecfe66f3be4", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 570, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/01/properties/general" + }, + "response": { + "bodySize": 905, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 905, + "text": "{\"_id\":\"01/properties/general\",\"_rev\":\"1939943115\",\"amconfig.header.site\":{\"singleChoiceSite\":\"[Empty]\"},\"amconfig.header.installdir\":{\"com.iplanet.services.configpath\":{\"value\":\"/root/am\",\"inherited\":false},\"com.iplanet.am.locale\":{\"value\":\"en_US\",\"inherited\":false},\"com.sun.identity.client.notification.url\":{\"value\":\"%SERVER_PROTO%://%SERVER_HOST%:%SERVER_PORT%/%SERVER_URI%/notificationservice\",\"inherited\":true},\"com.iplanet.am.util.xml.validating\":{\"value\":\"off\",\"inherited\":true}},\"amconfig.header.debug\":{\"com.iplanet.services.debug.level\":{\"value\":\"off\",\"inherited\":true},\"com.sun.services.debug.mergeall\":{\"value\":\"on\",\"inherited\":true},\"com.iplanet.services.debug.directory\":{\"value\":\"%BASE_DIR%/var/debug\",\"inherited\":true}},\"amconfig.header.mailserver\":{\"com.iplanet.am.smtphost\":{\"value\":\"localhost\",\"inherited\":true},\"com.iplanet.am.smtpport\":{\"value\":\"25\",\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1939943115\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "905" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.468Z", + "time": 6, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 6 + } + }, + { + "_id": "799a0175aaeac057e6d7a3cdc708a55c", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 566, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/01/properties/sdk" + }, + "response": { + "bodySize": 1309, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1309, + "text": "{\"_id\":\"01/properties/sdk\",\"_rev\":\"1498440787\",\"amconfig.header.datastore\":{\"com.sun.identity.sm.enableDataStoreNotification\":{\"value\":true,\"inherited\":false},\"com.sun.identity.sm.notification.threadpool.size\":{\"value\":\"1\",\"inherited\":true}},\"amconfig.header.eventservice\":{\"com.iplanet.am.event.connection.num.retries\":{\"value\":\"3\",\"inherited\":true},\"com.iplanet.am.event.connection.delay.between.retries\":{\"value\":\"3000\",\"inherited\":true},\"com.iplanet.am.event.connection.ldap.error.codes.retries\":{\"value\":\"80,81,91\",\"inherited\":true},\"com.sun.am.event.connection.disable.list\":{\"value\":\"aci,um\",\"inherited\":false}},\"amconfig.header.ldapconnection\":{\"com.iplanet.am.ldap.connection.num.retries\":{\"value\":\"3\",\"inherited\":true},\"com.iplanet.am.ldap.connection.delay.between.retries\":{\"value\":\"1000\",\"inherited\":true},\"com.iplanet.am.ldap.connection.ldap.error.codes.retries\":{\"value\":\"80,81,91\",\"inherited\":false}},\"amconfig.header.cachingreplica\":{\"com.iplanet.am.sdk.cache.maxSize\":{\"value\":\"10000\",\"inherited\":true}},\"amconfig.header.sdktimetoliveconfig\":{\"com.iplanet.am.sdk.cache.entry.expire.enabled\":{\"value\":false,\"inherited\":true},\"com.iplanet.am.sdk.cache.entry.user.expire.time\":{\"value\":\"15\",\"inherited\":true},\"com.iplanet.am.sdk.cache.entry.default.expire.time\":{\"value\":\"30\",\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1498440787\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1309" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 486, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.478Z", + "time": 10, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 10 + } + }, + { + "_id": "cb45df229874d4a5b7957694d32478db", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 571, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/01/properties/security" + }, + "response": { + "bodySize": 4198, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 4198, + "text": "{\"_id\":\"01/properties/security\",\"_rev\":\"1105880821\",\"amconfig.header.encryption\":{\"am.encryption.pwd\":{\"value\":\"efSYcwIhr7uKH30rgciGTVTFzb63LhYu\",\"inherited\":false},\"com.iplanet.security.encryptor\":{\"value\":\"com.iplanet.services.util.JCEEncryption\",\"inherited\":true},\"com.iplanet.security.SecureRandomFactoryImpl\":{\"value\":\"com.iplanet.am.util.SecureRandomFactoryImpl\",\"inherited\":true},\"am.encryption.secret.enabled\":{\"value\":false,\"inherited\":true},\"am.encryption.secret.alias\":{\"value\":null,\"inherited\":true},\"am.encryption.secret.keystoreFile\":{\"value\":null,\"inherited\":true},\"am.encryption.secret.keystoreType\":{\"value\":\"JCEKS\",\"inherited\":true},\"am.encryption.secret.keystorePass\":{\"value\":null,\"inherited\":true},\"am.encryption.secret.keyPass\":{\"value\":null,\"inherited\":true}},\"amconfig.header.validation\":{\"com.iplanet.services.comm.server.pllrequest.maxContentLength\":{\"value\":\"16384\",\"inherited\":true},\"com.iplanet.am.clientIPCheckEnabled\":{\"value\":false,\"inherited\":true}},\"amconfig.header.cookie\":{\"com.iplanet.am.cookie.name\":{\"value\":\"iPlanetDirectoryPro\",\"inherited\":true},\"com.iplanet.am.cookie.secure\":{\"value\":false,\"inherited\":true},\"com.iplanet.am.cookie.encode\":{\"value\":false,\"inherited\":true}},\"amconfig.header.securitykey\":{\"com.sun.identity.saml.xmlsig.keystore\":{\"value\":\"%BASE_DIR%/security/keystores/keystore.jceks\",\"inherited\":true},\"com.sun.identity.saml.xmlsig.storetype\":{\"value\":\"JCEKS\",\"inherited\":true},\"com.sun.identity.saml.xmlsig.storepass\":{\"value\":\"%BASE_DIR%/security/secrets/default/.storepass\",\"inherited\":true},\"com.sun.identity.saml.xmlsig.keypass\":{\"value\":\"%BASE_DIR%/security/secrets/default/.keypass\",\"inherited\":true},\"com.sun.identity.saml.xmlsig.certalias\":{\"value\":\"test\",\"inherited\":true}},\"amconfig.header.crlcache\":{\"com.sun.identity.crl.cache.directory.host\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.crl.cache.directory.port\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.crl.cache.directory.ssl\":{\"value\":false,\"inherited\":true},\"com.sun.identity.crl.cache.directory.mtlsenabled\":{\"value\":false,\"inherited\":true},\"com.sun.identity.crl.cache.directory.user\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.crl.cache.directory.password\":{\"value\":null,\"inherited\":true},\"com.sun.identity.crl.cache.directory.searchlocs\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.crl.cache.directory.searchattr\":{\"value\":\"\",\"inherited\":true}},\"amconfig.header.ocsp.check\":{\"com.sun.identity.authentication.ocspCheck\":{\"value\":false,\"inherited\":true},\"com.sun.identity.authentication.ocsp.responder.url\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.authentication.ocsp.responder.nickname\":{\"value\":\"\",\"inherited\":true}},\"amconfig.header.deserialisationwhitelist\":{\"openam.deserialisation.classes.whitelist\":{\"value\":\"com.iplanet.dpro.session.DNOrIPAddressListTokenRestriction,com.sun.identity.common.CaseInsensitiveHashMap,com.sun.identity.common.CaseInsensitiveHashSet,com.sun.identity.common.CaseInsensitiveKey,com.sun.identity.console.base.model.SMSubConfig,com.sun.identity.console.session.model.SMSessionData,com.sun.identity.console.user.model.UMUserPasswordResetOptionsData,com.sun.identity.shared.datastruct.OrderedSet,com.sun.xml.bind.util.ListImpl,com.sun.xml.bind.util.ProxyListImpl,java.lang.Boolean,java.lang.Integer,java.lang.Number,java.lang.StringBuffer,java.net.InetAddress,java.security.cert.Certificate,java.security.cert.Certificate$CertificateRep,java.util.ArrayList,java.util.Collections$EmptyMap,java.util.Collections$EmptySet,java.util.Collections$SingletonList,java.util.HashMap,java.util.HashSet,java.util.LinkedHashSet,java.util.Locale,org.forgerock.openam.authentication.service.protocol.RemoteCookie,org.forgerock.openam.authentication.service.protocol.RemoteHttpServletRequest,org.forgerock.openam.authentication.service.protocol.RemoteHttpServletResponse,org.forgerock.openam.authentication.service.protocol.RemoteServletRequest,org.forgerock.openam.authentication.service.protocol.RemoteServletResponse,org.forgerock.openam.authentication.service.protocol.RemoteSession,org.forgerock.openam.dpro.session.NoOpTokenRestriction,org.forgerock.openam.dpro.session.ProofOfPossessionTokenRestriction\",\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1105880821\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "4198" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 486, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.492Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + }, + { + "_id": "ee279aad03dd09b2f9ab5d81d33f4d82", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 570, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/01/properties/session" + }, + "response": { + "bodySize": 914, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 914, + "text": "{\"_id\":\"01/properties/session\",\"_rev\":\"562556728\",\"amconfig.header.sessionthresholds\":{\"org.forgerock.openam.session.service.access.persistence.caching.maxsize\":{\"value\":\"5000\",\"inherited\":true},\"com.iplanet.am.session.invalidsessionmaxtime\":{\"value\":\"3\",\"inherited\":true}},\"amconfig.header.sessionlogging\":{\"com.iplanet.am.stats.interval\":{\"value\":\"60\",\"inherited\":true},\"com.iplanet.services.stats.state\":{\"value\":\"file\",\"inherited\":true},\"com.iplanet.services.stats.directory\":{\"value\":\"%BASE_DIR%/var/stats\",\"inherited\":true},\"com.sun.am.session.enableHostLookUp\":{\"value\":false,\"inherited\":true}},\"amconfig.header.sessionnotification\":{\"com.iplanet.am.notification.threadpool.size\":{\"value\":\"10\",\"inherited\":true},\"com.iplanet.am.notification.threadpool.threshold\":{\"value\":\"5000\",\"inherited\":true}},\"amconfig.header.sessionvalidation\":{\"com.sun.am.session.caseInsensitiveDN\":{\"value\":true,\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"562556728\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "914" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 484, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.501Z", + "time": 4, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 4 + } + }, + { + "_id": "fb8d5586266d9b61e145b91b3ea3dc6b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-d9a4cca2-f511-41c1-985e-8d83a7849d58" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 566, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/01/properties/uma" + }, + "response": { + "bodySize": 4121, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 4121, + "text": "{\"_id\":\"01/properties/uma\",\"_rev\":\"808518328\",\"amconfig.org.forgerock.services.resourcesets.store.common.section\":{\"org.forgerock.services.resourcesets.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.max.connections\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.resourcesets.store.external.section\":{\"org.forgerock.services.resourcesets.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.resourcesets.store.heartbeat\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.umaaudit.store.common.section\":{\"org.forgerock.services.umaaudit.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.max.connections\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.umaaudit.store.external.section\":{\"org.forgerock.services.umaaudit.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.umaaudit.store.heartbeat\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.uma.pendingrequests.store.common.section\":{\"org.forgerock.services.uma.pendingrequests.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.max.connections\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.uma.pendingrequests.store.external.section\":{\"org.forgerock.services.uma.pendingrequests.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.heartbeat\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.uma.labels.store.common.section\":{\"org.forgerock.services.uma.labels.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.max.connections\":{\"value\":\"2\",\"inherited\":true}},\"amconfig.org.forgerock.services.uma.labels.store.external.section\":{\"org.forgerock.services.uma.labels.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.uma.labels.store.heartbeat\":{\"value\":\"10\",\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"808518328\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "4121" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:37 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:37.510Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/server_1085029842/export_4211608755/0_server-url_extract_directory_434708301/am_1076162899/recording.har b/test/e2e/mocks/server_1085029842/export_4211608755/0_server-url_extract_directory_434708301/am_1076162899/recording.har new file mode 100644 index 000000000..86b63ad4b --- /dev/null +++ b/test/e2e/mocks/server_1085029842/export_4211608755/0_server-url_extract_directory_434708301/am_1076162899/recording.har @@ -0,0 +1,1792 @@ +{ + "log": { + "_recordingName": "server/export/0_server-url_extract_directory/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 386, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/serverinfo/*" + }, + "response": { + "bodySize": 559, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 559, + "text": "{\"_id\":\"*\",\"_rev\":\"1352294768\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"secureCookie\":false,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":false,\"userIdAttributes\":[]}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1352294768\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "559" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 486, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.781Z", + "time": 11, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 11 + } + }, + { + "_id": "9f5671275c36a1c0090d0df26ce0e93f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 2, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "amadmin" + }, + { + "name": "x-openam-password", + "value": "Sup3rS3cr3t!" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 493, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{}" + }, + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/realms/root/authenticate" + }, + "response": { + "bodySize": 163, + "content": { + "mimeType": "application/json", + "size": 163, + "text": "{\"tokenId\":\"\",\"successUrl\":\"/am/console\",\"realm\":\"/\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "amlbcookie", + "path": "/", + "value": "" + }, + { + "httpOnly": true, + "name": "iPlanetDirectoryPro", + "path": "/", + "value": "" + } + ], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "amlbcookie=; Path=/; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "iPlanetDirectoryPro=; Path=/; HttpOnly" + }, + { + "name": "content-api-version", + "value": "resource=2.1" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "163" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 498, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.800Z", + "time": 9, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 9 + } + }, + { + "_id": "6a3744385d3fd7416ea7089e610fa7e7", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 124, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "resource=4.0" + }, + { + "name": "content-length", + "value": "124" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"tokenId\":\"\"}" + }, + "queryString": [ + { + "name": "_action", + "value": "getSessionInfo" + } + ], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/realms/root/sessions/?_action=getSessionInfo" + }, + "response": { + "bodySize": 309, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 309, + "text": "{\"username\":\"amadmin\",\"universalId\":\"id=amadmin,ou=user,dc=openam,dc=forgerock,dc=org\",\"realm\":\"/\",\"latestAccessTime\":\"2024-11-07T21:50:09Z\",\"maxIdleExpirationTime\":\"2024-11-07T22:20:09Z\",\"maxSessionExpirationTime\":\"2024-11-07T23:50:08Z\",\"properties\":{\"AMCtxId\":\"fa97f2df-2be7-47e0-a483-1bf46c344e20-384991\"}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=4.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "309" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 465, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.816Z", + "time": 4, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 4 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 532, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/serverinfo/version" + }, + "response": { + "bodySize": 258, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 258, + "text": "{\"_id\":\"version\",\"_rev\":\"-1772220916\",\"version\":\"7.5.0\",\"fullVersion\":\"ForgeRock Access Management 7.5.0 Build 89116d59a1ebe73ed1931dd3649adb7f217cd06b (2024-March-28 16:00)\",\"revision\":\"89116d59a1ebe73ed1931dd3649adb7f217cd06b\",\"date\":\"2024-March-28 16:00\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-1772220916\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "258" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 487, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.826Z", + "time": 2, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 2 + } + }, + { + "_id": "85168d4e6dc1185d2c5bf463de69b96b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 566, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "true" + } + ], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers?_queryFilter=true" + }, + "response": { + "bodySize": 388, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 388, + "text": "{\"result\":[{\"_id\":\"01\",\"_rev\":\"-931963190\",\"url\":\"http://localhost:8080/am\",\"siteName\":null},{\"_id\":\"03\",\"_rev\":\"868438946\",\"url\":\"http://localhost:8081/am\",\"siteName\":\"testsite\"},{\"_id\":\"04\",\"_rev\":\"-931739121\",\"url\":\"http://localhost:8082/am\",\"siteName\":null}],\"resultCount\":3,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"NONE\",\"totalPagedResults\":-1,\"remainingPagedResults\":-1}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0, resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "388" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 492, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.833Z", + "time": 7, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 7 + } + }, + { + "_id": "338a93370eddcebd71b5708e98606a96", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 571, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/advanced" + }, + "response": { + "bodySize": 87, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 87, + "text": "{\"_id\":\"03/properties/advanced\",\"_rev\":\"20174910\",\"com.iplanet.am.lbcookie.value\":\"03\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"20174910\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "87" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 482, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.845Z", + "time": 24, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 24 + } + }, + { + "_id": "4d4dc587dbada33a6d10693f0cd7bbf4", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 566, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/cts" + }, + "response": { + "bodySize": 1199, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1199, + "text": "{\"_id\":\"03/properties/cts\",\"_rev\":\"1098556702\",\"amconfig.org.forgerock.services.cts.store.common.section\":{\"org.forgerock.services.cts.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.cts.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.max.connections\":{\"value\":\"100\",\"inherited\":true},\"org.forgerock.services.cts.store.page.size\":{\"value\":\"0\",\"inherited\":true},\"org.forgerock.services.cts.store.vlv.page.size\":{\"value\":\"1000\",\"inherited\":true}},\"amconfig.org.forgerock.services.cts.store.external.section\":{\"org.forgerock.services.cts.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.cts.store.heartbeat\":{\"value\":\"10\",\"inherited\":true},\"org.forgerock.services.cts.store.affinity.enabled\":{\"value\":null,\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1098556702\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1199" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 486, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.874Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + }, + { + "_id": "04705e2b445d7d257dec33b3db76d23b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 585, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/directoryConfiguration" + }, + "response": { + "bodySize": 439, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 439, + "text": "{\"_id\":\"03/properties/directoryConfiguration\",\"_rev\":\"1865750187\",\"directoryConfiguration\":{\"minConnectionPool\":1,\"maxConnectionPool\":10,\"mtlsEnabled\":false,\"mtlsAlias\":\"\",\"mtlsKeyStoreFile\":\"\",\"mtlsKeyStoreType\":null,\"mtlsKeyStorePasswordFile\":\"\",\"mtlsKeyPasswordFile\":\"\",\"bindDn\":\"cn=Directory Manager\",\"bindPassword\":null},\"directoryServers\":[{\"hostName\":\"localhost\",\"serverName\":\"Server1\",\"connectionType\":\"SSL\",\"portNumber\":\"50636\"}]}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1865750187\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "439" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.884Z", + "time": 3, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 3 + } + }, + { + "_id": "fce27f68c9162cf00271d849cb99020e", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 570, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/general" + }, + "response": { + "bodySize": 892, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 892, + "text": "{\"_id\":\"03/properties/general\",\"_rev\":\"432443808\",\"amconfig.header.site\":{\"singleChoiceSite\":\"testsite\"},\"amconfig.header.installdir\":{\"com.iplanet.services.configpath\":{\"value\":\"%BASE_DIR%\",\"inherited\":true},\"com.iplanet.am.locale\":{\"value\":\"en_US\",\"inherited\":true},\"com.sun.identity.client.notification.url\":{\"value\":\"%SERVER_PROTO%://%SERVER_HOST%:%SERVER_PORT%/%SERVER_URI%/notificationservice\",\"inherited\":true},\"com.iplanet.am.util.xml.validating\":{\"value\":\"off\",\"inherited\":true}},\"amconfig.header.debug\":{\"com.iplanet.services.debug.level\":{\"value\":\"off\",\"inherited\":true},\"com.sun.services.debug.mergeall\":{\"value\":\"on\",\"inherited\":true},\"com.iplanet.services.debug.directory\":{\"value\":\"%BASE_DIR%/var/debug\",\"inherited\":true}},\"amconfig.header.mailserver\":{\"com.iplanet.am.smtphost\":{\"value\":\"localhost\",\"inherited\":true},\"com.iplanet.am.smtpport\":{\"value\":\"25\",\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"432443808\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "892" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 484, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.895Z", + "time": 7, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 7 + } + }, + { + "_id": "9bb3b1836c6fc48cdf19585c91e0d0b6", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 566, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/sdk" + }, + "response": { + "bodySize": 1310, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1310, + "text": "{\"_id\":\"03/properties/sdk\",\"_rev\":\"2018772339\",\"amconfig.header.datastore\":{\"com.sun.identity.sm.enableDataStoreNotification\":{\"value\":false,\"inherited\":true},\"com.sun.identity.sm.notification.threadpool.size\":{\"value\":\"1\",\"inherited\":true}},\"amconfig.header.eventservice\":{\"com.iplanet.am.event.connection.num.retries\":{\"value\":\"3\",\"inherited\":true},\"com.iplanet.am.event.connection.delay.between.retries\":{\"value\":\"3000\",\"inherited\":true},\"com.iplanet.am.event.connection.ldap.error.codes.retries\":{\"value\":\"80,81,91\",\"inherited\":true},\"com.sun.am.event.connection.disable.list\":{\"value\":\"aci,um,sm\",\"inherited\":true}},\"amconfig.header.ldapconnection\":{\"com.iplanet.am.ldap.connection.num.retries\":{\"value\":\"3\",\"inherited\":true},\"com.iplanet.am.ldap.connection.delay.between.retries\":{\"value\":\"1000\",\"inherited\":true},\"com.iplanet.am.ldap.connection.ldap.error.codes.retries\":{\"value\":\"80,81,91\",\"inherited\":true}},\"amconfig.header.cachingreplica\":{\"com.iplanet.am.sdk.cache.maxSize\":{\"value\":\"10000\",\"inherited\":true}},\"amconfig.header.sdktimetoliveconfig\":{\"com.iplanet.am.sdk.cache.entry.expire.enabled\":{\"value\":false,\"inherited\":true},\"com.iplanet.am.sdk.cache.entry.user.expire.time\":{\"value\":\"15\",\"inherited\":true},\"com.iplanet.am.sdk.cache.entry.default.expire.time\":{\"value\":\"30\",\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2018772339\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1310" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 486, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.907Z", + "time": 4, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 4 + } + }, + { + "_id": "39e659d8cbc63b0064e0bc25dc3a2c1c", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 571, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/security" + }, + "response": { + "bodySize": 4177, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 4177, + "text": "{\"_id\":\"03/properties/security\",\"_rev\":\"2051701027\",\"amconfig.header.encryption\":{\"am.encryption.pwd\":{\"value\":\"@AM_ENC_PWD@\",\"inherited\":true},\"com.iplanet.security.encryptor\":{\"value\":\"com.iplanet.services.util.JCEEncryption\",\"inherited\":true},\"com.iplanet.security.SecureRandomFactoryImpl\":{\"value\":\"com.iplanet.am.util.SecureRandomFactoryImpl\",\"inherited\":true},\"am.encryption.secret.enabled\":{\"value\":false,\"inherited\":true},\"am.encryption.secret.alias\":{\"value\":null,\"inherited\":true},\"am.encryption.secret.keystoreFile\":{\"value\":null,\"inherited\":true},\"am.encryption.secret.keystoreType\":{\"value\":\"JCEKS\",\"inherited\":true},\"am.encryption.secret.keystorePass\":{\"value\":null,\"inherited\":true},\"am.encryption.secret.keyPass\":{\"value\":null,\"inherited\":true}},\"amconfig.header.validation\":{\"com.iplanet.services.comm.server.pllrequest.maxContentLength\":{\"value\":\"16384\",\"inherited\":true},\"com.iplanet.am.clientIPCheckEnabled\":{\"value\":false,\"inherited\":true}},\"amconfig.header.cookie\":{\"com.iplanet.am.cookie.name\":{\"value\":\"iPlanetDirectoryPro\",\"inherited\":true},\"com.iplanet.am.cookie.secure\":{\"value\":false,\"inherited\":true},\"com.iplanet.am.cookie.encode\":{\"value\":false,\"inherited\":true}},\"amconfig.header.securitykey\":{\"com.sun.identity.saml.xmlsig.keystore\":{\"value\":\"%BASE_DIR%/security/keystores/keystore.jceks\",\"inherited\":true},\"com.sun.identity.saml.xmlsig.storetype\":{\"value\":\"JCEKS\",\"inherited\":true},\"com.sun.identity.saml.xmlsig.storepass\":{\"value\":\"%BASE_DIR%/security/secrets/default/.storepass\",\"inherited\":true},\"com.sun.identity.saml.xmlsig.keypass\":{\"value\":\"%BASE_DIR%/security/secrets/default/.keypass\",\"inherited\":true},\"com.sun.identity.saml.xmlsig.certalias\":{\"value\":\"test\",\"inherited\":true}},\"amconfig.header.crlcache\":{\"com.sun.identity.crl.cache.directory.host\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.crl.cache.directory.port\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.crl.cache.directory.ssl\":{\"value\":false,\"inherited\":true},\"com.sun.identity.crl.cache.directory.mtlsenabled\":{\"value\":false,\"inherited\":true},\"com.sun.identity.crl.cache.directory.user\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.crl.cache.directory.password\":{\"value\":null,\"inherited\":true},\"com.sun.identity.crl.cache.directory.searchlocs\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.crl.cache.directory.searchattr\":{\"value\":\"\",\"inherited\":true}},\"amconfig.header.ocsp.check\":{\"com.sun.identity.authentication.ocspCheck\":{\"value\":false,\"inherited\":true},\"com.sun.identity.authentication.ocsp.responder.url\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.authentication.ocsp.responder.nickname\":{\"value\":\"\",\"inherited\":true}},\"amconfig.header.deserialisationwhitelist\":{\"openam.deserialisation.classes.whitelist\":{\"value\":\"com.iplanet.dpro.session.DNOrIPAddressListTokenRestriction,com.sun.identity.common.CaseInsensitiveHashMap,com.sun.identity.common.CaseInsensitiveHashSet,com.sun.identity.common.CaseInsensitiveKey,com.sun.identity.console.base.model.SMSubConfig,com.sun.identity.console.session.model.SMSessionData,com.sun.identity.console.user.model.UMUserPasswordResetOptionsData,com.sun.identity.shared.datastruct.OrderedSet,com.sun.xml.bind.util.ListImpl,com.sun.xml.bind.util.ProxyListImpl,java.lang.Boolean,java.lang.Integer,java.lang.Number,java.lang.StringBuffer,java.net.InetAddress,java.security.cert.Certificate,java.security.cert.Certificate$CertificateRep,java.util.ArrayList,java.util.Collections$EmptyMap,java.util.Collections$EmptySet,java.util.Collections$SingletonList,java.util.HashMap,java.util.HashSet,java.util.LinkedHashSet,java.util.Locale,org.forgerock.openam.authentication.service.protocol.RemoteCookie,org.forgerock.openam.authentication.service.protocol.RemoteHttpServletRequest,org.forgerock.openam.authentication.service.protocol.RemoteHttpServletResponse,org.forgerock.openam.authentication.service.protocol.RemoteServletRequest,org.forgerock.openam.authentication.service.protocol.RemoteServletResponse,org.forgerock.openam.authentication.service.protocol.RemoteSession,org.forgerock.openam.dpro.session.NoOpTokenRestriction,org.forgerock.openam.dpro.session.ProofOfPossessionTokenRestriction\",\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2051701027\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "4177" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 486, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.916Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + }, + { + "_id": "c1221dfe872156f3e640659414919a31", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 570, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/session" + }, + "response": { + "bodySize": 914, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 914, + "text": "{\"_id\":\"03/properties/session\",\"_rev\":\"135547550\",\"amconfig.header.sessionthresholds\":{\"org.forgerock.openam.session.service.access.persistence.caching.maxsize\":{\"value\":\"5000\",\"inherited\":true},\"com.iplanet.am.session.invalidsessionmaxtime\":{\"value\":\"3\",\"inherited\":true}},\"amconfig.header.sessionlogging\":{\"com.iplanet.am.stats.interval\":{\"value\":\"60\",\"inherited\":true},\"com.iplanet.services.stats.state\":{\"value\":\"file\",\"inherited\":true},\"com.iplanet.services.stats.directory\":{\"value\":\"%BASE_DIR%/var/stats\",\"inherited\":true},\"com.sun.am.session.enableHostLookUp\":{\"value\":false,\"inherited\":true}},\"amconfig.header.sessionnotification\":{\"com.iplanet.am.notification.threadpool.size\":{\"value\":\"10\",\"inherited\":true},\"com.iplanet.am.notification.threadpool.threshold\":{\"value\":\"5000\",\"inherited\":true}},\"amconfig.header.sessionvalidation\":{\"com.sun.am.session.caseInsensitiveDN\":{\"value\":true,\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"135547550\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "914" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 484, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.926Z", + "time": 4, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 4 + } + }, + { + "_id": "2912b66fea537d5e81fa8e1d708a8e51", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-af7a8feb-02d9-465d-8fab-62f0a0bdbaf0" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 566, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/uma" + }, + "response": { + "bodySize": 4122, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 4122, + "text": "{\"_id\":\"03/properties/uma\",\"_rev\":\"1135370408\",\"amconfig.org.forgerock.services.resourcesets.store.common.section\":{\"org.forgerock.services.resourcesets.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.max.connections\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.resourcesets.store.external.section\":{\"org.forgerock.services.resourcesets.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.resourcesets.store.heartbeat\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.umaaudit.store.common.section\":{\"org.forgerock.services.umaaudit.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.max.connections\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.umaaudit.store.external.section\":{\"org.forgerock.services.umaaudit.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.umaaudit.store.heartbeat\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.uma.pendingrequests.store.common.section\":{\"org.forgerock.services.uma.pendingrequests.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.max.connections\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.uma.pendingrequests.store.external.section\":{\"org.forgerock.services.uma.pendingrequests.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.heartbeat\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.uma.labels.store.common.section\":{\"org.forgerock.services.uma.labels.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.max.connections\":{\"value\":\"2\",\"inherited\":true}},\"amconfig.org.forgerock.services.uma.labels.store.external.section\":{\"org.forgerock.services.uma.labels.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.uma.labels.store.heartbeat\":{\"value\":\"10\",\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1135370408\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "4122" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:50:09 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 486, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:50:09.935Z", + "time": 6, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 6 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/server_1085029842/export_4211608755/0_u_file_default_no-metadata_256171004/am_1076162899/recording.har b/test/e2e/mocks/server_1085029842/export_4211608755/0_u_file_default_no-metadata_256171004/am_1076162899/recording.har new file mode 100644 index 000000000..c845e2449 --- /dev/null +++ b/test/e2e/mocks/server_1085029842/export_4211608755/0_u_file_default_no-metadata_256171004/am_1076162899/recording.har @@ -0,0 +1,2868 @@ +{ + "log": { + "_recordingName": "server/export/0_u_file_default_no-metadata/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 386, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/serverinfo/*" + }, + "response": { + "bodySize": 559, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 559, + "text": "{\"_id\":\"*\",\"_rev\":\"1352294768\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"secureCookie\":false,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":false,\"userIdAttributes\":[]}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1352294768\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "559" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 486, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.566Z", + "time": 10, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 10 + } + }, + { + "_id": "9f5671275c36a1c0090d0df26ce0e93f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 2, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "amadmin" + }, + { + "name": "x-openam-password", + "value": "Sup3rS3cr3t!" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 493, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{}" + }, + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/realms/root/authenticate" + }, + "response": { + "bodySize": 163, + "content": { + "mimeType": "application/json", + "size": 163, + "text": "{\"tokenId\":\"\",\"successUrl\":\"/am/console\",\"realm\":\"/\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "amlbcookie", + "path": "/", + "value": "" + }, + { + "httpOnly": true, + "name": "iPlanetDirectoryPro", + "path": "/", + "value": "" + } + ], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "amlbcookie=; Path=/; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "iPlanetDirectoryPro=; Path=/; HttpOnly" + }, + { + "name": "content-api-version", + "value": "resource=2.1" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "163" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 498, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.581Z", + "time": 8, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 8 + } + }, + { + "_id": "6a3744385d3fd7416ea7089e610fa7e7", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 124, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "resource=4.0" + }, + { + "name": "content-length", + "value": "124" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"tokenId\":\"\"}" + }, + "queryString": [ + { + "name": "_action", + "value": "getSessionInfo" + } + ], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/realms/root/sessions/?_action=getSessionInfo" + }, + "response": { + "bodySize": 309, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 309, + "text": "{\"username\":\"amadmin\",\"universalId\":\"id=amadmin,ou=user,dc=openam,dc=forgerock,dc=org\",\"realm\":\"/\",\"latestAccessTime\":\"2024-11-07T21:49:53Z\",\"maxIdleExpirationTime\":\"2024-11-07T22:19:53Z\",\"maxSessionExpirationTime\":\"2024-11-07T23:49:52Z\",\"properties\":{\"AMCtxId\":\"fa97f2df-2be7-47e0-a483-1bf46c344e20-384694\"}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=4.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "309" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 465, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.595Z", + "time": 3, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 3 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 532, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/serverinfo/version" + }, + "response": { + "bodySize": 258, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 258, + "text": "{\"_id\":\"version\",\"_rev\":\"-1772220916\",\"version\":\"7.5.0\",\"fullVersion\":\"ForgeRock Access Management 7.5.0 Build 89116d59a1ebe73ed1931dd3649adb7f217cd06b (2024-March-28 16:00)\",\"revision\":\"89116d59a1ebe73ed1931dd3649adb7f217cd06b\",\"date\":\"2024-March-28 16:00\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-1772220916\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "258" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 487, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.604Z", + "time": 2, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 2 + } + }, + { + "_id": "85168d4e6dc1185d2c5bf463de69b96b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 566, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryFilter", + "value": "true" + } + ], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers?_queryFilter=true" + }, + "response": { + "bodySize": 388, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 388, + "text": "{\"result\":[{\"_id\":\"01\",\"_rev\":\"-931963190\",\"url\":\"http://localhost:8080/am\",\"siteName\":null},{\"_id\":\"03\",\"_rev\":\"868438946\",\"url\":\"http://localhost:8081/am\",\"siteName\":\"testsite\"},{\"_id\":\"04\",\"_rev\":\"-931739121\",\"url\":\"http://localhost:8082/am\",\"siteName\":null}],\"resultCount\":3,\"pagedResultsCookie\":null,\"totalPagedResultsPolicy\":\"NONE\",\"totalPagedResults\":-1,\"remainingPagedResults\":-1}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0, resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "388" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 492, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.611Z", + "time": 9, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 9 + } + }, + { + "_id": "338a93370eddcebd71b5708e98606a96", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 571, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/advanced" + }, + "response": { + "bodySize": 89, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 89, + "text": "{\"_id\":\"03/properties/advanced\",\"_rev\":\"1354316775\",\"com.iplanet.am.lbcookie.value\":\"03\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1354316775\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "89" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 484, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.625Z", + "time": 29, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 29 + } + }, + { + "_id": "4d4dc587dbada33a6d10693f0cd7bbf4", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 566, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/cts" + }, + "response": { + "bodySize": 1199, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1199, + "text": "{\"_id\":\"03/properties/cts\",\"_rev\":\"1754666304\",\"amconfig.org.forgerock.services.cts.store.common.section\":{\"org.forgerock.services.cts.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.cts.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.max.connections\":{\"value\":\"100\",\"inherited\":true},\"org.forgerock.services.cts.store.page.size\":{\"value\":\"0\",\"inherited\":true},\"org.forgerock.services.cts.store.vlv.page.size\":{\"value\":\"1000\",\"inherited\":true}},\"amconfig.org.forgerock.services.cts.store.external.section\":{\"org.forgerock.services.cts.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.cts.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.cts.store.heartbeat\":{\"value\":\"10\",\"inherited\":true},\"org.forgerock.services.cts.store.affinity.enabled\":{\"value\":null,\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1754666304\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1199" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 486, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.659Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + }, + { + "_id": "04705e2b445d7d257dec33b3db76d23b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 585, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/directoryConfiguration" + }, + "response": { + "bodySize": 439, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 439, + "text": "{\"_id\":\"03/properties/directoryConfiguration\",\"_rev\":\"1415650021\",\"directoryConfiguration\":{\"minConnectionPool\":1,\"maxConnectionPool\":10,\"mtlsEnabled\":false,\"mtlsAlias\":\"\",\"mtlsKeyStoreFile\":\"\",\"mtlsKeyStoreType\":null,\"mtlsKeyStorePasswordFile\":\"\",\"mtlsKeyPasswordFile\":\"\",\"bindDn\":\"cn=Directory Manager\",\"bindPassword\":null},\"directoryServers\":[{\"hostName\":\"localhost\",\"serverName\":\"Server1\",\"connectionType\":\"SSL\",\"portNumber\":\"50636\"}]}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1415650021\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "439" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.669Z", + "time": 4, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 4 + } + }, + { + "_id": "fce27f68c9162cf00271d849cb99020e", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 570, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/general" + }, + "response": { + "bodySize": 892, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 892, + "text": "{\"_id\":\"03/properties/general\",\"_rev\":\"716744791\",\"amconfig.header.site\":{\"singleChoiceSite\":\"testsite\"},\"amconfig.header.installdir\":{\"com.iplanet.services.configpath\":{\"value\":\"%BASE_DIR%\",\"inherited\":true},\"com.iplanet.am.locale\":{\"value\":\"en_US\",\"inherited\":true},\"com.sun.identity.client.notification.url\":{\"value\":\"%SERVER_PROTO%://%SERVER_HOST%:%SERVER_PORT%/%SERVER_URI%/notificationservice\",\"inherited\":true},\"com.iplanet.am.util.xml.validating\":{\"value\":\"off\",\"inherited\":true}},\"amconfig.header.debug\":{\"com.iplanet.services.debug.level\":{\"value\":\"off\",\"inherited\":true},\"com.sun.services.debug.mergeall\":{\"value\":\"on\",\"inherited\":true},\"com.iplanet.services.debug.directory\":{\"value\":\"%BASE_DIR%/var/debug\",\"inherited\":true}},\"amconfig.header.mailserver\":{\"com.iplanet.am.smtphost\":{\"value\":\"localhost\",\"inherited\":true},\"com.iplanet.am.smtpport\":{\"value\":\"25\",\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"716744791\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "892" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 484, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.678Z", + "time": 7, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 7 + } + }, + { + "_id": "9bb3b1836c6fc48cdf19585c91e0d0b6", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 566, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/sdk" + }, + "response": { + "bodySize": 1309, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1309, + "text": "{\"_id\":\"03/properties/sdk\",\"_rev\":\"184752321\",\"amconfig.header.datastore\":{\"com.sun.identity.sm.enableDataStoreNotification\":{\"value\":false,\"inherited\":true},\"com.sun.identity.sm.notification.threadpool.size\":{\"value\":\"1\",\"inherited\":true}},\"amconfig.header.eventservice\":{\"com.iplanet.am.event.connection.num.retries\":{\"value\":\"3\",\"inherited\":true},\"com.iplanet.am.event.connection.delay.between.retries\":{\"value\":\"3000\",\"inherited\":true},\"com.iplanet.am.event.connection.ldap.error.codes.retries\":{\"value\":\"80,81,91\",\"inherited\":true},\"com.sun.am.event.connection.disable.list\":{\"value\":\"aci,um,sm\",\"inherited\":true}},\"amconfig.header.ldapconnection\":{\"com.iplanet.am.ldap.connection.num.retries\":{\"value\":\"3\",\"inherited\":true},\"com.iplanet.am.ldap.connection.delay.between.retries\":{\"value\":\"1000\",\"inherited\":true},\"com.iplanet.am.ldap.connection.ldap.error.codes.retries\":{\"value\":\"80,81,91\",\"inherited\":true}},\"amconfig.header.cachingreplica\":{\"com.iplanet.am.sdk.cache.maxSize\":{\"value\":\"10000\",\"inherited\":true}},\"amconfig.header.sdktimetoliveconfig\":{\"com.iplanet.am.sdk.cache.entry.expire.enabled\":{\"value\":false,\"inherited\":true},\"com.iplanet.am.sdk.cache.entry.user.expire.time\":{\"value\":\"15\",\"inherited\":true},\"com.iplanet.am.sdk.cache.entry.default.expire.time\":{\"value\":\"30\",\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"184752321\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1309" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.690Z", + "time": 6, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 6 + } + }, + { + "_id": "39e659d8cbc63b0064e0bc25dc3a2c1c", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 571, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/security" + }, + "response": { + "bodySize": 4176, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 4176, + "text": "{\"_id\":\"03/properties/security\",\"_rev\":\"347876904\",\"amconfig.header.encryption\":{\"am.encryption.pwd\":{\"value\":\"@AM_ENC_PWD@\",\"inherited\":true},\"com.iplanet.security.encryptor\":{\"value\":\"com.iplanet.services.util.JCEEncryption\",\"inherited\":true},\"com.iplanet.security.SecureRandomFactoryImpl\":{\"value\":\"com.iplanet.am.util.SecureRandomFactoryImpl\",\"inherited\":true},\"am.encryption.secret.enabled\":{\"value\":false,\"inherited\":true},\"am.encryption.secret.alias\":{\"value\":null,\"inherited\":true},\"am.encryption.secret.keystoreFile\":{\"value\":null,\"inherited\":true},\"am.encryption.secret.keystoreType\":{\"value\":\"JCEKS\",\"inherited\":true},\"am.encryption.secret.keystorePass\":{\"value\":null,\"inherited\":true},\"am.encryption.secret.keyPass\":{\"value\":null,\"inherited\":true}},\"amconfig.header.validation\":{\"com.iplanet.services.comm.server.pllrequest.maxContentLength\":{\"value\":\"16384\",\"inherited\":true},\"com.iplanet.am.clientIPCheckEnabled\":{\"value\":false,\"inherited\":true}},\"amconfig.header.cookie\":{\"com.iplanet.am.cookie.name\":{\"value\":\"iPlanetDirectoryPro\",\"inherited\":true},\"com.iplanet.am.cookie.secure\":{\"value\":false,\"inherited\":true},\"com.iplanet.am.cookie.encode\":{\"value\":false,\"inherited\":true}},\"amconfig.header.securitykey\":{\"com.sun.identity.saml.xmlsig.keystore\":{\"value\":\"%BASE_DIR%/security/keystores/keystore.jceks\",\"inherited\":true},\"com.sun.identity.saml.xmlsig.storetype\":{\"value\":\"JCEKS\",\"inherited\":true},\"com.sun.identity.saml.xmlsig.storepass\":{\"value\":\"%BASE_DIR%/security/secrets/default/.storepass\",\"inherited\":true},\"com.sun.identity.saml.xmlsig.keypass\":{\"value\":\"%BASE_DIR%/security/secrets/default/.keypass\",\"inherited\":true},\"com.sun.identity.saml.xmlsig.certalias\":{\"value\":\"test\",\"inherited\":true}},\"amconfig.header.crlcache\":{\"com.sun.identity.crl.cache.directory.host\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.crl.cache.directory.port\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.crl.cache.directory.ssl\":{\"value\":false,\"inherited\":true},\"com.sun.identity.crl.cache.directory.mtlsenabled\":{\"value\":false,\"inherited\":true},\"com.sun.identity.crl.cache.directory.user\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.crl.cache.directory.password\":{\"value\":null,\"inherited\":true},\"com.sun.identity.crl.cache.directory.searchlocs\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.crl.cache.directory.searchattr\":{\"value\":\"\",\"inherited\":true}},\"amconfig.header.ocsp.check\":{\"com.sun.identity.authentication.ocspCheck\":{\"value\":false,\"inherited\":true},\"com.sun.identity.authentication.ocsp.responder.url\":{\"value\":\"\",\"inherited\":true},\"com.sun.identity.authentication.ocsp.responder.nickname\":{\"value\":\"\",\"inherited\":true}},\"amconfig.header.deserialisationwhitelist\":{\"openam.deserialisation.classes.whitelist\":{\"value\":\"com.iplanet.dpro.session.DNOrIPAddressListTokenRestriction,com.sun.identity.common.CaseInsensitiveHashMap,com.sun.identity.common.CaseInsensitiveHashSet,com.sun.identity.common.CaseInsensitiveKey,com.sun.identity.console.base.model.SMSubConfig,com.sun.identity.console.session.model.SMSessionData,com.sun.identity.console.user.model.UMUserPasswordResetOptionsData,com.sun.identity.shared.datastruct.OrderedSet,com.sun.xml.bind.util.ListImpl,com.sun.xml.bind.util.ProxyListImpl,java.lang.Boolean,java.lang.Integer,java.lang.Number,java.lang.StringBuffer,java.net.InetAddress,java.security.cert.Certificate,java.security.cert.Certificate$CertificateRep,java.util.ArrayList,java.util.Collections$EmptyMap,java.util.Collections$EmptySet,java.util.Collections$SingletonList,java.util.HashMap,java.util.HashSet,java.util.LinkedHashSet,java.util.Locale,org.forgerock.openam.authentication.service.protocol.RemoteCookie,org.forgerock.openam.authentication.service.protocol.RemoteHttpServletRequest,org.forgerock.openam.authentication.service.protocol.RemoteHttpServletResponse,org.forgerock.openam.authentication.service.protocol.RemoteServletRequest,org.forgerock.openam.authentication.service.protocol.RemoteServletResponse,org.forgerock.openam.authentication.service.protocol.RemoteSession,org.forgerock.openam.dpro.session.NoOpTokenRestriction,org.forgerock.openam.dpro.session.ProofOfPossessionTokenRestriction\",\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"347876904\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "4176" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.701Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + }, + { + "_id": "c1221dfe872156f3e640659414919a31", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 570, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/session" + }, + "response": { + "bodySize": 914, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 914, + "text": "{\"_id\":\"03/properties/session\",\"_rev\":\"740010358\",\"amconfig.header.sessionthresholds\":{\"org.forgerock.openam.session.service.access.persistence.caching.maxsize\":{\"value\":\"5000\",\"inherited\":true},\"com.iplanet.am.session.invalidsessionmaxtime\":{\"value\":\"3\",\"inherited\":true}},\"amconfig.header.sessionlogging\":{\"com.iplanet.am.stats.interval\":{\"value\":\"60\",\"inherited\":true},\"com.iplanet.services.stats.state\":{\"value\":\"file\",\"inherited\":true},\"com.iplanet.services.stats.directory\":{\"value\":\"%BASE_DIR%/var/stats\",\"inherited\":true},\"com.sun.am.session.enableHostLookUp\":{\"value\":false,\"inherited\":true}},\"amconfig.header.sessionnotification\":{\"com.iplanet.am.notification.threadpool.size\":{\"value\":\"10\",\"inherited\":true},\"com.iplanet.am.notification.threadpool.threshold\":{\"value\":\"5000\",\"inherited\":true}},\"amconfig.header.sessionvalidation\":{\"com.sun.am.session.caseInsensitiveDN\":{\"value\":true,\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"740010358\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "914" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 484, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.711Z", + "time": 7, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 7 + } + }, + { + "_id": "2912b66fea537d5e81fa8e1d708a8e51", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 566, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/03/properties/uma" + }, + "response": { + "bodySize": 4121, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 4121, + "text": "{\"_id\":\"03/properties/uma\",\"_rev\":\"287631458\",\"amconfig.org.forgerock.services.resourcesets.store.common.section\":{\"org.forgerock.services.resourcesets.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.max.connections\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.resourcesets.store.external.section\":{\"org.forgerock.services.resourcesets.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.resourcesets.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.resourcesets.store.heartbeat\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.umaaudit.store.common.section\":{\"org.forgerock.services.umaaudit.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.max.connections\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.umaaudit.store.external.section\":{\"org.forgerock.services.umaaudit.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.umaaudit.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.umaaudit.store.heartbeat\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.uma.pendingrequests.store.common.section\":{\"org.forgerock.services.uma.pendingrequests.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.max.connections\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.uma.pendingrequests.store.external.section\":{\"org.forgerock.services.uma.pendingrequests.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.uma.pendingrequests.store.heartbeat\":{\"value\":\"10\",\"inherited\":true}},\"amconfig.org.forgerock.services.uma.labels.store.common.section\":{\"org.forgerock.services.uma.labels.store.location\":{\"value\":\"default\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.root.suffix\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.max.connections\":{\"value\":\"2\",\"inherited\":true}},\"amconfig.org.forgerock.services.uma.labels.store.external.section\":{\"org.forgerock.services.uma.labels.store.ssl.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.mtls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.starttls.enabled\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.directory.name\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.loginid\":{\"value\":\"\",\"inherited\":true},\"org.forgerock.services.uma.labels.store.password\":{\"value\":null,\"inherited\":true},\"org.forgerock.services.uma.labels.store.heartbeat\":{\"value\":\"10\",\"inherited\":true}}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"287631458\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "4121" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.724Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + }, + { + "_id": "81cbecd88adb83bff200ac40f9991ab3", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 583, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/server-default/properties/advanced" + }, + "response": { + "bodySize": 11880, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 11880, + "text": "{\"_id\":\"null/properties/advanced\",\"_rev\":\"2075833440\",\"com.iplanet.am.directory.ssl.enabled\":false,\"openam.auth.distAuthCookieName\":\"AMDistAuthCookie\",\"org.forgerock.services.default.store.max.connections\":\"\",\"org.forgerock.openam.ldap.dncache.expire.time\":\"0\",\"org.forgerock.openam.smtp.system.socket.write.timeout\":\"10000\",\"com.sun.identity.webcontainer\":\"WEB_CONTAINER\",\"com.sun.identity.security.checkcaller\":false,\"org.forgerock.services.cts.store.ttlsupport.exclusionlist\":\"\",\"org.forgerock.openam.ldap.keepalive.search.base\":\"\",\"org.forgerock.openam.idrepo.ldapv3.proxyauth.passwordreset.adminRequest\":\"isAdminPasswordChangeRequest\",\"openam.authentication.ignore_goto_during_logout\":false,\"com.sun.identity.saml.xmlsig.signatureprovider.class\":\"@XML_SIGNATURE_PROVIDER@\",\"openam.retained.http.request.headers\":\"X-DSAMEVersion\",\"com.sun.identity.url.readTimeout\":\"30000\",\"org.forgerock.openam.introspect.token.query.param.allowed\":false,\"openam.forbidden.to.copy.headers\":\"connection\",\"com.iplanet.am.lbcookie.value\":\"00\",\"com.sun.identity.plugin.log.class\":\"@LOG_PROVIDER_CLASS@\",\"com.iplanet.am.session.httpSession.enabled\":\"true\",\"com.sun.identity.saml.xmlsig.passwordDecoder\":\"@PASSWORD_DECODER_CLASS@\",\"org.forgerock.openam.scripting.maxinterpreterstackdepth\":\"10000\",\"com.iplanet.am.session.client.polling.enable\":false,\"com.iplanet.am.profile.port\":\"%SERVER_PORT%\",\"com.sun.identity.authentication.uniqueCookieName\":\"sunIdentityServerAuthNServer\",\"org.forgerock.openam.httpclienthandler.system.clients.pool.ttl\":\"-1\",\"com.iplanet.am.profile.host\":\"%SERVER_HOST%\",\"org.forgerock.openam.smtp.system.socket.read.timeout\":\"10000\",\"org.forgerock.openam.encryption.key.digest\":\"SHA1\",\"org.forgerock.openam.session.stateless.signing.allownone\":false,\"org.forgerock.openam.encryption.key.size\":\"128\",\"com.iplanet.am.logstatus\":\"ACTIVE\",\"org.forgerock.am.auth.trees.authenticate.identified.identity\":true,\"com.iplanet.am.jssproxy.trustAllServerCerts\":false,\"com.sun.identity.plugin.monitoring.saml2.class\":\"@MONSAML2_PROVIDER_CLASS@\",\"com.iplanet.am.installdir\":\"%BASE_DIR%\",\"org.forgerock.openam.trees.ids.cache.size\":\"50\",\"org.forgerock.openam.authentication.forceAuth.enabled\":false,\"org.forgerock.openam.httpclienthandler.system.proxy.uri\":\"\",\"com.sun.identity.jss.donotInstallAtHighestPriority\":true,\"org.forgerock.openam.idrepo.ldapv3.passwordpolicy.allowDiagnosticMessage\":false,\"com.sun.identity.enableUniqueSSOTokenCookie\":false,\"org.forgerock.services.cts.store.ttlsupport.enabled\":false,\"com.iplanet.am.serverMode\":true,\"org.forgerock.openam.timerpool.shutdown.retry.multiplier\":\"1.5\",\"dynamic.datastore.creation.enabled\":false,\"com.sun.identity.am.cookie.check\":false,\"org.forgerock.openam.core.resource.lookup.cache.enabled\":true,\"securidHelper.ports\":\"58943\",\"org.forgerock.openam.ldap.keepalive.search.filter\":\"(objectClass=*)\",\"org.forgerock.openam.saml2.authenticatorlookup.skewAllowance\":\"60\",\"org.forgerock.openam.url.connectTimeout\":\"1000\",\"com.sun.identity.plugin.monitoring.agent.class\":\"@MONAGENT_PROVIDER_CLASS@\",\"com.iplanet.am.buildVersion\":\"ForgeRock Access Management 7.5.0\",\"com.sun.identity.cookie.httponly\":true,\"org.forgerock.openam.sso.providers.list\":\"org.forgerock.openidconnect.ssoprovider.OpenIdConnectSSOProvider\",\"com.iplanet.am.pcookie.name\":\"DProPCookie\",\"com.sun.identity.policy.Policy.policy_evaluation_weights\":\"10:10:10\",\"org.forgerock.openam.secrets.special.user.passwords.format\":\"ENCRYPTED_PLAIN\",\"openam.auth.session_property_upgrader\":\"org.forgerock.openam.authentication.service.DefaultSessionPropertyUpgrader\",\"com.iplanet.am.session.client.polling.period\":\"180\",\"org.forgerock.openam.httpclienthandler.system.clients.connection.timeout\":\"10 seconds\",\"com.sun.identity.authentication.super.user\":\"uid=amAdmin,ou=People,%ROOT_SUFFIX%\",\"com.sun.identity.saml.xmlsig.keyprovider.class\":\"@XMLSIG_KEY_PROVIDER@\",\"org.forgerock.openam.timerpool.shutdown.retry.interval\":\"15000\",\"org.forgerock.services.openid.request.object.lifespan\":\"120000\",\"org.forgerock.am.auth.node.otp.inSharedState\":false,\"org.forgerock.openam.trees.consumedstatedata.cache.size\":\"15\",\"org.forgerock.openam.httpclienthandler.system.proxy.password\":null,\"org.forgerock.openam.showServletTraceInBrowser\":false,\"org.forgerock.openam.oauth2.checkIssuerForIdTokenInfo\":true,\"com.iplanet.am.version\":\"ForgeRock Access Management 7.5.0 Build 89116d59a1ebe73ed1931dd3649adb7f217cd06b (2024-March-28 16:00)\",\"com.iplanet.am.cookie.c66Encode\":true,\"org.forgerock.openam.radius.server.context.cache.size\":\"5000\",\"com.iplanet.am.jssproxy.checkSubjectAltName\":false,\"com.sun.identity.server.fqdnMap[hello]\":\"hello\",\"com.sun.am.event.notification.expire.time\":\"5\",\"com.sun.identity.server.fqdnMap[openam-frodo-dev.classic.com]\":\"openam-frodo-dev.classic.com\",\"org.forgerock.openam.httpclienthandler.system.clients.max.connections\":\"64\",\"openam.auth.version.header.enabled\":false,\"org.forgerock.openam.timerpool.shutdown.retry.limit\":\"3\",\"openam.serviceattributevalidator.classes.whitelist\":\"org.forgerock.openam.auth.nodes.validators.GreaterThanZeroValidator,org.forgerock.openam.auth.nodes.validators.HMACKeyLengthValidator,org.forgerock.openam.auth.nodes.validators.HmacSigningKeyValidator,org.forgerock.openam.auth.nodes.validators.PercentageValidator,org.forgerock.openam.auth.nodes.validators.QueryFilterValidator,org.forgerock.openam.auth.nodes.validators.SessionPropertyNameValidator,org.forgerock.openam.auth.nodes.validators.SessionPropertyValidator,org.forgerock.openam.auth.nodes.framework.validators.NodeValueValidator,org.forgerock.openam.audit.validation.PositiveIntegerValidator,org.forgerock.openam.authentication.modules.fr.oath.validators.AlphaNumericValidator,org.forgerock.openam.authentication.modules.fr.oath.validators.CodeLengthValidator,org.forgerock.openam.authentication.modules.persistentcookie.validation.SigningKeyValidator,com.sun.identity.common.configuration.DuplicateKeyMapValueValidator,com.sun.identity.common.configuration.AgentClientIpModeValueValidator,com.sun.identity.common.configuration.FilterModeValueValidator,com.sun.identity.common.configuration.GlobalMapValueValidator,com.sun.identity.common.configuration.ListValueValidator,com.sun.identity.common.configuration.MapValueValidator,com.sun.identity.common.configuration.ServerPropertyValidator,com.sun.identity.policy.ResourceComparatorValidator,com.sun.identity.sm.EmailValidator,com.sun.identity.sm.IPAddressValidator,com.sun.identity.sm.RequiredValueValidator,com.sun.identity.sm.ServerIDValidator,com.sun.identity.sm.SiteIDValidator,org.forgerock.openam.sm.validation.Base64EncodedBinaryValidator,org.forgerock.openam.sm.validation.BlankValueValidator,org.forgerock.openam.sm.validation.DurationValidator,org.forgerock.openam.sm.validation.EndpointValidator,org.forgerock.openam.sm.validation.HostnameValidator,org.forgerock.openam.sm.validation.PortValidator,org.forgerock.openam.sm.validation.SecretIdValidator,org.forgerock.openam.sm.validation.StatelessSessionSigningAlgorithmValidator,org.forgerock.openam.sm.validation.StringMapValidator,org.forgerock.openam.sm.validation.URLValidator,org.forgerock.openam.selfservice.config.KeyAliasValidator,org.forgerock.openam.sm.validation.UniqueIndexedValuesValidator,org.forgerock.openam.webhook.HttpHeaderValidator,org.forgerock.oauth2.core.ClientRedirectUriValidator\",\"org.forgerock.openam.core.sms.placeholder_api_enabled\":\"OFF\",\"org.forgerock.openam.session.service.persistence.deleteAsynchronously\":true,\"org.forgerock.openam.ldap.heartbeat.timeout\":\"10\",\"com.iplanet.security.SSLSocketFactoryImpl\":\"com.sun.identity.shared.ldap.factory.JSSESocketFactory\",\"com.sun.identity.session.repository.enableAttributeCompression\":false,\"org.forgerock.openam.httpclienthandler.system.nonProxyHosts\":\"localhost,127.*,[::1],0.0.0.0,[::0]\",\"org.forgerock.am.auth.chains.authindexuser.strict\":true,\"org.forgerock.security.entitlement.enforce.realm\":true,\"org.forgerock.allow.http.client.debug\":false,\"org.forgerock.openam.auth.transactionauth.returnErrorOnAuthFailure\":false,\"org.forgerock.openam.httpclienthandler.system.clients.retry.failed.requests.enabled\":true,\"org.forgerock.openam.authLevel.excludeRequiredOrRequisite\":false,\"org.forgerock.openam.redirecturlvalidator.maxUrlLength\":\"2000\",\"org.forgerock.openam.secrets.special.user.secret.refresh.seconds\":\"900\",\"com.iplanet.am.session.agentSessionIdleTime\":\"1440\",\"org.forgerock.openam.idm.attribute.names.lower.case\":false,\"org.forgerock.openam.ldap.secure.protocol.version\":\"TLSv1.3,TLSv1.2\",\"com.sun.identity.server.fqdnMap[openam]\":\"openam\",\"com.sun.identity.authentication.special.users\":\"cn=dsameuser,ou=DSAME Users,%ROOT_SUFFIX%|cn=amService-UrlAccessAgent,ou=DSAME Users,%ROOT_SUFFIX%\",\"org.forgerock.openam.httpclienthandler.system.clients.reuse.connections.enabled\":true,\"com.sun.identity.plugin.configuration.class\":\"@CONFIGURATION_PROVIDER_CLASS@\",\"com.iplanet.am.buildDate\":\"2024-March-28 16:00\",\"org.forgerock.openam.console.autocomplete.enabled\":true,\"com.sun.identity.monitoring\":\"off\",\"org.forgerock.openidconnect.ssoprovider.maxcachesize\":\"5000\",\"org.forgerock.openam.httpclienthandler.system.clients.response.timeout\":\"10 seconds\",\"org.forgerock.openam.request.max.bytes.entity.size\":\"1048576\",\"openam.session.case.sensitive.uuid\":false,\"com.sun.identity.cookie.samesite\":\"off\",\"org.forgerock.openam.xui.user.session.validation.enabled\":true,\"com.sun.identity.authentication.multiple.tabs.used\":false,\"openam.auth.destroy_session_after_upgrade\":true,\"org.forgerock.openam.session.stateless.encryption.method\":\"A128CBC-HS256\",\"com.sun.identity.plugin.session.class\":\"@SESSION_PROVIDER_CLASS@\",\"com.sun.identity.authentication.setCookieToAllDomains\":true,\"com.sun.identity.server.fqdnMap[localhost]\":\"localhost\",\"com.sun.identity.server.fqdnMap[secondDNS]\":\"secondDNS\",\"org.forgerock.services.cts.store.reaper.enabled\":true,\"org.forgerock.openam.httpclienthandler.system.proxy.username\":\"\",\"com.sun.identity.auth.cookieName\":\"AMAuthCookie\",\"com.sun.embedded.sync.servers\":\"on\",\"com.iplanet.am.daemons\":\"securid\",\"com.iplanet.am.jssproxy.resolveIPAddress\":false,\"openam.oauth2.client.jwt.encryption.algorithm.allow.list\":\"RSA-OAEP,RSA-OAEP-256,ECDH-ES\",\"com.sun.identity.policy.resultsCacheResourceCap\":\"20\",\"org.forgerock.openam.slf4j.enableTraceInMessage\":false,\"com.iplanet.am.buildRevision\":\"89116d59a1ebe73ed1931dd3649adb7f217cd06b\",\"com.sun.identity.policy.resultsCacheMaxSize\":\"10000\",\"com.sun.identity.sm.cache.ttl.enable\":false,\"com.sun.identity.session.repository.enableCompression\":false,\"org.forgerock.openam.session.stateless.rsa.padding\":\"RSA-OAEP-256\",\"com.sun.identity.server.fqdnMap[dnsfirst]\":\"dnsfirst\",\"openam.forbidden.to.copy.request.headers\":\"connection\",\"org.forgerock.openam.notifications.agents.enabled\":true,\"com.iplanet.am.jssproxy.SSLTrustHostList\":\"\",\"org.forgerock.openam.devices.recovery.use_insecure_storage\":false,\"com.sun.identity.sm.cache.ttl\":\"30\",\"org.forgerock.openam.audit.identity.activity.events.blacklist\":\"AM-ACCESS-ATTEMPT,AM-IDENTITY-CHANGE,AM-GROUP-CHANGE\",\"org.forgerock.openam.smtp.system.connect.timeout\":\"10000\",\"org.forgerock.openam.encryption.key.iterations\":\"10000\",\"openam.cdm.default.charset\":\"UTF-8\",\"com.sun.identity.session.repository.enableEncryption\":false,\"org.forgerock.security.oauth2.enforce.sub.claim.uniqueness\":true,\"org.forgerock.services.default.store.min.connections\":\"\",\"com.sun.identity.password.deploymentDescriptor\":\"%SERVER_URI%\",\"com.sun.identity.monitoring.local.conn.server.url\":\"service:jmx:rmi://\",\"com.sun.identity.plugin.datastore.class.default\":\"@DATASTORE_PROVIDER_CLASS@\",\"com.iplanet.am.lbcookie.name\":\"amlbcookie\",\"org.forgerock.openam.audit.additionalSuccessStatusCodesEnabled\":true,\"openam.oauth2.client.jwt.unreasonable.lifetime.limit.minutes\":\"30\",\"org.forgerock.openam.httpclienthandler.system.proxy.enabled\":false,\"openam.retained.http.headers\":\"X-DSAMEVersion\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2075833440\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 492, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.735Z", + "time": 4, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 4 + } + }, + { + "_id": "331311a035341935c2050cc505fa0272", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 578, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/server-default/properties/cts" + }, + "response": { + "bodySize": 793, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 793, + "text": "{\"_id\":\"null/properties/cts\",\"_rev\":\"1325772723\",\"amconfig.org.forgerock.services.cts.store.common.section\":{\"org.forgerock.services.cts.store.location\":\"default\",\"org.forgerock.services.cts.store.root.suffix\":\"\",\"org.forgerock.services.cts.store.max.connections\":\"100\",\"org.forgerock.services.cts.store.page.size\":\"0\",\"org.forgerock.services.cts.store.vlv.page.size\":\"1000\"},\"amconfig.org.forgerock.services.cts.store.external.section\":{\"org.forgerock.services.cts.store.ssl.enabled\":\"\",\"org.forgerock.services.cts.store.mtls.enabled\":\"\",\"org.forgerock.services.cts.store.starttls.enabled\":\"\",\"org.forgerock.services.cts.store.directory.name\":\"\",\"org.forgerock.services.cts.store.loginid\":\"\",\"org.forgerock.services.cts.store.password\":null,\"org.forgerock.services.cts.store.heartbeat\":\"10\"}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1325772723\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "793" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.744Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + }, + { + "_id": "a27edbf888e31b6187e8e448286b3d75", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 597, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/server-default/properties/directoryConfiguration" + }, + "response": { + "bodySize": 107, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 107, + "text": "{\"code\":404,\"reason\":\"Not Found\",\"message\":\"Unrecognised server properties section directoryConfiguration\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "107" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 465, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 404, + "statusText": "Not Found" + }, + "startedDateTime": "2024-11-07T21:49:53.753Z", + "time": 3, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 3 + } + }, + { + "_id": "21c3aed41c2cd86a0ce3a194506ec95c", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 582, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/server-default/properties/general" + }, + "response": { + "bodySize": 597, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 597, + "text": "{\"_id\":\"null/properties/general\",\"_rev\":\"2107617687\",\"amconfig.header.installdir\":{\"com.iplanet.services.configpath\":\"%BASE_DIR%\",\"com.iplanet.am.locale\":\"en_US\",\"com.sun.identity.client.notification.url\":\"%SERVER_PROTO%://%SERVER_HOST%:%SERVER_PORT%/%SERVER_URI%/notificationservice\",\"com.iplanet.am.util.xml.validating\":\"off\"},\"amconfig.header.debug\":{\"com.iplanet.services.debug.level\":\"off\",\"com.sun.services.debug.mergeall\":\"on\",\"com.iplanet.services.debug.directory\":\"%BASE_DIR%/var/debug\"},\"amconfig.header.mailserver\":{\"com.iplanet.am.smtphost\":\"localhost\",\"com.iplanet.am.smtpport\":\"25\"}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2107617687\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "597" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.760Z", + "time": 3, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 3 + } + }, + { + "_id": "6fb4fcf5718c3c4af670a3d7c91c293e", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 578, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/server-default/properties/sdk" + }, + "response": { + "bodySize": 961, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 961, + "text": "{\"_id\":\"null/properties/sdk\",\"_rev\":\"1693139785\",\"amconfig.header.datastore\":{\"com.sun.identity.sm.enableDataStoreNotification\":false,\"com.sun.identity.sm.notification.threadpool.size\":\"1\"},\"amconfig.header.eventservice\":{\"com.iplanet.am.event.connection.num.retries\":\"3\",\"com.iplanet.am.event.connection.delay.between.retries\":\"3000\",\"com.iplanet.am.event.connection.ldap.error.codes.retries\":\"80,81,91\",\"com.sun.am.event.connection.disable.list\":\"aci,um,sm\"},\"amconfig.header.ldapconnection\":{\"com.iplanet.am.ldap.connection.num.retries\":\"3\",\"com.iplanet.am.ldap.connection.delay.between.retries\":\"1000\",\"com.iplanet.am.ldap.connection.ldap.error.codes.retries\":\"80,81,91\"},\"amconfig.header.cachingreplica\":{\"com.iplanet.am.sdk.cache.maxSize\":\"10000\"},\"amconfig.header.sdktimetoliveconfig\":{\"com.iplanet.am.sdk.cache.entry.expire.enabled\":false,\"com.iplanet.am.sdk.cache.entry.user.expire.time\":\"15\",\"com.iplanet.am.sdk.cache.entry.default.expire.time\":\"30\"}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1693139785\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "961" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.767Z", + "time": 3, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 3 + } + }, + { + "_id": "41a447013aa584977851a1c391cff429", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 583, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/server-default/properties/security" + }, + "response": { + "bodySize": 3190, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 3190, + "text": "{\"_id\":\"null/properties/security\",\"_rev\":\"2079679470\",\"amconfig.header.encryption\":{\"am.encryption.pwd\":\"@AM_ENC_PWD@\",\"com.iplanet.security.encryptor\":\"com.iplanet.services.util.JCEEncryption\",\"com.iplanet.security.SecureRandomFactoryImpl\":\"com.iplanet.am.util.SecureRandomFactoryImpl\",\"am.encryption.secret.enabled\":false,\"am.encryption.secret.keystoreType\":\"JCEKS\"},\"amconfig.header.validation\":{\"com.iplanet.services.comm.server.pllrequest.maxContentLength\":\"16384\",\"com.iplanet.am.clientIPCheckEnabled\":false},\"amconfig.header.cookie\":{\"com.iplanet.am.cookie.name\":\"iPlanetDirectoryPro\",\"com.iplanet.am.cookie.secure\":false,\"com.iplanet.am.cookie.encode\":false},\"amconfig.header.securitykey\":{\"com.sun.identity.saml.xmlsig.keystore\":\"%BASE_DIR%/security/keystores/keystore.jceks\",\"com.sun.identity.saml.xmlsig.storetype\":\"JCEKS\",\"com.sun.identity.saml.xmlsig.storepass\":\"%BASE_DIR%/security/secrets/default/.storepass\",\"com.sun.identity.saml.xmlsig.keypass\":\"%BASE_DIR%/security/secrets/default/.keypass\",\"com.sun.identity.saml.xmlsig.certalias\":\"test\"},\"amconfig.header.crlcache\":{\"com.sun.identity.crl.cache.directory.host\":\"\",\"com.sun.identity.crl.cache.directory.port\":\"\",\"com.sun.identity.crl.cache.directory.ssl\":false,\"com.sun.identity.crl.cache.directory.mtlsenabled\":false,\"com.sun.identity.crl.cache.directory.user\":\"\",\"com.sun.identity.crl.cache.directory.password\":null,\"com.sun.identity.crl.cache.directory.searchlocs\":\"\",\"com.sun.identity.crl.cache.directory.searchattr\":\"\"},\"amconfig.header.ocsp.check\":{\"com.sun.identity.authentication.ocspCheck\":false,\"com.sun.identity.authentication.ocsp.responder.url\":\"\",\"com.sun.identity.authentication.ocsp.responder.nickname\":\"\"},\"amconfig.header.deserialisationwhitelist\":{\"openam.deserialisation.classes.whitelist\":\"com.iplanet.dpro.session.DNOrIPAddressListTokenRestriction,com.sun.identity.common.CaseInsensitiveHashMap,com.sun.identity.common.CaseInsensitiveHashSet,com.sun.identity.common.CaseInsensitiveKey,com.sun.identity.console.base.model.SMSubConfig,com.sun.identity.console.session.model.SMSessionData,com.sun.identity.console.user.model.UMUserPasswordResetOptionsData,com.sun.identity.shared.datastruct.OrderedSet,com.sun.xml.bind.util.ListImpl,com.sun.xml.bind.util.ProxyListImpl,java.lang.Boolean,java.lang.Integer,java.lang.Number,java.lang.StringBuffer,java.net.InetAddress,java.security.cert.Certificate,java.security.cert.Certificate$CertificateRep,java.util.ArrayList,java.util.Collections$EmptyMap,java.util.Collections$EmptySet,java.util.Collections$SingletonList,java.util.HashMap,java.util.HashSet,java.util.LinkedHashSet,java.util.Locale,org.forgerock.openam.authentication.service.protocol.RemoteCookie,org.forgerock.openam.authentication.service.protocol.RemoteHttpServletRequest,org.forgerock.openam.authentication.service.protocol.RemoteHttpServletResponse,org.forgerock.openam.authentication.service.protocol.RemoteServletRequest,org.forgerock.openam.authentication.service.protocol.RemoteServletResponse,org.forgerock.openam.authentication.service.protocol.RemoteSession,org.forgerock.openam.dpro.session.NoOpTokenRestriction,org.forgerock.openam.dpro.session.ProofOfPossessionTokenRestriction\"}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2079679470\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "3190" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 486, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.774Z", + "time": 4, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 4 + } + }, + { + "_id": "5e5c02bf1d57c6790471d08b17a92990", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 582, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/server-default/properties/session" + }, + "response": { + "bodySize": 673, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 673, + "text": "{\"_id\":\"null/properties/session\",\"_rev\":\"440293356\",\"amconfig.header.sessionthresholds\":{\"org.forgerock.openam.session.service.access.persistence.caching.maxsize\":\"5000\",\"com.iplanet.am.session.invalidsessionmaxtime\":\"3\"},\"amconfig.header.sessionlogging\":{\"com.iplanet.am.stats.interval\":\"60\",\"com.iplanet.services.stats.state\":\"file\",\"com.iplanet.services.stats.directory\":\"%BASE_DIR%/var/stats\",\"com.sun.am.session.enableHostLookUp\":false},\"amconfig.header.sessionnotification\":{\"com.iplanet.am.notification.threadpool.size\":\"10\",\"com.iplanet.am.notification.threadpool.threshold\":\"5000\"},\"amconfig.header.sessionvalidation\":{\"com.sun.am.session.caseInsensitiveDN\":true}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"440293356\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "673" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 484, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.782Z", + "time": 4, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 4 + } + }, + { + "_id": "555eb49059b21722276547a34aa11827", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/3.0.0" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-8b0d539c-b07a-44f9-ac7b-c4745d1a84f6" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.classic.com:8080" + } + ], + "headersSize": 578, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "http://openam-frodo-dev.classic.com:8080/am/json/global-config/servers/server-default/properties/uma" + }, + "response": { + "bodySize": 3043, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 3043, + "text": "{\"_id\":\"null/properties/uma\",\"_rev\":\"452158123\",\"amconfig.org.forgerock.services.resourcesets.store.common.section\":{\"org.forgerock.services.resourcesets.store.location\":\"default\",\"org.forgerock.services.resourcesets.store.root.suffix\":\"\",\"org.forgerock.services.resourcesets.store.max.connections\":\"10\"},\"amconfig.org.forgerock.services.resourcesets.store.external.section\":{\"org.forgerock.services.resourcesets.store.ssl.enabled\":\"\",\"org.forgerock.services.resourcesets.store.mtls.enabled\":\"\",\"org.forgerock.services.resourcesets.store.starttls.enabled\":\"\",\"org.forgerock.services.resourcesets.store.directory.name\":\"\",\"org.forgerock.services.resourcesets.store.loginid\":\"\",\"org.forgerock.services.resourcesets.store.password\":null,\"org.forgerock.services.resourcesets.store.heartbeat\":\"10\"},\"amconfig.org.forgerock.services.umaaudit.store.common.section\":{\"org.forgerock.services.umaaudit.store.location\":\"default\",\"org.forgerock.services.umaaudit.store.root.suffix\":\"\",\"org.forgerock.services.umaaudit.store.max.connections\":\"10\"},\"amconfig.org.forgerock.services.umaaudit.store.external.section\":{\"org.forgerock.services.umaaudit.store.ssl.enabled\":\"\",\"org.forgerock.services.umaaudit.store.mtls.enabled\":\"\",\"org.forgerock.services.umaaudit.store.starttls.enabled\":\"\",\"org.forgerock.services.umaaudit.store.directory.name\":\"\",\"org.forgerock.services.umaaudit.store.loginid\":\"\",\"org.forgerock.services.umaaudit.store.password\":null,\"org.forgerock.services.umaaudit.store.heartbeat\":\"10\"},\"amconfig.org.forgerock.services.uma.pendingrequests.store.common.section\":{\"org.forgerock.services.uma.pendingrequests.store.location\":\"default\",\"org.forgerock.services.uma.pendingrequests.store.root.suffix\":\"\",\"org.forgerock.services.uma.pendingrequests.store.max.connections\":\"10\"},\"amconfig.org.forgerock.services.uma.pendingrequests.store.external.section\":{\"org.forgerock.services.uma.pendingrequests.store.ssl.enabled\":\"\",\"org.forgerock.services.uma.pendingrequests.store.mtls.enabled\":\"\",\"org.forgerock.services.uma.pendingrequests.store.starttls.enabled\":\"\",\"org.forgerock.services.uma.pendingrequests.store.directory.name\":\"\",\"org.forgerock.services.uma.pendingrequests.store.loginid\":\"\",\"org.forgerock.services.uma.pendingrequests.store.password\":null,\"org.forgerock.services.uma.pendingrequests.store.heartbeat\":\"10\"},\"amconfig.org.forgerock.services.uma.labels.store.common.section\":{\"org.forgerock.services.uma.labels.store.location\":\"default\",\"org.forgerock.services.uma.labels.store.root.suffix\":\"\",\"org.forgerock.services.uma.labels.store.max.connections\":\"2\"},\"amconfig.org.forgerock.services.uma.labels.store.external.section\":{\"org.forgerock.services.uma.labels.store.ssl.enabled\":\"\",\"org.forgerock.services.uma.labels.store.mtls.enabled\":\"\",\"org.forgerock.services.uma.labels.store.starttls.enabled\":\"\",\"org.forgerock.services.uma.labels.store.directory.name\":\"\",\"org.forgerock.services.uma.labels.store.loginid\":\"\",\"org.forgerock.services.uma.labels.store.password\":null,\"org.forgerock.services.uma.labels.store.heartbeat\":\"10\"}}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"452158123\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "3043" + }, + { + "name": "date", + "value": "Thu, 07 Nov 2024 21:49:53 GMT" + }, + { + "name": "keep-alive", + "value": "timeout=20" + }, + { + "name": "connection", + "value": "keep-alive" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-11-07T21:49:53.791Z", + "time": 4, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 4 + } + } + ], + "pages": [], + "version": "1.2" + } +}