UNPKG

agenda-paper

Version:

Show your daily agenda on an ePaper display

3 lines 73.3 kB
#!/usr/bin/env node !function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=9)}([function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.TOKEN_FILE_PATH=t.ENV_FILE_PATH=t.CONFIG_FOLDER=void 0;const r=o(n(11));t.CONFIG_FOLDER=r.default.homedir()+"/.agenda-paper",t.ENV_FILE_PATH=t.CONFIG_FOLDER+"/.env",t.TOKEN_FILE_PATH=t.CONFIG_FOLDER+"/.token"},function(e,t){e.exports=require("fs")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initializePayload=void 0;t.initializePayload=()=>(e,t,n)=>{const o=e;o.payload=o.payload||{},n()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.openSockets=void 0,t.openSockets=[]},function(e,t){e.exports=require("express")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getEventsBetweenDateTimes=t.getCalendars=t.convertCodeToRefreshToken=t.createAuthUrl=void 0;const o=n(17),r=n(18);function s(e){const t=(0,r.getEnvVariableOrDie)("GOOGLE_CLIENT_ID"),n=(0,r.getEnvVariableOrDie)("GOOGLE_CLIENT_SECRET"),s=new o.google.auth.OAuth2(t,n,"http://localhost:3000/api/auth/login/callback");if(e){const t={refresh_token:e};s.setCredentials(t)}return s}function i(e,t){if(200===e.status||t&&t.includes(e.status))return e.data;console.error(`google api unsuccessfull: ${e.status} - ${e.statusText}`)}function a(e,t){console.error(`error while making ${t} google api call:\n`,e)}t.createAuthUrl=()=>{const e={access_type:"offline",scope:["https://www.googleapis.com/auth/calendar.readonly","https://www.googleapis.com/auth/calendar.events.readonly"],prompt:["select_account","consent"].join(" "),state:JSON.stringify(t)};var t;return s().generateAuthUrl(e)};function c(e){return o.google.calendar({version:"v3",auth:e})}t.convertCodeToRefreshToken=async e=>{let t;const n=s();try{const{tokens:o}=await n.getToken(e);t=o.refresh_token}catch(e){const{response:{status:t,data:n}={}}=e,o=["status: "+(t||"")];n&&(o.push("error: "+(n.error||"")),o.push("description: "+(n.error_description||"")));const r="failed to convert code to token - "+o.join(",");throw console.error(r+"\n",e),e}return t};t.getCalendars=async e=>{const t=c(s(e));try{const e=i(await t.calendarList.list());return e&&e.items?e.items.map(e=>({id:e.id,isPrimary:!!e.primary})):void 0}catch(e){throw a(e,"get calendars"),e}};t.getEventsBetweenDateTimes=async(e,t,n,o)=>{const r=s(e),u={calendarId:t,timeMin:n,timeMax:o,singleEvents:!0,orderBy:"startTime"};try{const e=await async function(e,t){const n=c(e);return i(await n.events.list(t))}(r,u);if(!e||!e.items)return;const t=e.items.filter(e=>!function(e){if(!e)return!1;const t=e.find(e=>e.self);return!(!t||"declined"!==t.responseStatus)}(e.attendees));return t.map(e=>{const t=(e.start||{}).dateTime,n=(e.end||{}).dateTime;return{id:e.id,title:e.summary,start:t,end:n,location:e.location,isPrivate:"private"===e.visibility,isFree:"transparent"===e.transparency}})}catch(e){throw a(e,"events query"),e}}},function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.authenticate=t.storeRefreshToken=t.loadGoogleRefreshTokenIfExists=void 0;const r=o(n(1)),s=n(0),i=n(2),a=r.default.promises;t.loadGoogleRefreshTokenIfExists=()=>async(e,t,n)=>{const{payload:o}=e;if(r.default.existsSync(s.TOKEN_FILE_PATH)){const e=await a.readFile(s.TOKEN_FILE_PATH);o.googleRefreshToken=e.toString()}n()};t.storeRefreshToken=()=>async(e,t,n)=>{const{payload:o}=e,{googleRefreshToken:r}=o;await a.writeFile(s.CONFIG_FOLDER+"/.token",r),n()};t.authenticate=()=>[(0,i.initializePayload)(),(0,t.loadGoogleRefreshTokenIfExists)(),async(e,t,n)=>{const{payload:o}=e,{googleRefreshToken:r}=o;if(!r)return t.status(401).send("user not authenticated");n()}]},function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.verifyConfigFolderExists=void 0;const r=o(n(1)),s=n(0);t.verifyConfigFolderExists=()=>async(e,t,n)=>{r.default.existsSync(s.CONFIG_FOLDER)||r.default.mkdirSync(s.CONFIG_FOLDER),n()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.saveSettingsToFile=t.extractSettingsFromBody=t.loadSettingsFromFile=void 0;const o=n(0),r=n(22),s=o.CONFIG_FOLDER+"/settings.json",i={showLocation:!1,showFreeEvents:!1,maskPrivateEvents:!0};t.loadSettingsFromFile=()=>async(e,t,n)=>{const{payload:o}=e;let a;(0,r.doesFileExist)(s)?a=(0,r.readJsonFile)(s):(a=i,(0,r.writeJsonToFile)(s,a)),o.settings=a,n()};t.extractSettingsFromBody=()=>async(e,t,n)=>{const{body:o,payload:r}=e,{showLocation:s,showFreeEvents:i,maskPrivateEvents:a}=o,c={showLocation:s,showFreeEvents:i,maskPrivateEvents:a};r.settings=c,n()};t.saveSettingsToFile=()=>async(e,t,n)=>{const{payload:o}=e,{settings:i}=o;try{(0,r.writeJsonToFile)(s,i)}catch(e){return console.error(e),t.status(500).send()}return n()}},function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const r=o(n(10)),s=n(0),i=n(12);function a(e){process.env[e]||(console.error(e+" env variable is missing"),process.exit(1))}r.default.config({path:s.ENV_FILE_PATH}),a("GOOGLE_CLIENT_ID"),a("GOOGLE_CLIENT_SECRET"),(0,i.startServer)()},function(e,t){e.exports=require("dotenv")},function(e,t){e.exports=require("os")},function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.startServer=void 0;const r=o(n(13)),s=o(n(4)),i=o(n(14)),a=o(n(15)),c=n(3),u=n(24);t.startServer=function(){const e=(0,i.default)((0,s.default)()).app;e.use(s.default.json()),e.use("/api",a.default),e.ws("/ws",(function(e,t){e.on("message",t=>{"listen"===t.toString()&&c.openSockets.push(e)})})),e.use(s.default.static(r.default.join(__dirname,"./client"))),e.use("*",(e,t)=>{t.sendFile(r.default.join(__dirname,"./client/index.html"))});const t=process.env.PORT?parseInt(process.env.PORT):3e3;return e.listen(t,"localhost",()=>{console.log("started running in port "+t),(0,u.startEpaper)()}),e}},function(e,t){e.exports=require("path")},function(e,t){e.exports=require("express-ws")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(4),r=n(16),s=n(19),i=n(23),a=n(6),c=(0,o.Router)();c.get("/auth/login-status",(0,r.isLoggedIn)()),c.get("/auth/login",(0,r.loginUser)()),c.get("/auth/login/callback",(0,r.authorizeUser)()),c.get("/settings",(0,i.getSettings)()),c.post("/settings",(0,i.saveSettings)()),c.get("/calendar/events",(0,a.authenticate)(),(0,s.getCurrentCalendarEvents)()),t.default=c},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.authorizeUser=t.loginUser=t.isLoggedIn=void 0;const o=n(5),r=n(3),s=n(2),i=n(6),a=n(7);t.isLoggedIn=()=>[(0,s.initializePayload)(),(0,i.loadGoogleRefreshTokenIfExists)(),async(e,t)=>{const{payload:n}=e,{googleRefreshToken:o}=n;t.json({isLoggedIn:!!o})}];t.loginUser=()=>[(0,s.initializePayload)(),async(e,t)=>{const n=(0,o.createAuthUrl)();t.redirect(n)}];t.authorizeUser=()=>[(0,s.initializePayload)(),(e,t,n)=>{const{query:o,payload:r}=e,{code:s}=o;if(!s){const e="auth code was not sent";return console.error(e),t.status(400).send(e)}return r.code=s,n()},async(e,t,n)=>{const{payload:r}=e,{code:s}=r;try{r.googleRefreshToken=await(0,o.convertCodeToRefreshToken)(s)}catch(e){return console.error("converting auth code to tokens failed"),t.status(500).send()}return n()},(0,a.verifyConfigFolderExists)(),(0,i.storeRefreshToken)(),(e,t,n)=>{r.openSockets.forEach(e=>{e.send("loggedIn")}),n()},(e,t)=>t.redirect("http://localhost:3000/settings")]},function(e,t){e.exports=require("googleapis")},function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.updateEnvFile=t.getEnvVariableOrDie=void 0;const r=o(n(1));t.getEnvVariableOrDie=function(e){const t=process.env[e];if(void 0===t)throw new Error(e+" env variable not provided");return t},t.updateEnvFile=function(e,t){const n=t.map(e=>`${e}=${process.env[e]}`).join("\n");r.default.writeFileSync(e,n)}},function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getCurrentCalendarEvents=void 0;const r=o(n(20)),s=n(5),i=n(21),a=n(2),c=n(8);const u=()=>async(e,t,n)=>{const{payload:o}=e,{googleRefreshToken:a,settings:c}=o,{showFreeEvents:u,maskPrivateEvents:l}=c;let d=await async function(e){const t=(0,r.default)(),n=(0,r.default)(t).endOf("day");return console.info(t.format("HH:mm")+": fetching events"),await(0,i.callWithRetry)(()=>(0,s.getEventsBetweenDateTimes)(e,"primary",t.toISOString(),n.toISOString()))}(a);d&&(l&&d.forEach(e=>{e.isPrivate&&(e.title="Private")}),u||(d=d.filter(e=>!e.isFree)),o.calendarEvents=d),n()};t.getCurrentCalendarEvents=()=>[(0,a.initializePayload)(),(0,c.loadSettingsFromFile)(),u(),async(e,t)=>{const{payload:n}=e,{calendarEvents:o}=n;return t.json(o)}]},function(e,t){e.exports=require("dayjs")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.callWithRetry=void 0;t.callWithRetry=async function e(t,n=0){try{return await t()}catch(r){if(n>5)throw r;return await(o=2**n*100,new Promise(e=>setTimeout(e,o))),e(t,n+1)}var o}},function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.writeJsonToFile=t.readJsonFile=t.doesFileExist=void 0;const r=o(n(1));t.doesFileExist=function(e){return r.default.existsSync(e)},t.readJsonFile=function(e){const t=r.default.readFileSync(e).toString();return JSON.parse(t)},t.writeJsonToFile=function(e,t){const n=JSON.stringify(t,null,2);r.default.writeFileSync(e,n)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.saveSettings=t.getSettings=void 0;const o=n(3),r=n(2),s=n(7),i=n(8);t.getSettings=()=>[(0,r.initializePayload)(),(0,s.verifyConfigFolderExists)(),(0,i.loadSettingsFromFile)(),async(e,t)=>{const{payload:n}=e,{settings:o}=n;return t.json(o)}];t.saveSettings=()=>[(0,r.initializePayload)(),(0,i.extractSettingsFromBody)(),(0,s.verifyConfigFolderExists)(),(0,i.saveSettingsToFile)(),(e,t,n)=>{o.openSockets.forEach(e=>{e.send("settingsChanged")}),n()},async(e,t)=>t.json({success:!0})]},function(e,t,n){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,n,o){void 0===o&&(o=n),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,o){void 0===o&&(o=n),e[o]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&o(t,e,n);return r(t,e),t},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.startEpaper=void 0;const a=i(n(25));t.startEpaper=async function(){if((0,a.default)()){const e=process.env.EPAPER_DEVICE_TYPE||"waveshare7in5v2",{devices:t,init:o}=await Promise.resolve().then(()=>s(n(26)));console.log("initializing epaper");const r=(e,t)=>{e.onConsoleLog(console.log),t.on("message",async t=>{"render"===t&&await e.display()})};o(t[e],{skipWebServer:!0,url:"http://localhost:3000",websocketPort:8081},r)}}},function(e,t){e.exports=require("detect-rpi")},function(e,t){e.exports=require("epaperjs")}]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJmc1wiIiwid2VicGFjazovLy8uL3NlcnZlci9taWRkbGV3YXJlcy9nZW5lcmFsLm1pZGRsZXdhcmUudHMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL29wZW4tc29ja2V0cy50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJleHByZXNzXCIiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2xpYi9nb29nbGUuYXBpLnRzIiwid2VicGFjazovLy8uL3NlcnZlci9taWRkbGV3YXJlcy9hdXRoZW50aWNhdGlvbi5taWRkbGV3YXJlLnRzIiwid2VicGFjazovLy8uL3NlcnZlci9taWRkbGV3YXJlcy9jb25maWcubWlkZGxld2FyZS50cyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvbWlkZGxld2FyZXMvc2V0dGluZ3MubWlkZGxld2FyZS50cyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiZG90ZW52XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwib3NcIiIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvc2VydmVyLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcInBhdGhcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJleHByZXNzLXdzXCIiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy50cyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvY29udHJvbGxlcnMvYXV0aGVudGljYXRpb24uY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJnb29nbGVhcGlzXCIiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2hlbHBlcnMvZW52LmhlbHBlci50cyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvY29udHJvbGxlcnMvY2FsZW5kYXIuY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJkYXlqc1wiIiwid2VicGFjazovLy8uL3NlcnZlci9oZWxwZXJzL2Vycm9yLmhlbHBlci50cyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9maWxlLmhlbHBlci50cyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvY29udHJvbGxlcnMvc2V0dGluZ3MuY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvZXBhcGVyLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcImRldGVjdC1ycGlcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZXF1aXJlKCdlcGFwZXJqcycpXCIiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJfX2ltcG9ydERlZmF1bHQiLCJ0aGlzIiwibW9kIiwiVE9LRU5fRklMRV9QQVRIIiwiRU5WX0ZJTEVfUEFUSCIsIkNPTkZJR19GT0xERVIiLCJvc18xIiwiZGVmYXVsdCIsImhvbWVkaXIiLCJyZXF1aXJlIiwiaW5pdGlhbGl6ZVBheWxvYWQiLCJyZXEiLCJyZXMiLCJuZXh0IiwiYXBSZXF1ZXN0IiwicGF5bG9hZCIsIm9wZW5Tb2NrZXRzIiwiZ2V0RXZlbnRzQmV0d2VlbkRhdGVUaW1lcyIsImdldENhbGVuZGFycyIsImNvbnZlcnRDb2RlVG9SZWZyZXNoVG9rZW4iLCJjcmVhdGVBdXRoVXJsIiwiZ29vZ2xlYXBpc18xIiwiZW52X2hlbHBlcl8xIiwiY3JlYXRlQ2xpZW50IiwiZ29vZ2xlUmVmcmVzaFRva2VuIiwiR09PR0xFX0NMSUVOVF9JRCIsImdldEVudlZhcmlhYmxlT3JEaWUiLCJHT09HTEVfQ0xJRU5UX1NFQ1JFVCIsImNsaWVudCIsImdvb2dsZSIsImF1dGgiLCJPQXV0aDIiLCJjcmVkZW50aWFscyIsInJlZnJlc2hfdG9rZW4iLCJzZXRDcmVkZW50aWFscyIsImhhbmRsZVJlc3BvbnNlIiwicmVzcG9uc2UiLCJhbGxvd2VkQ29kZXMiLCJzdGF0dXMiLCJpbmNsdWRlcyIsImRhdGEiLCJjb25zb2xlIiwiZXJyb3IiLCJzdGF0dXNUZXh0IiwibG9nRXJyb3IiLCJlIiwib3BlcmF0aW9uIiwib3B0aW9ucyIsImFjY2Vzc190eXBlIiwic2NvcGUiLCJwcm9tcHQiLCJqb2luIiwic3RhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2VuZXJhdGVBdXRoVXJsIiwiZ2V0Q2FsZW5kYXJTZXJ2aWNlIiwiY2FsZW5kYXIiLCJ2ZXJzaW9uIiwiYXN5bmMiLCJjb2RlIiwicmVmcmVzaFRva2VuIiwidG9rZW5zIiwiZ2V0VG9rZW4iLCJwcm9wcyIsInB1c2giLCJlcnJvcl9kZXNjcmlwdGlvbiIsIm1zZyIsInNlcnZpY2UiLCJyZXN1bHQiLCJjYWxlbmRhckxpc3QiLCJsaXN0IiwiaXRlbXMiLCJtYXAiLCJyYXdDYWxlbmRhciIsImlkIiwiaXNQcmltYXJ5IiwicHJpbWFyeSIsInVuZGVmaW5lZCIsImNhbGVuZGFySWQiLCJzdGFydERhdGVUaW1lIiwiZW5kRGF0ZVRpbWUiLCJxdWVyeSIsInRpbWVNaW4iLCJ0aW1lTWF4Iiwic2luZ2xlRXZlbnRzIiwib3JkZXJCeSIsImV2ZW50cyIsImdldEV2ZW50c0J5UXVlcnkiLCJhcHByb3ZlZEV2ZW50cyIsImZpbHRlciIsImV2ZW50IiwiYXR0ZW5kZWVzIiwiY3VycmVudEF0dGVuZGVlIiwiZmluZCIsImF0dGVuZGVlIiwic2VsZiIsInJlc3BvbnNlU3RhdHVzIiwiZGlkQ3VycmVudFJlY2lwaWVudERlY2xpbmVkIiwicmF3RXZlbnQiLCJzdGFydCIsImRhdGVUaW1lIiwiZW5kIiwidGl0bGUiLCJzdW1tYXJ5IiwibG9jYXRpb24iLCJpc1ByaXZhdGUiLCJ2aXNpYmlsaXR5IiwiaXNGcmVlIiwidHJhbnNwYXJlbmN5IiwiYXV0aGVudGljYXRlIiwic3RvcmVSZWZyZXNoVG9rZW4iLCJsb2FkR29vZ2xlUmVmcmVzaFRva2VuSWZFeGlzdHMiLCJmc18xIiwiY29uc3RhbnRzXzEiLCJnZW5lcmFsX21pZGRsZXdhcmVfMSIsImFzeW5jRnMiLCJwcm9taXNlcyIsImV4aXN0c1N5bmMiLCJ0b2tlbiIsInJlYWRGaWxlIiwidG9TdHJpbmciLCJ3cml0ZUZpbGUiLCJzZW5kIiwidmVyaWZ5Q29uZmlnRm9sZGVyRXhpc3RzIiwibWtkaXJTeW5jIiwic2F2ZVNldHRpbmdzVG9GaWxlIiwiZXh0cmFjdFNldHRpbmdzRnJvbUJvZHkiLCJsb2FkU2V0dGluZ3NGcm9tRmlsZSIsImZpbGVfaGVscGVyXzEiLCJTRVRUSU5HU19GSUxFX05BTUUiLCJJTklUSUFMX1NFVFRJTkdTIiwic2hvd0xvY2F0aW9uIiwic2hvd0ZyZWVFdmVudHMiLCJtYXNrUHJpdmF0ZUV2ZW50cyIsInNldHRpbmdzIiwiZG9lc0ZpbGVFeGlzdCIsInJlYWRKc29uRmlsZSIsIndyaXRlSnNvblRvRmlsZSIsImJvZHkiLCJkb3RlbnZfMSIsInNlcnZlcl8xIiwidmVyaWZ5RW52VmFyaWFibGVPckV4aXQiLCJ2YXJpYWJsZU5hbWUiLCJwcm9jZXNzIiwiZW52IiwiZXhpdCIsImNvbmZpZyIsInBhdGgiLCJzdGFydFNlcnZlciIsInBhdGhfMSIsImV4cHJlc3NfMSIsImV4cHJlc3Nfd3NfMSIsInJvdXRlc18xIiwib3Blbl9zb2NrZXRzXzEiLCJlcGFwZXJfMSIsImFwcCIsInVzZSIsImpzb24iLCJ3cyIsIm9uIiwic3RhdGljIiwiX19kaXJuYW1lIiwic2VuZEZpbGUiLCJwb3J0IiwiUE9SVCIsInBhcnNlSW50IiwibGlzdGVuIiwibG9nIiwic3RhcnRFcGFwZXIiLCJhdXRoZW50aWNhdGlvbl9jb250cm9sbGVyXzEiLCJjYWxlbmRhcl9jb250cm9sbGVyXzEiLCJzZXR0aW5nc19jb250cm9sbGVyXzEiLCJhdXRoZW50aWNhdGlvbl9taWRkbGV3YXJlXzEiLCJyb3V0ZXIiLCJSb3V0ZXIiLCJpc0xvZ2dlZEluIiwibG9naW5Vc2VyIiwiYXV0aG9yaXplVXNlciIsImdldFNldHRpbmdzIiwicG9zdCIsInNhdmVTZXR0aW5ncyIsImdldEN1cnJlbnRDYWxlbmRhckV2ZW50cyIsImdvb2dsZV9hcGlfMSIsImNvbmZpZ19taWRkbGV3YXJlXzEiLCJ1cmwiLCJyZWRpcmVjdCIsImZvckVhY2giLCJzb2NrZXQiLCJ1cGRhdGVFbnZGaWxlIiwidmFyaWFibGUiLCJFcnJvciIsImZpbGVOYW1lIiwidmFyaWFibGVOYW1lcyIsImVudkNvbnRlbnRzIiwiaXRlbSIsIndyaXRlRmlsZVN5bmMiLCJkYXlqc18xIiwiZXJyb3JfaGVscGVyXzEiLCJzZXR0aW5nc19taWRkbGV3YXJlXzEiLCJmZXRjaENhbGVuZGFyRXZlbnRzIiwiY2FsZW5kYXJFdmVudHMiLCJjdXJyZW50VGltZSIsImVuZE9mRGF5IiwiZW5kT2YiLCJpbmZvIiwiZm9ybWF0IiwiY2FsbFdpdGhSZXRyeSIsInRvSVNPU3RyaW5nIiwiZ2V0Q3VycmVudEV2ZW50c0Zyb21DYWxlbmRhciIsImZuIiwiZGVwdGgiLCJtcyIsIlByb21pc2UiLCJzZXRUaW1lb3V0IiwicmVhZEZpbGVTeW5jIiwicGFyc2UiLCJkYXRhU3RyIiwic3VjY2VzcyIsIl9fY3JlYXRlQmluZGluZyIsImsiLCJrMiIsIl9fc2V0TW9kdWxlRGVmYXVsdCIsInYiLCJfX2ltcG9ydFN0YXIiLCJkZXRlY3RfcnBpXzEiLCJkZXZpY2VUeXBlIiwiRVBBUEVSX0RFVklDRV9UWVBFIiwiZGV2aWNlcyIsImluaXQiLCJyZXNvbHZlIiwidGhlbiIsInJlbmRlciIsInBhZ2UiLCJvbkNvbnNvbGVMb2ciLCJkaXNwbGF5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QUFRLEtBcUI3Q2xDLEVBQVEyTSxZQXBCUjlHLGlCQUNJLElBQUksRUFBSXNLLEVBQWExTixXQUFZLENBQzdCLE1BQU0yTixFQUFhbEYsUUFBUUMsSUFBSWtGLG9CQUFzQixtQkFDL0MsUUFBRUMsRUFBTyxLQUFFQyxTQUFlaEIsUUFBUWlCLFVBQVVDLEtBQUssSUFBTVAsRUFBYSxFQUFRLE1BQ2xGdkwsUUFBUStILElBQUksdUJBQ1osTUFBTWdFLEVBQVMsQ0FBQ0MsRUFBTTFFLEtBQ2xCMEUsRUFBS0MsYUFBYWpNLFFBQVErSCxLQUMxQlQsRUFBR0MsR0FBRyxVQUFXckcsTUFBT1EsSUFDUixXQUFSQSxTQUNNc0ssRUFBS0UsYUFJdkJOLEVBQUtELEVBQVFGLEdBQWEsQ0FDdEJVLGVBQWUsRUFDZm5ELElBQUssd0JBQ0xvRCxjQUFlLE1BQ2hCTCxNLGNDM0NYelEsRUFBT0QsUUFBVTJDLFFBQVEsZSxjQ0F6QjFDLEVBQU9ELFFBQVUyQyxRQUFRIiwiZmlsZSI6ImJ1bmRsZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA5KTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UT0tFTl9GSUxFX1BBVEggPSBleHBvcnRzLkVOVl9GSUxFX1BBVEggPSBleHBvcnRzLkNPTkZJR19GT0xERVIgPSB2b2lkIDA7XG5jb25zdCBvc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJvc1wiKSk7XG5leHBvcnRzLkNPTkZJR19GT0xERVIgPSBgJHtvc18xLmRlZmF1bHQuaG9tZWRpcigpfS8uYWdlbmRhLXBhcGVyYDtcbmV4cG9ydHMuRU5WX0ZJTEVfUEFUSCA9IGAke2V4cG9ydHMuQ09ORklHX0ZPTERFUn0vLmVudmA7XG5leHBvcnRzLlRPS0VOX0ZJTEVfUEFUSCA9IGAke2V4cG9ydHMuQ09ORklHX0ZPTERFUn0vLnRva2VuYDtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzXCIpOyIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pbml0aWFsaXplUGF5bG9hZCA9IHZvaWQgMDtcbmNvbnN0IGluaXRpYWxpemVQYXlsb2FkID0gKCkgPT4gKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgYXBSZXF1ZXN0ID0gcmVxO1xuICAgIGFwUmVxdWVzdC5wYXlsb2FkID0gYXBSZXF1ZXN0LnBheWxvYWQgfHwge307XG4gICAgbmV4dCgpO1xufTtcbmV4cG9ydHMuaW5pdGlhbGl6ZVBheWxvYWQgPSBpbml0aWFsaXplUGF5bG9hZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5vcGVuU29ja2V0cyA9IHZvaWQgMDtcbmV4cG9ydHMub3BlblNvY2tldHMgPSBbXTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV4cHJlc3NcIik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEV2ZW50c0JldHdlZW5EYXRlVGltZXMgPSBleHBvcnRzLmdldENhbGVuZGFycyA9IGV4cG9ydHMuY29udmVydENvZGVUb1JlZnJlc2hUb2tlbiA9IGV4cG9ydHMuY3JlYXRlQXV0aFVybCA9IHZvaWQgMDtcbmNvbnN0IGdvb2dsZWFwaXNfMSA9IHJlcXVpcmUoXCJnb29nbGVhcGlzXCIpO1xuY29uc3QgZW52X2hlbHBlcl8xID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvZW52LmhlbHBlclwiKTtcbmNvbnN0IFNJVEVfVVJMID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCc7XG5jb25zdCBBUElfVVJMID0gYCR7U0lURV9VUkx9L2FwaWA7XG5jb25zdCBMT0dJTl9DQUxMQkFDS19VUkwgPSBgJHtBUElfVVJMfS9hdXRoL2xvZ2luL2NhbGxiYWNrYDtcbmZ1bmN0aW9uIGJ1aWxkR29vZ2xlT3B0aW9ucyhzdGF0ZSkge1xuICAgIGNvbnN0IHNjb3BlcyA9IFtcbiAgICAgICAgJ2h0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvY2FsZW5kYXIucmVhZG9ubHknLFxuICAgICAgICAnaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vYXV0aC9jYWxlbmRhci5ldmVudHMucmVhZG9ubHknLFxuICAgIF07XG4gICAgY29uc3QgcHJvbXB0cyA9IFsnc2VsZWN0X2FjY291bnQnLCAnY29uc2VudCddO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGFjY2Vzc190eXBlOiAnb2ZmbGluZScsXG4gICAgICAgIHNjb3BlOiBzY29wZXMsXG4gICAgICAgIHByb21wdDogcHJvbXB0cy5qb2luKCcgJyksXG4gICAgICAgIHN0YXRlOiBKU09OLnN0cmluZ2lmeShzdGF0ZSksXG4gICAgfTtcbiAgICByZXR1cm4gb3B0aW9ucztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNsaWVudChnb29nbGVSZWZyZXNoVG9rZW4pIHtcbiAgICBjb25zdCBHT09HTEVfQ0xJRU5UX0lEID0gKDAsIGVudl9oZWxwZXJfMS5nZXRFbnZWYXJpYWJsZU9yRGllKSgnR09PR0xFX0NMSUVOVF9JRCcpO1xuICAgIGNvbnN0IEdPT0dMRV9DTElFTlRfU0VDUkVUID0gKDAsIGVudl9oZWxwZXJfMS5nZXRFbnZWYXJpYWJsZU9yRGllKSgnR09PR0xFX0NMSUVOVF9TRUNSRVQnKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgZ29vZ2xlYXBpc18xLmdvb2dsZS5hdXRoLk9BdXRoMihHT09HTEVfQ0xJRU5UX0lELCBHT09HTEVfQ0xJRU5UX1NFQ1JFVCwgTE9HSU5fQ0FMTEJBQ0tfVVJMKTtcbiAgICBpZiAoZ29vZ2xlUmVmcmVzaFRva2VuKSB7XG4gICAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0ge1xuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogZ29vZ2xlUmVmcmVzaFRva2VuLFxuICAgICAgICB9O1xuICAgICAgICBjbGllbnQuc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xpZW50O1xufVxuZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UsIGFsbG93ZWRDb2Rlcykge1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCAmJiAoIWFsbG93ZWRDb2RlcyB8fCAhYWxsb3dlZENvZGVzLmluY2x1ZGVzKHJlc3BvbnNlLnN0YXR1cykpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYGdvb2dsZSBhcGkgdW5zdWNjZXNzZnVsbDogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbn1cbmZ1bmN0aW9uIGxvZ0Vycm9yKGUsIG9wZXJhdGlvbikge1xuICAgIGNvbnNvbGUuZXJyb3IoYGVycm9yIHdoaWxlIG1ha2luZyAke29wZXJhdGlvbn0gZ29vZ2xlIGFwaSBjYWxsOlxcbmAsIGUpO1xufVxuY29uc3QgY3JlYXRlQXV0aFVybCA9ICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0gYnVpbGRHb29nbGVPcHRpb25zKCk7XG4gICAgY29uc3QgY2xpZW50ID0gY3JlYXRlQ2xpZW50KCk7XG4gICAgY29uc3QgdXJsID0gY2xpZW50LmdlbmVyYXRlQXV0aFVybChvcHRpb25zKTtcbiAgICByZXR1cm4gdXJsO1xufTtcbmV4cG9ydHMuY3JlYXRlQXV0aFVybCA9IGNyZWF0ZUF1dGhVcmw7XG5jb25zdCBjb252ZXJ0Q29kZVRvUmVmcmVzaFRva2VuID0gYXN5bmMgKGNvZGUpID0+IHtcbiAgICBsZXQgcmVmcmVzaFRva2VuO1xuICAgIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUNsaWVudCgpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgdG9rZW5zIH0gPSBhd2FpdCBjbGllbnQuZ2V0VG9rZW4oY29kZSk7XG4gICAgICAgIHJlZnJlc2hUb2tlbiA9IHRva2Vucy5yZWZyZXNoX3Rva2VuO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCB7IHJlc3BvbnNlOiB7IHN0YXR1cywgZGF0YSB9ID0ge30gfSA9IGU7XG4gICAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAgICAgYHN0YXR1czogJHtzdGF0dXMgfHwgJyd9YCxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHByb3BzLnB1c2goYGVycm9yOiAke2RhdGEuZXJyb3IgfHwgJyd9YCk7XG4gICAgICAgICAgICBwcm9wcy5wdXNoKGBkZXNjcmlwdGlvbjogJHtkYXRhLmVycm9yX2Rlc2NyaXB0aW9uIHx8ICcnfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1zZyA9IGBmYWlsZWQgdG8gY29udmVydCBjb2RlIHRvIHRva2VuIC0gJHtwcm9wcy5qb2luKCcsJyl9YDtcbiAgICAgICAgY29uc29sZS5lcnJvcihgJHttc2d9XFxuYCwgZSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiByZWZyZXNoVG9rZW47XG59O1xuZXhwb3J0cy5jb252ZXJ0Q29kZVRvUmVmcmVzaFRva2VuID0gY29udmVydENvZGVUb1JlZnJlc2hUb2tlbjtcbmZ1bmN0aW9uIGdldENhbGVuZGFyU2VydmljZShjbGllbnQpIHtcbiAgICByZXR1cm4gZ29vZ2xlYXBpc18xLmdvb2dsZS5jYWxlbmRhcih7IHZlcnNpb246ICd2MycsIGF1dGg6IGNsaWVudCB9KTtcbn1cbmZ1bmN0aW9uIHJhd0NhbGVuZGFyc1RvQ2FsZW5kYXJzKHJhd0NhbGVuZGFycykge1xuICAgIHJldHVybiByYXdDYWxlbmRhcnMubWFwKChyYXdDYWxlbmRhcikgPT4gKHtcbiAgICAgICAgaWQ6IHJhd0NhbGVuZGFyLmlkLFxuICAgICAgICBpc1ByaW1hcnk6ICEhcmF3Q2FsZW5kYXIucHJpbWFyeSxcbiAgICB9KSk7XG59XG5jb25zdCBnZXRDYWxlbmRhcnMgPSBhc3luYyAoZ29vZ2xlUmVmcmVzaFRva2VuKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gY3JlYXRlQ2xpZW50KGdvb2dsZVJlZnJlc2hUb2tlbik7XG4gICAgY29uc3Qgc2VydmljZSA9IGdldENhbGVuZGFyU2VydmljZShjbGllbnQpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VydmljZS5jYWxlbmRhckxpc3QubGlzdCgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0Lml0ZW1zID8gcmF3Q2FsZW5kYXJzVG9DYWxlbmRhcnMocmVzdWx0Lml0ZW1zKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSwgJ2dldCBjYWxlbmRhcnMnKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG59O1xuZXhwb3J0cy5nZXRDYWxlbmRhcnMgPSBnZXRDYWxlbmRhcnM7XG5hc3luYyBmdW5jdGlvbiBnZXRFdmVudHNCeVF1ZXJ5KGNsaWVudCwgcXVlcnkpIHtcbiAgICBjb25zdCBzZXJ2aWNlID0gZ2V0Q2FsZW5kYXJTZXJ2aWNlKGNsaWVudCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZXJ2aWNlLmV2ZW50cy5saXN0KHF1ZXJ5KTtcbiAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpO1xufVxuZnVuY3Rpb24gcmF3RXZlbnRzVG9DYWxlbmRhckV2ZW50cyhyYXdFdmVudHMpIHtcbiAgICByZXR1cm4gcmF3RXZlbnRzLm1hcCgocmF3RXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlVGltZSA9IChyYXdFdmVudC5zdGFydCB8fCB7fSkuZGF0ZVRpbWU7XG4gICAgICAgIGNvbnN0IGVuZERhdGVUaW1lID0gKHJhd0V2ZW50LmVuZCB8fCB7fSkuZGF0ZVRpbWU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogcmF3RXZlbnQuaWQsXG4gICAgICAgICAgICB0aXRsZTogcmF3RXZlbnQuc3VtbWFyeSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydERhdGVUaW1lLFxuICAgICAgICAgICAgZW5kOiBlbmREYXRlVGltZSxcbiAgICAgICAgICAgIGxvY2F0aW9uOiByYXdFdmVudC5sb2NhdGlvbixcbiAgICAgICAgICAgIGlzUHJpdmF0ZTogcmF3RXZlbnQudmlzaWJpbGl0eSA9PT0gJ3ByaXZhdGUnLFxuICAgICAgICAgICAgaXNGcmVlOiByYXdFdmVudC50cmFuc3BhcmVuY3kgPT09ICd0cmFuc3BhcmVudCcsXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5mdW5jdGlvbiBkaWRDdXJyZW50UmVjaXBpZW50RGVjbGluZWQoYXR0ZW5kZWVzKSB7XG4gICAgaWYgKCFhdHRlbmRlZXMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50QXR0ZW5kZWUgPSBhdHRlbmRlZXMuZmluZCgoYXR0ZW5kZWUpID0+IGF0dGVuZGVlLnNlbGYpO1xuICAgIGlmIChjdXJyZW50QXR0ZW5kZWUgJiYgY3VycmVudEF0dGVuZGVlLnJlc3BvbnNlU3RhdHVzID09PSAnZGVjbGluZWQnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZXRPbmx5QXBwcm92ZWRFdmVudHMoZXZlbnRzKSB7XG4gICAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoKGV2ZW50KSA9PiAhZGlkQ3VycmVudFJlY2lwaWVudERlY2xpbmVkKGV2ZW50LmF0dGVuZGVlcykpO1xufVxuY29uc3QgZ2V0RXZlbnRzQmV0d2VlbkRhdGVUaW1lcyA9IGFzeW5jIChnb29nbGVSZWZyZXNoVG9rZW4sIGNhbGVuZGFySWQsIHN0YXJ0RGF0ZVRpbWUsIGVuZERhdGVUaW1lKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gY3JlYXRlQ2xpZW50KGdvb2dsZVJlZnJlc2hUb2tlbik7XG4gICAgY29uc3QgcXVlcnkgPSB7XG4gICAgICAgIGNhbGVuZGFySWQsXG4gICAgICAgIHRpbWVNaW46IHN0YXJ0RGF0ZVRpbWUsXG4gICAgICAgIHRpbWVNYXg6IGVuZERhdGVUaW1lLFxuICAgICAgICBzaW5nbGVFdmVudHM6IHRydWUsXG4gICAgICAgIG9yZGVyQnk6ICdzdGFydFRpbWUnLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0RXZlbnRzQnlRdWVyeShjbGllbnQsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5pdGVtcykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcHByb3ZlZEV2ZW50cyA9IGdldE9ubHlBcHByb3ZlZEV2ZW50cyhyZXN1bHQuaXRlbXMpO1xuICAgICAgICByZXR1cm4gcmF3RXZlbnRzVG9DYWxlbmRhckV2ZW50cyhhcHByb3ZlZEV2ZW50cyk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUsICdldmVudHMgcXVlcnknKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG59O1xuZXhwb3J0cy5nZXRFdmVudHNCZXR3ZWVuRGF0ZVRpbWVzID0gZ2V0RXZlbnRzQmV0d2VlbkRhdGVUaW1lcztcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hdXRoZW50aWNhdGUgPSBleHBvcnRzLnN0b3JlUmVmcmVzaFRva2VuID0gZXhwb3J0cy5sb2FkR29vZ2xlUmVmcmVzaFRva2VuSWZFeGlzdHMgPSB2b2lkIDA7XG5jb25zdCBmc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJmc1wiKSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBnZW5lcmFsX21pZGRsZXdhcmVfMSA9IHJlcXVpcmUoXCIuL2dlbmVyYWwubWlkZGxld2FyZVwiKTtcbmNvbnN0IGFzeW5jRnMgPSBmc18xLmRlZmF1bHQucHJvbWlzZXM7XG5jb25zdCBsb2FkR29vZ2xlUmVmcmVzaFRva2VuSWZFeGlzdHMgPSAoKSA9PiBhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICBjb25zdCB7IHBheWxvYWQgfSA9IHJlcTtcbiAgICBpZiAoZnNfMS5kZWZhdWx0LmV4aXN0c1N5bmMoY29uc3RhbnRzXzEuVE9LRU