123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = exports.PublicAPIRouter = void 0;
- var _PromiseRouter = _interopRequireDefault(require("../PromiseRouter"));
- var _Config = _interopRequireDefault(require("../Config"));
- var _express = _interopRequireDefault(require("express"));
- var _path = _interopRequireDefault(require("path"));
- var _fs = _interopRequireDefault(require("fs"));
- var _querystring = _interopRequireDefault(require("querystring"));
- var _node = require("parse/node");
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
- const public_html = _path.default.resolve(__dirname, '../../public_html');
- const views = _path.default.resolve(__dirname, '../../views');
- class PublicAPIRouter extends _PromiseRouter.default {
- verifyEmail(req) {
- const {
- username,
- token: rawToken
- } = req.query;
- const token = rawToken && typeof rawToken !== 'string' ? rawToken.toString() : rawToken;
- const appId = req.params.appId;
- const config = _Config.default.get(appId);
- if (!config) {
- this.invalidRequest();
- }
- if (!config.publicServerURL) {
- return this.missingPublicServerURL();
- }
- if (!token || !username) {
- return this.invalidLink(req);
- }
- const userController = config.userController;
- return userController.verifyEmail(username, token).then(() => {
- const params = _querystring.default.stringify({
- username
- });
- return Promise.resolve({
- status: 302,
- location: `${config.verifyEmailSuccessURL}?${params}`
- });
- }, () => {
- return this.invalidVerificationLink(req);
- });
- }
- resendVerificationEmail(req) {
- const username = req.body.username;
- const appId = req.params.appId;
- const config = _Config.default.get(appId);
- if (!config) {
- this.invalidRequest();
- }
- if (!config.publicServerURL) {
- return this.missingPublicServerURL();
- }
- if (!username) {
- return this.invalidLink(req);
- }
- const userController = config.userController;
- return userController.resendVerificationEmail(username, req).then(() => {
- return Promise.resolve({
- status: 302,
- location: `${config.linkSendSuccessURL}`
- });
- }, () => {
- return Promise.resolve({
- status: 302,
- location: `${config.linkSendFailURL}`
- });
- });
- }
- changePassword(req) {
- return new Promise((resolve, reject) => {
- const config = _Config.default.get(req.query.id);
- if (!config) {
- this.invalidRequest();
- }
- if (!config.publicServerURL) {
- return resolve({
- status: 404,
- text: 'Not found.'
- });
- }
- // Should we keep the file in memory or leave like that?
- _fs.default.readFile(_path.default.resolve(views, 'choose_password'), 'utf-8', (err, data) => {
- if (err) {
- return reject(err);
- }
- data = data.replace('PARSE_SERVER_URL', `'${config.publicServerURL}'`);
- resolve({
- text: data
- });
- });
- });
- }
- requestResetPassword(req) {
- const config = req.config;
- if (!config) {
- this.invalidRequest();
- }
- if (!config.publicServerURL) {
- return this.missingPublicServerURL();
- }
- const {
- username,
- token: rawToken
- } = req.query;
- const token = rawToken && typeof rawToken !== 'string' ? rawToken.toString() : rawToken;
- if (!username || !token) {
- return this.invalidLink(req);
- }
- return config.userController.checkResetTokenValidity(username, token).then(() => {
- const params = _querystring.default.stringify({
- token,
- id: config.applicationId,
- username,
- app: config.appName
- });
- return Promise.resolve({
- status: 302,
- location: `${config.choosePasswordURL}?${params}`
- });
- }, () => {
- return this.invalidLink(req);
- });
- }
- resetPassword(req) {
- const config = req.config;
- if (!config) {
- this.invalidRequest();
- }
- if (!config.publicServerURL) {
- return this.missingPublicServerURL();
- }
- const {
- username,
- new_password,
- token: rawToken
- } = req.body;
- const token = rawToken && typeof rawToken !== 'string' ? rawToken.toString() : rawToken;
- if ((!username || !token || !new_password) && req.xhr === false) {
- return this.invalidLink(req);
- }
- if (!username) {
- throw new _node.Parse.Error(_node.Parse.Error.USERNAME_MISSING, 'Missing username');
- }
- if (!token) {
- throw new _node.Parse.Error(_node.Parse.Error.OTHER_CAUSE, 'Missing token');
- }
- if (!new_password) {
- throw new _node.Parse.Error(_node.Parse.Error.PASSWORD_MISSING, 'Missing password');
- }
- return config.userController.updatePassword(username, token, new_password).then(() => {
- return Promise.resolve({
- success: true
- });
- }, err => {
- return Promise.resolve({
- success: false,
- err
- });
- }).then(result => {
- const params = _querystring.default.stringify({
- username: username,
- token: token,
- id: config.applicationId,
- error: result.err,
- app: config.appName
- });
- if (req.xhr) {
- if (result.success) {
- return Promise.resolve({
- status: 200,
- response: 'Password successfully reset'
- });
- }
- if (result.err) {
- throw new _node.Parse.Error(_node.Parse.Error.OTHER_CAUSE, `${result.err}`);
- }
- }
- const encodedUsername = encodeURIComponent(username);
- const location = result.success ? `${config.passwordResetSuccessURL}?username=${encodedUsername}` : `${config.choosePasswordURL}?${params}`;
- return Promise.resolve({
- status: 302,
- location
- });
- });
- }
- invalidLink(req) {
- return Promise.resolve({
- status: 302,
- location: req.config.invalidLinkURL
- });
- }
- invalidVerificationLink(req) {
- const config = req.config;
- if (req.query.username && req.params.appId) {
- const params = _querystring.default.stringify({
- username: req.query.username,
- appId: req.params.appId
- });
- return Promise.resolve({
- status: 302,
- location: `${config.invalidVerificationLinkURL}?${params}`
- });
- } else {
- return this.invalidLink(req);
- }
- }
- missingPublicServerURL() {
- return Promise.resolve({
- text: 'Not found.',
- status: 404
- });
- }
- invalidRequest() {
- const error = new Error();
- error.status = 403;
- error.message = 'unauthorized';
- throw error;
- }
- setConfig(req) {
- req.config = _Config.default.get(req.params.appId);
- return Promise.resolve();
- }
- mountRoutes() {
- this.route('GET', '/apps/:appId/verify_email', req => {
- this.setConfig(req);
- }, req => {
- return this.verifyEmail(req);
- });
- this.route('POST', '/apps/:appId/resend_verification_email', req => {
- this.setConfig(req);
- }, req => {
- return this.resendVerificationEmail(req);
- });
- this.route('GET', '/apps/choose_password', req => {
- return this.changePassword(req);
- });
- this.route('POST', '/apps/:appId/request_password_reset', req => {
- this.setConfig(req);
- }, req => {
- return this.resetPassword(req);
- });
- this.route('GET', '/apps/:appId/request_password_reset', req => {
- this.setConfig(req);
- }, req => {
- return this.requestResetPassword(req);
- });
- }
- expressRouter() {
- const router = _express.default.Router();
- router.use('/apps', _express.default.static(public_html));
- router.use('/', super.expressRouter());
- return router;
- }
- }
- exports.PublicAPIRouter = PublicAPIRouter;
- var _default = exports.default = PublicAPIRouter;
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUHJvbWlzZVJvdXRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX0NvbmZpZyIsIl9leHByZXNzIiwiX3BhdGgiLCJfZnMiLCJfcXVlcnlzdHJpbmciLCJfbm9kZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsInB1YmxpY19odG1sIiwicGF0aCIsInJlc29sdmUiLCJfX2Rpcm5hbWUiLCJ2aWV3cyIsIlB1YmxpY0FQSVJvdXRlciIsIlByb21pc2VSb3V0ZXIiLCJ2ZXJpZnlFbWFpbCIsInJlcSIsInVzZXJuYW1lIiwidG9rZW4iLCJyYXdUb2tlbiIsInF1ZXJ5IiwidG9TdHJpbmciLCJhcHBJZCIsInBhcmFtcyIsImNvbmZpZyIsIkNvbmZpZyIsImdldCIsImludmFsaWRSZXF1ZXN0IiwicHVibGljU2VydmVyVVJMIiwibWlzc2luZ1B1YmxpY1NlcnZlclVSTCIsImludmFsaWRMaW5rIiwidXNlckNvbnRyb2xsZXIiLCJ0aGVuIiwicXMiLCJzdHJpbmdpZnkiLCJQcm9taXNlIiwic3RhdHVzIiwibG9jYXRpb24iLCJ2ZXJpZnlFbWFpbFN1Y2Nlc3NVUkwiLCJpbnZhbGlkVmVyaWZpY2F0aW9uTGluayIsInJlc2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiYm9keSIsImxpbmtTZW5kU3VjY2Vzc1VSTCIsImxpbmtTZW5kRmFpbFVSTCIsImNoYW5nZVBhc3N3b3JkIiwicmVqZWN0IiwiaWQiLCJ0ZXh0IiwiZnMiLCJyZWFkRmlsZSIsImVyciIsImRhdGEiLCJyZXBsYWNlIiwicmVxdWVzdFJlc2V0UGFzc3dvcmQiLCJjaGVja1Jlc2V0VG9rZW5WYWxpZGl0eSIsImFwcGxpY2F0aW9uSWQiLCJhcHAiLCJhcHBOYW1lIiwiY2hvb3NlUGFzc3dvcmRVUkwiLCJyZXNldFBhc3N3b3JkIiwibmV3X3Bhc3N3b3JkIiwieGhyIiwiUGFyc2UiLCJFcnJvciIsIlVTRVJOQU1FX01JU1NJTkciLCJPVEhFUl9DQVVTRSIsIlBBU1NXT1JEX01JU1NJTkciLCJ1cGRhdGVQYXNzd29yZCIsInN1Y2Nlc3MiLCJyZXN1bHQiLCJlcnJvciIsInJlc3BvbnNlIiwiZW5jb2RlZFVzZXJuYW1lIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicGFzc3dvcmRSZXNldFN1Y2Nlc3NVUkwiLCJpbnZhbGlkTGlua1VSTCIsImludmFsaWRWZXJpZmljYXRpb25MaW5rVVJMIiwibWVzc2FnZSIsInNldENvbmZpZyIsIm1vdW50Um91dGVzIiwicm91dGUiLCJleHByZXNzUm91dGVyIiwicm91dGVyIiwiZXhwcmVzcyIsIlJvdXRlciIsInVzZSIsInN0YXRpYyIsImV4cG9ydHMiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL1B1YmxpY0FQSVJvdXRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUHJvbWlzZVJvdXRlciBmcm9tICcuLi9Qcm9taXNlUm91dGVyJztcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vQ29uZmlnJztcbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHFzIGZyb20gJ3F1ZXJ5c3RyaW5nJztcbmltcG9ydCB7IFBhcnNlIH0gZnJvbSAncGFyc2Uvbm9kZSc7XG5cbmNvbnN0IHB1YmxpY19odG1sID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uLy4uL3B1YmxpY19odG1sJyk7XG5jb25zdCB2aWV3cyA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLi8uLi92aWV3cycpO1xuXG5leHBvcnQgY2xhc3MgUHVibGljQVBJUm91dGVyIGV4dGVuZHMgUHJvbWlzZVJvdXRlciB7XG4gIHZlcmlmeUVtYWlsKHJlcSkge1xuICAgIGNvbnN0IHsgdXNlcm5hbWUsIHRva2VuOiByYXdUb2tlbiB9ID0gcmVxLnF1ZXJ5O1xuICAgIGNvbnN0IHRva2VuID0gcmF3VG9rZW4gJiYgdHlwZW9mIHJhd1Rva2VuICE9PSAnc3RyaW5nJyA/IHJhd1Rva2VuLnRvU3RyaW5nKCkgOiByYXdUb2tlbjtcblxuICAgIGNvbnN0IGFwcElkID0gcmVxLnBhcmFtcy5hcHBJZDtcbiAgICBjb25zdCBjb25maWcgPSBDb25maWcuZ2V0KGFwcElkKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICB0aGlzLmludmFsaWRSZXF1ZXN0KCk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcucHVibGljU2VydmVyVVJMKSB7XG4gICAgICByZXR1cm4gdGhpcy5taXNzaW5nUHVibGljU2VydmVyVVJMKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0b2tlbiB8fCAhdXNlcm5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRMaW5rKHJlcSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlckNvbnRyb2xsZXIgPSBjb25maWcudXNlckNvbnRyb2xsZXI7XG4gICAgcmV0dXJuIHVzZXJDb250cm9sbGVyLnZlcmlmeUVtYWlsKHVzZXJuYW1lLCB0b2tlbikudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gcXMuc3RyaW5naWZ5KHsgdXNlcm5hbWUgfSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIHN0YXR1czogMzAyLFxuICAgICAgICAgIGxvY2F0aW9uOiBgJHtjb25maWcudmVyaWZ5RW1haWxTdWNjZXNzVVJMfT8ke3BhcmFtc31gLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmludmFsaWRWZXJpZmljYXRpb25MaW5rKHJlcSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHJlc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHJlcSkge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gcmVxLmJvZHkudXNlcm5hbWU7XG4gICAgY29uc3QgYXBwSWQgPSByZXEucGFyYW1zLmFwcElkO1xuICAgIGNvbnN0IGNvbmZpZyA9IENvbmZpZy5nZXQoYXBwSWQpO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHRoaXMuaW52YWxpZFJlcXVlc3QoKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5wdWJsaWNTZXJ2ZXJVUkwpIHtcbiAgICAgIHJldHVybiB0aGlzLm1pc3NpbmdQdWJsaWNTZXJ2ZXJVUkwoKTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZXJuYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkTGluayhyZXEpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJDb250cm9sbGVyID0gY29uZmlnLnVzZXJDb250cm9sbGVyO1xuXG4gICAgcmV0dXJuIHVzZXJDb250cm9sbGVyLnJlc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHVzZXJuYW1lLCByZXEpLnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIHN0YXR1czogMzAyLFxuICAgICAgICAgIGxvY2F0aW9uOiBgJHtjb25maWcubGlua1NlbmRTdWNjZXNzVVJMfWAsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgc3RhdHVzOiAzMDIsXG4gICAgICAgICAgbG9jYXRpb246IGAke2NvbmZpZy5saW5rU2VuZEZhaWxVUkx9YCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGNoYW5nZVBhc3N3b3JkKHJlcSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBjb25maWcgPSBDb25maWcuZ2V0KHJlcS5xdWVyeS5pZCk7XG5cbiAgICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgIHRoaXMuaW52YWxpZFJlcXVlc3QoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjb25maWcucHVibGljU2VydmVyVVJMKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKHtcbiAgICAgICAgICBzdGF0dXM6IDQwNCxcbiAgICAgICAgICB0ZXh0OiAnTm90IGZvdW5kLicsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gU2hvdWxkIHdlIGtlZXAgdGhlIGZpbGUgaW4gbWVtb3J5IG9yIGxlYXZlIGxpa2UgdGhhdD9cbiAgICAgIGZzLnJlYWRGaWxlKHBhdGgucmVzb2x2ZSh2aWV3cywgJ2Nob29zZV9wYXNzd29yZCcpLCAndXRmLTgnLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgnUEFSU0VfU0VSVkVSX1VSTCcsIGAnJHtjb25maWcucHVibGljU2VydmVyVVJMfSdgKTtcbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgdGV4dDogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlcXVlc3RSZXNldFBhc3N3b3JkKHJlcSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlcS5jb25maWc7XG5cbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgdGhpcy5pbnZhbGlkUmVxdWVzdCgpO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLnB1YmxpY1NlcnZlclVSTCkge1xuICAgICAgcmV0dXJuIHRoaXMubWlzc2luZ1B1YmxpY1NlcnZlclVSTCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdXNlcm5hbWUsIHRva2VuOiByYXdUb2tlbiB9ID0gcmVxLnF1ZXJ5O1xuICAgIGNvbnN0IHRva2VuID0gcmF3VG9rZW4gJiYgdHlwZW9mIHJhd1Rva2VuICE9PSAnc3RyaW5nJyA/IHJhd1Rva2VuLnRvU3RyaW5nKCkgOiByYXdUb2tlbjtcblxuICAgIGlmICghdXNlcm5hbWUgfHwgIXRva2VuKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkTGluayhyZXEpO1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWcudXNlckNvbnRyb2xsZXIuY2hlY2tSZXNldFRva2VuVmFsaWRpdHkodXNlcm5hbWUsIHRva2VuKS50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBxcy5zdHJpbmdpZnkoe1xuICAgICAgICAgIHRva2VuLFxuICAgICAgICAgIGlkOiBjb25maWcuYXBwbGljYXRpb25JZCxcbiAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICBhcHA6IGNvbmZpZy5hcHBOYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgc3RhdHVzOiAzMDIsXG4gICAgICAgICAgbG9jYXRpb246IGAke2NvbmZpZy5jaG9vc2VQYXNzd29yZFVSTH0/JHtwYXJhbXN9YCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZhbGlkTGluayhyZXEpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICByZXNldFBhc3N3b3JkKHJlcSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlcS5jb25maWc7XG5cbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgdGhpcy5pbnZhbGlkUmVxdWVzdCgpO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLnB1YmxpY1NlcnZlclVSTCkge1xuICAgICAgcmV0dXJuIHRoaXMubWlzc2luZ1B1YmxpY1NlcnZlclVSTCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdXNlcm5hbWUsIG5ld19wYXNzd29yZCwgdG9rZW46IHJhd1Rva2VuIH0gPSByZXEuYm9keTtcbiAgICBjb25zdCB0b2tlbiA9IHJhd1Rva2VuICYmIHR5cGVvZiByYXdUb2tlbiAhPT0gJ3N0cmluZycgPyByYXdUb2tlbi50b1N0cmluZygpIDogcmF3VG9rZW47XG5cbiAgICBpZiAoKCF1c2VybmFtZSB8fCAhdG9rZW4gfHwgIW5ld19wYXNzd29yZCkgJiYgcmVxLnhociA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRMaW5rKHJlcSk7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VybmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlVTRVJOQU1FX01JU1NJTkcsICdNaXNzaW5nIHVzZXJuYW1lJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9USEVSX0NBVVNFLCAnTWlzc2luZyB0b2tlbicpO1xuICAgIH1cblxuICAgIGlmICghbmV3X3Bhc3N3b3JkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuUEFTU1dPUkRfTUlTU0lORywgJ01pc3NpbmcgcGFzc3dvcmQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnLnVzZXJDb250cm9sbGVyXG4gICAgICAudXBkYXRlUGFzc3dvcmQodXNlcm5hbWUsIHRva2VuLCBuZXdfcGFzc3dvcmQpXG4gICAgICAudGhlbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBxcy5zdHJpbmdpZnkoe1xuICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcbiAgICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgICAgaWQ6IGNvbmZpZy5hcHBsaWNhdGlvbklkLFxuICAgICAgICAgIGVycm9yOiByZXN1bHQuZXJyLFxuICAgICAgICAgIGFwcDogY29uZmlnLmFwcE5hbWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXEueGhyKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgICAgIHJlc3BvbnNlOiAnUGFzc3dvcmQgc3VjY2Vzc2Z1bGx5IHJlc2V0JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0LmVycikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9USEVSX0NBVVNFLCBgJHtyZXN1bHQuZXJyfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuY29kZWRVc2VybmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudCh1c2VybmFtZSk7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcmVzdWx0LnN1Y2Nlc3NcbiAgICAgICAgICA/IGAke2NvbmZpZy5wYXNzd29yZFJlc2V0U3VjY2Vzc1VSTH0/dXNlcm5hbWU9JHtlbmNvZGVkVXNlcm5hbWV9YFxuICAgICAgICAgIDogYCR7Y29uZmlnLmNob29zZVBhc3N3b3JkVVJMfT8ke3BhcmFtc31gO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIHN0YXR1czogMzAyLFxuICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgaW52YWxpZExpbmsocmVxKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICBzdGF0dXM6IDMwMixcbiAgICAgIGxvY2F0aW9uOiByZXEuY29uZmlnLmludmFsaWRMaW5rVVJMLFxuICAgIH0pO1xuICB9XG5cbiAgaW52YWxpZFZlcmlmaWNhdGlvbkxpbmsocmVxKSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVxLmNvbmZpZztcbiAgICBpZiAocmVxLnF1ZXJ5LnVzZXJuYW1lICYmIHJlcS5wYXJhbXMuYXBwSWQpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHFzLnN0cmluZ2lmeSh7XG4gICAgICAgIHVzZXJuYW1lOiByZXEucXVlcnkudXNlcm5hbWUsXG4gICAgICAgIGFwcElkOiByZXEucGFyYW1zLmFwcElkLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgc3RhdHVzOiAzMDIsXG4gICAgICAgIGxvY2F0aW9uOiBgJHtjb25maWcuaW52YWxpZFZlcmlmaWNhdGlvbkxpbmtVUkx9PyR7cGFyYW1zfWAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZExpbmsocmVxKTtcbiAgICB9XG4gIH1cblxuICBtaXNzaW5nUHVibGljU2VydmVyVVJMKCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgdGV4dDogJ05vdCBmb3VuZC4nLFxuICAgICAgc3RhdHVzOiA0MDQsXG4gICAgfSk7XG4gIH1cblxuICBpbnZhbGlkUmVxdWVzdCgpIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcigpO1xuICAgIGVycm9yLnN0YXR1cyA9IDQwMztcbiAgICBlcnJvci5tZXNzYWdlID0gJ3VuYXV0aG9yaXplZCc7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBzZXRDb25maWcocmVxKSB7XG4gICAgcmVxLmNvbmZpZyA9IENvbmZpZy5nZXQocmVxLnBhcmFtcy5hcHBJZCk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgbW91bnRSb3V0ZXMoKSB7XG4gICAgdGhpcy5yb3V0ZShcbiAgICAgICdHRVQnLFxuICAgICAgJy9hcHBzLzphcHBJZC92ZXJpZnlfZW1haWwnLFxuICAgICAgcmVxID0+IHtcbiAgICAgICAgdGhpcy5zZXRDb25maWcocmVxKTtcbiAgICAgIH0sXG4gICAgICByZXEgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJpZnlFbWFpbChyZXEpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnJvdXRlKFxuICAgICAgJ1BPU1QnLFxuICAgICAgJy9hcHBzLzphcHBJZC9yZXNlbmRfdmVyaWZpY2F0aW9uX2VtYWlsJyxcbiAgICAgIHJlcSA9PiB7XG4gICAgICAgIHRoaXMuc2V0Q29uZmlnKHJlcSk7XG4gICAgICB9LFxuICAgICAgcmVxID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzZW5kVmVyaWZpY2F0aW9uRW1haWwocmVxKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5yb3V0ZSgnR0VUJywgJy9hcHBzL2Nob29zZV9wYXNzd29yZCcsIHJlcSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jaGFuZ2VQYXNzd29yZChyZXEpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yb3V0ZShcbiAgICAgICdQT1NUJyxcbiAgICAgICcvYXBwcy86YXBwSWQvcmVxdWVzdF9wYXNzd29yZF9yZXNldCcsXG4gICAgICByZXEgPT4ge1xuICAgICAgICB0aGlzLnNldENvbmZpZyhyZXEpO1xuICAgICAgfSxcbiAgICAgIHJlcSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2V0UGFzc3dvcmQocmVxKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5yb3V0ZShcbiAgICAgICdHRVQnLFxuICAgICAgJy9hcHBzLzphcHBJZC9yZXF1ZXN0X3Bhc3N3b3JkX3Jlc2V0JyxcbiAgICAgIHJlcSA9PiB7XG4gICAgICAgIHRoaXMuc2V0Q29uZmlnKHJlcSk7XG4gICAgICB9LFxuICAgICAgcmVxID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdFJlc2V0UGFzc3dvcmQocmVxKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZXhwcmVzc1JvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuICAgIHJvdXRlci51c2UoJy9hcHBzJywgZXhwcmVzcy5zdGF0aWMocHVibGljX2h0bWwpKTtcbiAgICByb3V0ZXIudXNlKCcvJywgc3VwZXIuZXhwcmVzc1JvdXRlcigpKTtcbiAgICByZXR1cm4gcm91dGVyO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFB1YmxpY0FQSVJvdXRlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsY0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsS0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksR0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssWUFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sS0FBQSxHQUFBTixPQUFBO0FBQW1DLFNBQUFELHVCQUFBUSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRW5DLE1BQU1HLFdBQVcsR0FBR0MsYUFBSSxDQUFDQyxPQUFPLENBQUNDLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQztBQUNoRSxNQUFNQyxLQUFLLEdBQUdILGFBQUksQ0FBQ0MsT0FBTyxDQUFDQyxTQUFTLEVBQUUsYUFBYSxDQUFDO0FBRTdDLE1BQU1FLGVBQWUsU0FBU0Msc0JBQWEsQ0FBQztFQUNqREMsV0FBV0EsQ0FBQ0MsR0FBRyxFQUFFO0lBQ2YsTUFBTTtNQUFFQyxRQUFRO01BQUVDLEtBQUssRUFBRUM7SUFBUyxDQUFDLEdBQUdILEdBQUcsQ0FBQ0ksS0FBSztJQUMvQyxNQUFNRixLQUFLLEdBQUdDLFFBQVEsSUFBSSxPQUFPQSxRQUFRLEtBQUss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
|