diff --git a/internal/web/profile.go b/internal/web/profile.go index 3696107e4..bc8f8d4c5 100644 --- a/internal/web/profile.go +++ b/internal/web/profile.go @@ -103,7 +103,7 @@ func (m *Module) profileTemplateHandler(c *gin.Context) { "statuses": statuses, "stylesheets": []string{ "/assets/Fork-Awesome/css/fork-awesome.min.css", - "/assets/bundled/profile.css", + "/assets/dist/profile.css", }, }) } diff --git a/internal/web/thread.go b/internal/web/thread.go index 2b141f19c..bded227cc 100644 --- a/internal/web/thread.go +++ b/internal/web/thread.go @@ -87,7 +87,7 @@ func (m *Module) threadTemplateHandler(c *gin.Context) { "context": context, "stylesheets": []string{ "/assets/Fork-Awesome/css/fork-awesome.min.css", - "/assets/bundled/status.css", + "/assets/dist/status.css", }, }) } diff --git a/web/assets/bundled/_colors.css b/web/assets/bundled/_colors.css deleted file mode 100644 index 61933b5b0..000000000 --- a/web/assets/bundled/_colors.css +++ /dev/null @@ -1,11 +0,0 @@ - -:root { - --bg: #525c66; - --fg: #fafaff; - --fg_dark: #b0b0b5; - --bg_accent: hsl(210, 10.8695652174%, 31.0784313725%); - --acc1: #de8957; - --acc2: #c76d33; - --blue: #5897df -} - diff --git a/web/assets/bundled/admin-panel.js b/web/assets/bundled/admin-panel.js deleted file mode 100644 index 5308e4240..000000000 --- a/web/assets/bundled/admin-panel.js +++ /dev/null @@ -1,1115 +0,0 @@ -require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - -var Promise = require("bluebird"); - -var React = require("react"); - -var ReactDom = require("react-dom"); - -var oauthLib = require("./oauth.js"); - -var Auth = require("./auth"); - -var Settings = require("./settings"); - -var Blocks = require("./blocks"); - -require("./style.css"); - -function App() { - var _React$useState = React.useState(), - _React$useState2 = _slicedToArray(_React$useState, 2), - oauth = _React$useState2[0], - setOauth = _React$useState2[1]; - - var _React$useState3 = React.useState(false), - _React$useState4 = _slicedToArray(_React$useState3, 2), - hasAuth = _React$useState4[0], - setAuth = _React$useState4[1]; - - var _React$useState5 = React.useState(localStorage.getItem("oauth")), - _React$useState6 = _slicedToArray(_React$useState5, 2), - oauthState = _React$useState6[0], - setOauthState = _React$useState6[1]; - - React.useEffect(function () { - var state = localStorage.getItem("oauth"); - - if (state != undefined) { - state = JSON.parse(state); - var restoredOauth = oauthLib(state.config, state); - Promise["try"](function () { - return restoredOauth.callback(); - }).then(function () { - setAuth(true); - }); - setOauth(restoredOauth); - } - }, []); - - if (!hasAuth && oauth && oauth.isAuthorized()) { - setAuth(true); - } - - if (oauth && oauth.isAuthorized()) { - return /*#__PURE__*/React.createElement(AdminPanel, { - oauth: oauth - }); - } else if (oauthState != undefined) { - return "processing oauth..."; - } else { - return /*#__PURE__*/React.createElement(Auth, { - setOauth: setOauth - }); - } -} - -function AdminPanel(_ref) { - var oauth = _ref.oauth; - - /* - Features: (issue #78) - - [ ] Instance information updating - GET /api/v1/instance PATCH /api/v1/instance - - [ ] Domain block creation, viewing, and deletion - GET /api/v1/admin/domain_blocks - POST /api/v1/admin/domain_blocks - GET /api/v1/admin/domain_blocks/DOMAIN_BLOCK_ID, DELETE /api/v1/admin/domain_blocks/DOMAIN_BLOCK_ID - - [ ] Blocklist import/export - GET /api/v1/admin/domain_blocks?export=true - POST json file as form field domains to /api/v1/admin/domain_blocks - */ - return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Logout, { - oauth: oauth - }), /*#__PURE__*/React.createElement(Settings, { - oauth: oauth - }), /*#__PURE__*/React.createElement(Blocks, { - oauth: oauth - })); -} - -function Logout(_ref2) { - var oauth = _ref2.oauth; - return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("button", { - onClick: oauth.logout - }, "Logout")); -} - -ReactDom.render( /*#__PURE__*/React.createElement(App, null), document.getElementById("root")); - -},{"./auth":9,"./blocks":10,"./oauth.js":12,"./settings":13,"./style.css":14,"bluebird":15,"react":23,"react-dom":20}],14:[function(require,module,exports){ -require("../../node_modules/icssify/global-css-loader.js"); module.exports = {}; -},{"../../node_modules/icssify/global-css-loader.js":5}],13:[function(require,module,exports){ -"use strict"; - -function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } - -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } - -function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - -var Promise = require("bluebird"); - -var React = require("react"); - -module.exports = function Settings(_ref) { - var oauth = _ref.oauth; - - var _React$useState = React.useState({}), - _React$useState2 = _slicedToArray(_React$useState, 2), - info = _React$useState2[0], - setInfo = _React$useState2[1]; - - var _React$useState3 = React.useState(""), - _React$useState4 = _slicedToArray(_React$useState3, 2), - errorMsg = _React$useState4[0], - setError = _React$useState4[1]; - - var _React$useState5 = React.useState("Fetching instance info"), - _React$useState6 = _slicedToArray(_React$useState5, 2), - statusMsg = _React$useState6[0], - setStatus = _React$useState6[1]; - - React.useEffect(function () { - Promise["try"](function () { - return oauth.apiRequest("/api/v1/instance", "GET"); - }).then(function (json) { - setInfo(json); - })["catch"](function (e) { - setError(e.message); - setStatus(""); - }); - }, []); - - function submit() { - setStatus("PATCHing"); - setError(""); - return Promise["try"](function () { - var formDataInfo = new FormData(); - Object.entries(info).forEach(function (_ref2) { - var _ref3 = _slicedToArray(_ref2, 2), - key = _ref3[0], - val = _ref3[1]; - - if (key == "contact_account") { - key = "contact_username"; - val = val.username; - } - - if (key == "email") { - key = "contact_email"; - } - - if (_typeof(val) != "object") { - formDataInfo.append(key, val); - } - }); - return oauth.apiRequest("/api/v1/instance", "PATCH", formDataInfo, "form"); - }).then(function (json) { - setStatus("Config saved"); - console.log(json); - })["catch"](function (e) { - setError(e.message); - setStatus(""); - }); - } - - return /*#__PURE__*/React.createElement("section", { - className: "info login" - }, /*#__PURE__*/React.createElement("h1", null, "Instance Information ", /*#__PURE__*/React.createElement("button", { - onClick: submit - }, "Save")), /*#__PURE__*/React.createElement("div", { - className: "error accent" - }, errorMsg), /*#__PURE__*/React.createElement("div", null, statusMsg), /*#__PURE__*/React.createElement("form", { - onSubmit: function onSubmit(e) { - return e.preventDefault(); - } - }, editableObject(info))); -}; - -function editableObject(obj) { - var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; - var readOnlyKeys = ["uri", "version", "urls_streaming_api", "stats"]; - var hiddenKeys = ["contact_account_", "urls"]; - var explicitShownKeys = ["contact_account_username"]; - var implementedKeys = "title, contact_account_username, email, short_description, description, terms, avatar, header".split(", "); - var listing = Object.entries(obj).map(function (_ref4) { - var _ref5 = _slicedToArray(_ref4, 2), - key = _ref5[0], - val = _ref5[1]; - - var fullkey = [].concat(_toConsumableArray(path), [key]).join("_"); - - if (hiddenKeys.includes(fullkey) || hiddenKeys.includes(path.join("_") + "_") // also match just parent path - ) { - if (!explicitShownKeys.includes(fullkey)) { - return null; - } - } - - if (Array.isArray(val)) {// FIXME: handle this - } else if (_typeof(val) == "object") { - return /*#__PURE__*/React.createElement(React.Fragment, { - key: fullkey - }, editableObject(val, [].concat(_toConsumableArray(path), [key]))); - } - - var isImplemented = ""; - - if (!implementedKeys.includes(fullkey)) { - isImplemented = " notImplemented"; - } - - var isReadOnly = readOnlyKeys.includes(fullkey) || readOnlyKeys.includes(path.join("_")) || isImplemented != ""; - var label = key.replace(/_/g, " "); - - if (path.length > 0) { - label = "\xA0".repeat(4 * path.length) + label; - } - - var inputProps; - var changeFunc; - - if (val === true || val === false) { - inputProps = { - type: "checkbox", - defaultChecked: val, - disabled: isReadOnly - }; - - changeFunc = function changeFunc(e) { - return e.target.checked; - }; - } else if (val.length != 0 && !isNaN(val)) { - inputProps = { - type: "number", - defaultValue: val, - readOnly: isReadOnly - }; - - changeFunc = function changeFunc(e) { - return e.target.value; - }; - } else { - inputProps = { - type: "text", - defaultValue: val, - readOnly: isReadOnly - }; - - changeFunc = function changeFunc(e) { - return e.target.value; - }; - } - - function setRef(element) { - if (element != null) { - element.addEventListener("change", function (e) { - obj[key] = changeFunc(e); - }); - } - } - - return /*#__PURE__*/React.createElement(React.Fragment, { - key: fullkey - }, /*#__PURE__*/React.createElement("label", { - htmlFor: key, - className: "capitalize" - }, label), /*#__PURE__*/React.createElement("div", { - className: isImplemented - }, /*#__PURE__*/React.createElement("input", _extends({ - className: isImplemented, - ref: setRef - }, inputProps)))); - }); - return /*#__PURE__*/React.createElement(React.Fragment, null, path != "" && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("b", null, path, ":"), " ", /*#__PURE__*/React.createElement("span", { - id: "filler" - })), listing); -} - -},{"bluebird":15,"react":23}],10:[function(require,module,exports){ -"use strict"; - -function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - -var Promise = require("bluebird"); - -var React = require("react"); - -var fileDownload = require("js-file-download"); - -function sortBlocks(blocks) { - return blocks.sort(function (a, b) { - // alphabetical sort - return a.domain.localeCompare(b.domain); - }); -} - -function deduplicateBlocks(blocks) { - var a = new Map(); - blocks.forEach(function (block) { - a.set(block.id, block); - }); - return Array.from(a.values()); -} - -module.exports = function Blocks(_ref) { - var oauth = _ref.oauth; - - var _React$useState = React.useState([]), - _React$useState2 = _slicedToArray(_React$useState, 2), - blocks = _React$useState2[0], - setBlocks = _React$useState2[1]; - - var _React$useState3 = React.useState("Fetching blocks"), - _React$useState4 = _slicedToArray(_React$useState3, 2), - info = _React$useState4[0], - setInfo = _React$useState4[1]; - - var _React$useState5 = React.useState(""), - _React$useState6 = _slicedToArray(_React$useState5, 2), - errorMsg = _React$useState6[0], - setError = _React$useState6[1]; - - var _React$useState7 = React.useState(new Set()), - _React$useState8 = _slicedToArray(_React$useState7, 2), - checked = _React$useState8[0], - setChecked = _React$useState8[1]; - - React.useEffect(function () { - Promise["try"](function () { - return oauth.apiRequest("/api/v1/admin/domain_blocks", undefined, undefined, "GET"); - }).then(function (json) { - setInfo(""); - setError(""); - setBlocks(sortBlocks(json)); - })["catch"](function (e) { - setError(e.message); - setInfo(""); - }); - }, []); - var blockList = blocks.map(function (block) { - function update(e) { - var newChecked = new Set(checked.values()); - - if (e.target.checked) { - newChecked.add(block.id); - } else { - newChecked["delete"](block.id); - } - - setChecked(newChecked); - } - - return /*#__PURE__*/React.createElement(React.Fragment, { - key: block.id - }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("input", { - type: "checkbox", - onChange: update, - checked: checked.has(block.id) - })), /*#__PURE__*/React.createElement("div", null, block.domain), /*#__PURE__*/React.createElement("div", null, new Date(block.created_at).toLocaleString())); - }); - - function clearChecked() { - setChecked(new Set()); - } - - function undoChecked() { - var amount = checked.size; - - if (confirm("Are you sure you want to remove ".concat(amount, " block(s)?"))) { - setInfo(""); - Promise.map(Array.from(checked.values()), function (block) { - console.log("deleting", block); - return oauth.apiRequest("/api/v1/admin/domain_blocks/".concat(block), "DELETE"); - }).then(function (res) { - console.log(res); - setInfo("Deleted ".concat(amount, " blocks: ").concat(res.map(function (a) { - return a.domain; - }).join(", "))); - })["catch"](function (e) { - setError(e); - }); - var newBlocks = blocks.filter(function (block) { - if (checked.size > 0 && checked.has(block.id)) { - checked["delete"](block.id); - return false; - } else { - return true; - } - }); - setBlocks(newBlocks); - clearChecked(); - } - } - - return /*#__PURE__*/React.createElement("section", { - className: "blocks" - }, /*#__PURE__*/React.createElement("h1", null, "Blocks"), /*#__PURE__*/React.createElement("div", { - className: "error accent" - }, errorMsg), /*#__PURE__*/React.createElement("div", null, info), /*#__PURE__*/React.createElement(AddBlock, { - oauth: oauth, - blocks: blocks, - setBlocks: setBlocks - }), /*#__PURE__*/React.createElement("h3", null, "Blocks:"), /*#__PURE__*/React.createElement("div", { - style: { - display: "grid", - gridTemplateColumns: "1fr auto" - } - }, /*#__PURE__*/React.createElement("span", { - onClick: clearChecked, - className: "accent", - style: { - alignSelf: "end" - } - }, "uncheck all"), /*#__PURE__*/React.createElement("button", { - onClick: undoChecked - }, "Unblock selected")), /*#__PURE__*/React.createElement("div", { - className: "blocklist overflow" - }, blockList), /*#__PURE__*/React.createElement(BulkBlocking, { - oauth: oauth, - blocks: blocks, - setBlocks: setBlocks - })); -}; - -function BulkBlocking(_ref2) { - var oauth = _ref2.oauth, - blocks = _ref2.blocks, - setBlocks = _ref2.setBlocks; - - var _React$useState9 = React.useState(""), - _React$useState10 = _slicedToArray(_React$useState9, 2), - bulk = _React$useState10[0], - setBulk = _React$useState10[1]; - - var _React$useState11 = React.useState(new Map()), - _React$useState12 = _slicedToArray(_React$useState11, 2), - blockMap = _React$useState12[0], - setBlockMap = _React$useState12[1]; - - var _React$useState13 = React.useState(), - _React$useState14 = _slicedToArray(_React$useState13, 2), - output = _React$useState14[0], - setOutput = _React$useState14[1]; - - React.useEffect(function () { - var newBlockMap = new Map(); - blocks.forEach(function (block) { - newBlockMap.set(block.domain, block); - }); - setBlockMap(newBlockMap); - }, [blocks]); - var fileRef = React.useRef(); - - function error(e) { - setOutput( /*#__PURE__*/React.createElement("div", { - className: "error accent" - }, e)); - throw e; - } - - function fileUpload() { - var reader = new FileReader(); - reader.addEventListener("load", function (e) { - try { - // TODO: use validatem? - var json = JSON.parse(e.target.result); - json.forEach(function (block) { - console.log("block:", block); - }); - } catch (e) { - error(e.message); - } - }); - reader.readAsText(fileRef.current.files[0]); - } - - React.useEffect(function () { - if (fileRef && fileRef.current) { - fileRef.current.addEventListener("change", fileUpload); - } - - return function cleanup() { - fileRef.current.removeEventListener("change", fileUpload); - }; - }); - - function textImport() { - Promise["try"](function () { - if (bulk[0] == "[") { - // assume it's json - return JSON.parse(bulk); - } else { - return bulk.split("\n").map(function (val) { - return { - domain: val.trim() - }; - }); - } - }).then(function (domains) { - console.log(domains); - var before = domains.length; - setOutput("Importing ".concat(before, " domain(s)")); - domains = domains.filter(function (_ref3) { - var domain = _ref3.domain; - return domain != "" && !blockMap.has(domain); - }); - setOutput( /*#__PURE__*/React.createElement("span", null, output, /*#__PURE__*/React.createElement("br", null), "Deduplicated ".concat(before - domains.length, "/").concat(before, " with existing blocks, adding ").concat(domains.length, " block(s)"))); - - if (domains.length > 0) { - var data = new FormData(); - data.append("domains", new Blob([JSON.stringify(domains)], { - type: "application/json" - }), "import.json"); - return oauth.apiRequest("/api/v1/admin/domain_blocks?import=true", "POST", data, "form"); - } - }).then(function (json) { - console.log("bulk import result:", json); - setBlocks(sortBlocks(deduplicateBlocks([].concat(_toConsumableArray(json), _toConsumableArray(blocks))))); - })["catch"](function (e) { - error(e.message); - }); - } - - function textExport() { - setBulk(blocks.reduce(function (str, val) { - if (_typeof(str) == "object") { - return str.domain; - } else { - return str + "\n" + val.domain; - } - })); - } - - function jsonExport() { - Promise["try"](function () { - return oauth.apiRequest("/api/v1/admin/domain_blocks?export=true", "GET"); - }).then(function (json) { - fileDownload(JSON.stringify(json), "block-export.json"); - })["catch"](function (e) { - error(e); - }); - } - - function textAreaUpdate(e) { - setBulk(e.target.value); - } - - return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h3", null, "Bulk import/export"), /*#__PURE__*/React.createElement("label", { - htmlFor: "bulk" - }, "Domains, one per line:"), /*#__PURE__*/React.createElement("textarea", { - value: bulk, - rows: 20, - onChange: textAreaUpdate - }), /*#__PURE__*/React.createElement("div", { - className: "controls" - }, /*#__PURE__*/React.createElement("button", { - onClick: textImport - }, "Import All From Field"), /*#__PURE__*/React.createElement("button", { - onClick: textExport - }, "Export To Field"), /*#__PURE__*/React.createElement("label", { - className: "button", - htmlFor: "upload" - }, "Upload .json"), /*#__PURE__*/React.createElement("button", { - onClick: jsonExport - }, "Download .json")), output, /*#__PURE__*/React.createElement("input", { - type: "file", - id: "upload", - className: "hidden", - ref: fileRef - })); -} - -function AddBlock(_ref4) { - var oauth = _ref4.oauth, - blocks = _ref4.blocks, - setBlocks = _ref4.setBlocks; - - var _React$useState15 = React.useState(""), - _React$useState16 = _slicedToArray(_React$useState15, 2), - domain = _React$useState16[0], - setDomain = _React$useState16[1]; - - var _React$useState17 = React.useState("suspend"), - _React$useState18 = _slicedToArray(_React$useState17, 2), - type = _React$useState18[0], - setType = _React$useState18[1]; - - var _React$useState19 = React.useState(false), - _React$useState20 = _slicedToArray(_React$useState19, 2), - obfuscated = _React$useState20[0], - setObfuscated = _React$useState20[1]; - - var _React$useState21 = React.useState(""), - _React$useState22 = _slicedToArray(_React$useState21, 2), - privateDescription = _React$useState22[0], - setPrivateDescription = _React$useState22[1]; - - var _React$useState23 = React.useState(""), - _React$useState24 = _slicedToArray(_React$useState23, 2), - publicDescription = _React$useState24[0], - setPublicDescription = _React$useState24[1]; - - function addBlock() { - console.log("".concat(type, "ing"), domain); - Promise["try"](function () { - return oauth.apiRequest("/api/v1/admin/domain_blocks", "POST", { - domain: domain, - obfuscate: obfuscated, - private_comment: privateDescription, - public_comment: publicDescription - }, "json"); - }).then(function (json) { - setDomain(""); - setPrivateDescription(""); - setPublicDescription(""); - setBlocks([json].concat(_toConsumableArray(blocks))); - }); - } - - function onDomainChange(e) { - setDomain(e.target.value); - } - - function onTypeChange(e) { - setType(e.target.value); - } - - function onKeyDown(e) { - if (e.key == "Enter") { - addBlock(); - } - } - - return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h3", null, "Add Block:"), /*#__PURE__*/React.createElement("div", { - className: "addblock" - }, /*#__PURE__*/React.createElement("input", { - id: "domain", - placeholder: "instance", - onChange: onDomainChange, - value: domain, - onKeyDown: onKeyDown - }), /*#__PURE__*/React.createElement("select", { - value: type, - onChange: onTypeChange - }, /*#__PURE__*/React.createElement("option", { - id: "suspend" - }, "Suspend"), /*#__PURE__*/React.createElement("option", { - id: "silence" - }, "Silence")), /*#__PURE__*/React.createElement("button", { - onClick: addBlock - }, "Add"), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", { - htmlFor: "private" - }, "Private description:"), /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("textarea", { - id: "private", - value: privateDescription, - onChange: function onChange(e) { - return setPrivateDescription(e.target.value); - } - })), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", { - htmlFor: "public" - }, "Public description:"), /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("textarea", { - id: "public", - value: publicDescription, - onChange: function onChange(e) { - return setPublicDescription(e.target.value); - } - })), /*#__PURE__*/React.createElement("div", { - className: "single" - }, /*#__PURE__*/React.createElement("label", { - htmlFor: "obfuscate" - }, "Obfuscate:"), /*#__PURE__*/React.createElement("input", { - id: "obfuscate", - type: "checkbox", - value: obfuscated, - onChange: function onChange(e) { - return setObfuscated(e.target.checked); - } - })))); -} // function Blocklist() { -// return ( -//
-//

Blocklists

-//
-// ); -// } - -},{"bluebird":15,"js-file-download":16,"react":23}],16:[function(require,module,exports){ -module.exports = function(data, filename, mime, bom) { - var blobData = (typeof bom !== 'undefined') ? [bom, data] : [data] - var blob = new Blob(blobData, {type: mime || 'application/octet-stream'}); - if (typeof window.navigator.msSaveBlob !== 'undefined') { - // IE workaround for "HTML7007: One or more blob URLs were - // revoked by closing the blob for which they were created. - // These URLs will no longer resolve as the data backing - // the URL has been freed." - window.navigator.msSaveBlob(blob, filename); - } - else { - var blobURL = (window.URL && window.URL.createObjectURL) ? window.URL.createObjectURL(blob) : window.webkitURL.createObjectURL(blob); - var tempLink = document.createElement('a'); - tempLink.style.display = 'none'; - tempLink.href = blobURL; - tempLink.setAttribute('download', filename); - - // Safari thinks _blank anchor are pop ups. We only want to set _blank - // target if the browser does not support the HTML5 download attribute. - // This allows you to download files in desktop safari if pop up blocking - // is enabled. - if (typeof tempLink.download === 'undefined') { - tempLink.setAttribute('target', '_blank'); - } - - document.body.appendChild(tempLink); - tempLink.click(); - - // Fixes "webkit blob resource error 1" - setTimeout(function() { - document.body.removeChild(tempLink); - window.URL.revokeObjectURL(blobURL); - }, 200) - } -} - -},{}],9:[function(require,module,exports){ -"use strict"; - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - -var Promise = require("bluebird"); - -var React = require("react"); - -var oauthLib = require("./oauth"); - -module.exports = function Auth(_ref) { - var setOauth = _ref.setOauth; - - var _React$useState = React.useState(""), - _React$useState2 = _slicedToArray(_React$useState, 2), - instance = _React$useState2[0], - setInstance = _React$useState2[1]; - - React.useEffect(function () { - var isStillMounted = true; // check if current domain runs an instance - - var thisUrl = new URL(window.location.origin); - thisUrl.pathname = "/api/v1/instance"; - fetch(thisUrl.href).then(function (res) { - return res.json(); - }).then(function (json) { - if (json && json.uri) { - if (isStillMounted) { - setInstance(json.uri); - } - } - })["catch"](function (e) { - console.error("caught", e); // no instance here - }); - return function () { - // cleanup function - isStillMounted = false; - }; - }, []); - - function doAuth() { - var oauth = oauthLib({ - instance: instance, - client_name: "GoToSocial Admin Panel", - scope: ["admin"], - website: window.location.href - }); - setOauth(oauth); - return Promise["try"](function () { - return oauth.register(); - }).then(function () { - return oauth.authorize(); - }); - } - - function updateInstance(e) { - if (e.key == "Enter") { - doAuth(); - } else { - setInstance(e.target.value); - } - } - - return /*#__PURE__*/React.createElement("section", { - className: "login" - }, /*#__PURE__*/React.createElement("h1", null, "OAUTH Login:"), /*#__PURE__*/React.createElement("form", { - onSubmit: function onSubmit(e) { - return e.preventDefault(); - } - }, /*#__PURE__*/React.createElement("label", { - htmlFor: "instance" - }, "Instance: "), /*#__PURE__*/React.createElement("input", { - value: instance, - onChange: updateInstance, - id: "instance" - }), /*#__PURE__*/React.createElement("button", { - onClick: doAuth - }, "Authenticate"))); -}; - -},{"./oauth":12,"bluebird":15,"react":23}],12:[function(require,module,exports){ -"use strict"; - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - -var Promise = require("bluebird"); - -function getCurrentUrl() { - return window.location.origin + window.location.pathname; // strips ?query=string and #hash -} - -module.exports = function oauthClient(config, initState) { - /* config: - instance: instance domain (https://testingtesting123.xyz) - client_name: "GoToSocial Admin Panel" - scope: [] - website: - */ - var state = initState; - - if (initState == undefined) { - state = localStorage.getItem("oauth"); - - if (state == undefined) { - state = { - config: config - }; - storeState(); - } else { - state = JSON.parse(state); - } - } - - function storeState() { - localStorage.setItem("oauth", JSON.stringify(state)); - } - /* register app - /api/v1/apps - */ - - - function register() { - if (state.client_id != undefined) { - return true; // we already have a registration - } - - var url = new URL(config.instance); - url.pathname = "/api/v1/apps"; - return fetch(url.href, { - method: "POST", - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - client_name: config.client_name, - redirect_uris: getCurrentUrl(), - scopes: config.scope.join(" "), - website: getCurrentUrl() - }) - }).then(function (res) { - if (res.status != 200) { - throw res; - } - - return res.json(); - }).then(function (json) { - state.client_id = json.client_id; - state.client_secret = json.client_secret; - storeState(); - }); - } - /* authorize: - /oauth/authorize - ?client_id=CLIENT_ID - &redirect_uri=window.location.href - &response_type=code - &scope=admin - */ - - - function authorize() { - var url = new URL(config.instance); - url.pathname = "/oauth/authorize"; - url.searchParams.set("client_id", state.client_id); - url.searchParams.set("redirect_uri", getCurrentUrl()); - url.searchParams.set("response_type", "code"); - url.searchParams.set("scope", config.scope.join(" ")); - window.location.assign(url.href); - } - - function callback() { - if (state.access_token != undefined) { - return; // we're already done :) - } - - var params = new URL(window.location).searchParams; - var token = params.get("code"); - - if (token != null) { - console.log("got token callback:", token); - } - - return authorizeToken(token)["catch"](function (e) { - console.log("Error processing oauth callback:", e); - logout(); // just to be sure - }); - } - - function authorizeToken(token) { - var url = new URL(config.instance); - url.pathname = "/oauth/token"; - return fetch(url.href, { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - client_id: state.client_id, - client_secret: state.client_secret, - redirect_uri: getCurrentUrl(), - grant_type: "authorization_code", - code: token - }) - }).then(function (res) { - if (res.status != 200) { - throw res; - } - - return res.json(); - }).then(function (json) { - state.access_token = json.access_token; - storeState(); - window.location = getCurrentUrl(); // clear ?token= - }); - } - - function isAuthorized() { - return state.access_token != undefined; - } - - function apiRequest(path, method, data) { - var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "json"; - - if (!isAuthorized()) { - throw new Error("Not Authenticated"); - } - - var url = new URL(config.instance); - - var _path$split = path.split("?"), - _path$split2 = _slicedToArray(_path$split, 2), - p = _path$split2[0], - s = _path$split2[1]; - - url.pathname = p; - url.search = s; - var headers = { - "Authorization": "Bearer ".concat(state.access_token) - }; - var body = data; - - if (type == "json" && body != undefined) { - headers["Content-Type"] = "application/json"; - body = JSON.stringify(data); - } - - return fetch(url.href, { - method: method, - headers: headers, - body: body - }).then(function (res) { - return Promise.all([res.json(), res]); - }).then(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - json = _ref2[0], - res = _ref2[1]; - - if (res.status != 200) { - if (json.error) { - throw new Error(json.error); - } else { - throw new Error("".concat(res.status, ": ").concat(res.statusText)); - } - } else { - return json; - } - }); - } - - function logout() { - var url = new URL(config.instance); - url.pathname = "/oauth/revoke"; - return fetch(url.href, { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - client_id: state.client_id, - client_secret: state.client_secret, - token: state.access_token - }) - }).then(function (res) { - if (res.status != 200) { - // GoToSocial doesn't actually implement this route yet, - // so error is to be expected - return; - } - - return res.json(); - })["catch"](function () {// see above - }).then(function () { - localStorage.removeItem("oauth"); - window.location = getCurrentUrl(); - }); - } - - return { - register: register, - authorize: authorize, - callback: callback, - isAuthorized: isAuthorized, - apiRequest: apiRequest, - logout: logout - }; -}; - -},{"bluebird":15}]},{},[11]) -//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9mYWN0b3ItYnVuZGxlL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJwYW5lbHMvYWRtaW4vaW5kZXguanMiLCJwYW5lbHMvYWRtaW4vc3R5bGUuY3NzIiwicGFuZWxzL2FkbWluL3NldHRpbmdzLmpzIiwicGFuZWxzL2FkbWluL2Jsb2Nrcy5qcyIsInBhbmVscy9ub2RlX21vZHVsZXMvanMtZmlsZS1kb3dubG9hZC9maWxlLWRvd25sb2FkLmpzIiwicGFuZWxzL2FkbWluL2F1dGguanMiLCJwYW5lbHMvYWRtaW4vb2F1dGguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBRCxDQUF2Qjs7QUFDQSxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBRCxDQUFyQjs7QUFDQSxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBRCxDQUF4Qjs7QUFFQSxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBRCxDQUF4Qjs7QUFDQSxJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBRCxDQUFwQjs7QUFDQSxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBRCxDQUF4Qjs7QUFDQSxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFFQSxPQUFPLENBQUMsYUFBRCxDQUFQOztBQUVBLFNBQVMsR0FBVCxHQUFlO0FBQ2Qsd0JBQTBCLEtBQUssQ0FBQyxRQUFOLEVBQTFCO0FBQUE7QUFBQSxNQUFPLEtBQVA7QUFBQSxNQUFjLFFBQWQ7O0FBQ0EseUJBQTJCLEtBQUssQ0FBQyxRQUFOLENBQWUsS0FBZixDQUEzQjtBQUFBO0FBQUEsTUFBTyxPQUFQO0FBQUEsTUFBZ0IsT0FBaEI7O0FBQ0EseUJBQW9DLEtBQUssQ0FBQyxRQUFOLENBQWUsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsT0FBckIsQ0FBZixDQUFw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QUUsS0FBSyxDQUFDLGFBRkQ7QUFHcEIsUUFBQSxLQUFLLEVBQUUsS0FBSyxDQUFDO0FBSE8sT0FBZjtBQUxnQixLQUFYLENBQUwsQ0FVSixJQVZJLENBVUMsVUFBQyxHQUFELEVBQVM7QUFDaEIsVUFBSSxHQUFHLENBQUMsTUFBSixJQUFjLEdBQWxCLEVBQXVCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUNELGFBQU8sR0FBRyxDQUFDLElBQUosRUFBUDtBQUNBLEtBakJNLFdBaUJFLFlBQU0sQ0FDZDtBQUNBLEtBbkJNLEVBbUJKLElBbkJJLENBbUJDLFlBQU07QUFDYixNQUFBLFlBQVksQ0FBQyxVQUFiLENBQXdCLE9BQXhCO0FBQ0EsTUFBQSxNQUFNLENBQUMsUUFBUCxHQUFrQixhQUFhLEVBQS9CO0FBQ0EsS0F0Qk0sQ0FBUDtBQXVCQTs7QUFFRCxTQUFPO0FBQ04sSUFBQSxRQUFRLEVBQVIsUUFETTtBQUNJLElBQUEsU0FBUyxFQUFULFNBREo7QUFDZSxJQUFBLFFBQVEsRUFBUixRQURmO0FBQ3lCLElBQUEsWUFBWSxFQUFaLFlBRHpCO0FBQ3VDLElBQUEsVUFBVSxFQUFWLFVBRHZDO0FBQ21ELElBQUEsTUFBTSxFQUFOO0FBRG5ELEdBQVA7QUFHQSxDQS9MRCIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcInVzZSBzdHJpY3RcIjtcblxuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoXCJibHVlYmlyZFwiKTtcbmNvbnN0IFJlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuY29uc3QgUmVhY3REb20gPSByZXF1aXJlKFwicmVhY3QtZG9tXCIpO1xuXG5jb25zdCBvYXV0aExpYiA9IHJlcXVpcmUoXCIuL29hdXRoLmpzXCIpO1xuY29uc3QgQXV0aCA9IHJlcXVpcmUoXCIuL2F1dGhcIik7XG5jb25zdCBTZXR0aW5ncyA9IHJlcXVpcmUoXCIuL3NldHRpbmdzXCIpO1xuY29uc3QgQmxvY2tzID0gcmVxdWlyZShcIi4vYmxvY2tzXCIpO1xuXG5yZXF1aXJlKFwiLi9zdHlsZS5jc3NcIik7XG5cbmZ1bmN0aW9uIEFwcCgpIHtcblx0Y29uc3QgW29hdXRoLCBzZXRPYXV0aF0gPSBSZWFjdC51c2VTdGF0ZSgpO1xuXHRjb25zdCBbaGFzQXV0aCwgc2V0QXV0aF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG5cdGNvbnN0IFtvYXV0aFN0YXRlLCBzZXRPYXV0aFN0YXRlXSA9IFJlYWN0LnVzZVN0YXRlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwib2F1dGhcIikpO1xuXG5cdFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0bGV0IHN0YXRlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJvYXV0aFwiKTtcblx0XHRpZiAoc3RhdGUgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzdGF0ZSA9IEpTT04ucGFyc2Uoc3RhdGUpO1xuXHRcdFx0bGV0IHJlc3RvcmVkT2F1dGggPSBvYXV0aExpYihzdGF0ZS5jb25maWcsIHN0YXRlKTtcblx0XHRcdFByb21pc2UudHJ5KCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHJlc3RvcmVkT2F1dGguY2FsbGJhY2soKTtcblx0XHRcdH0pLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRzZXRBdXRoKHRydWUpO1xuXHRcdFx0fSk7XG5cdFx0XHRzZXRPYXV0aChyZXN0b3JlZE9hdXRoKTtcblx0XHR9XG5cdH0sIFtdKTtcblxuXHRpZiAoIWhhc0F1dGggJiYgb2F1dGggJiYgb2F1dGguaXNBdXRob3JpemVkKCkpIHtcblx0XHRzZXRBdXRoKHRydWUpO1xuXHR9XG5cblx0aWYgKG9hdXRoICYmIG9hdXRoLmlzQXV0aG9yaXplZCgpKSB7XG5cdFx0cmV0dXJuIDxBZG1pblBhbmVsIG9hdXRoPXtvYXV0aH0gLz47XG5cdH0gZWxzZSBpZiAob2F1dGhTdGF0ZSAhPSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gXCJwcm9jZXNzaW5nIG9hdXRoLi4uXCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIDxBdXRoIHNldE9hdXRoPXtzZXRPYXV0aH0gLz47XG5cdH1cbn1cblxuZnVuY3Rpb24gQWRtaW5QYW5lbCh7b2F1dGh9KSB7XG5cdC8qIFxuXHRcdEZlYXR1cmVzOiAoaXNzdWUgIzc4KVxuXHRcdC0gWyBdIEluc3RhbmNlIGluZm9ybWF0aW9uIHVwZGF0aW5nXG5cdFx0XHQgIEdFVCAvYXBpL3YxL2luc3RhbmNlIFBBVENIIC9hcGkvdjEvaW5zdGFuY2Vcblx0XHQtIFsgXSBEb21haW4gYmxvY2sgY3JlYXRpb24sIHZpZXdpbmcsIGFuZCBkZWxldGlvblxuXHRcdFx0ICBHRVQgL2FwaS92MS9hZG1pbi9kb21haW5fYmxvY2tzXG5cdFx0XHQgIFBPU1QgL2FwaS92MS9hZG1pbi9kb21haW5fYmxvY2tzXG5cdFx0XHQgIEdFVCAvYXBpL3YxL2FkbWluL2RvbWFpbl9ibG9ja3MvRE9NQUlOX0JMT0NLX0lELCBERUxFVEUgL2FwaS92MS9hZG1pbi9kb21haW5fYmxvY2tzL0RPTUFJTl9CTE9DS19JRFxuXHRcdC0gWyBdIEJsb2NrbGlzdCBpbXBvcnQvZXhwb3J0XG5cdFx0XHQgIEdFVCAvYXBpL3YxL2FkbWluL2RvbWFpbl9ibG9ja3M/ZXhwb3J0PXRydWVcblx0XHRcdCAgUE9TVCBqc29uIGZpbGUgYXMgZm9ybSBmaWVsZCBkb21haW5zIHRvIC9hcGkvdjEvYWRtaW4vZG9tYWluX2Jsb2Nrc1xuXHQqL1xuXG5cdHJldHVybiAoXG5cdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0PExvZ291dCBvYXV0aD17b2F1dGh9Lz5cblx0XHRcdDxTZXR0aW5ncyBvYXV0aD17b2F1dGh9IC8+XG5cdFx0XHQ8QmxvY2tzIG9hdXRoPXtvYXV0aH0vPlxuXHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdCk7XG59XG5cbmZ1bmN0aW9uIExvZ291dCh7b2F1dGh9KSB7XG5cdHJldHVybiAoXG5cdFx0PGRpdj5cblx0XHRcdDxidXR0b24gb25DbGljaz17b2F1dGgubG9nb3V0fT5Mb2dvdXQ8L2J1dHRvbj5cblx0XHQ8L2Rpdj5cblx0KTtcbn1cblxuUmVhY3REb20ucmVuZGVyKDxBcHAvPiwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyb290XCIpKTsiLCJyZXF1aXJlKFwiLi4vLi4vbm9kZV9tb2R1bGVzL2ljc3NpZnkvZ2xvYmFsLWNzcy1sb2FkZXIuanNcIik7IG1vZHVsZS5leHBvcnRzID0ge307IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKFwiYmx1ZWJpcmRcIik7XG5jb25zdCBSZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBTZXR0aW5ncyh7b2F1dGh9KSB7XG5cdGNvbnN0IFtpbmZvLCBzZXRJbmZvXSA9IFJlYWN0LnVzZVN0YXRlKHt9KTtcblx0Y29uc3QgW2Vycm9yTXNnLCBzZXRFcnJvcl0gPSBSZWFjdC51c2VTdGF0ZShcIlwiKTtcblx0Y29uc3QgW3N0YXR1c01zZywgc2V0U3RhdHVzXSA9IFJlYWN0LnVzZVN0YXRlKFwiRmV0Y2hpbmcgaW5zdGFuY2UgaW5mb1wiKTtcblxuXHRSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuXHRcdFByb21pc2UudHJ5KCgpID0+IHtcblx0XHRcdHJldHVybiBvYXV0aC5hcGlSZXF1ZXN0KFwiL2FwaS92MS9pbnN0YW5jZVwiLCBcIkdFVFwiKTtcblx0XHR9KS50aGVuKChqc29uKSA9PiB7XG5cdFx0XHRzZXRJbmZvKGpzb24pO1xuXHRcdH0pLmNhdGNoKChlKSA9PiB7XG5cdFx0XHRzZXRFcnJvcihlLm1lc3NhZ2UpO1xuXHRcdFx0c2V0U3RhdHVzKFwiXCIpO1xuXHRcdH0pO1xuXHR9LCBbXSk7XG5cblx0ZnVuY3Rpb24gc3VibWl0KCkge1xuXHRcdHNldFN0YXR1cyhcIlBBVENIaW5nXCIpO1xuXHRcdHNldEVycm9yKFwiXCIpO1xuXHRcdHJldHVybiBQcm9taXNlLnRyeSgoKSA9PiB7XG5cdFx0XHRsZXQgZm9ybURhdGFJbmZvID0gbmV3IEZvcm1EYXRhKCk7XG5cdFx0XHRPYmplY3QuZW50cmllcyhpbmZvKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG5cdFx0XHRcdGlmIChrZXkgPT0gXCJjb250YWN0X2FjY291bnRcIikge1xuXHRcdFx0XHRcdGtleSA9IFwiY29udGFjdF91c2VybmFtZVwiO1xuXHRcdFx0XHRcdHZhbCA9IHZhbC51c2VybmFtZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoa2V5ID09IFwiZW1haWxcIikge1xuXHRcdFx0XHRcdGtleSA9IFwiY29udGFjdF9lbWFpbFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlb2YgdmFsICE9IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRmb3JtRGF0YUluZm8uYXBwZW5kKGtleSwgdmFsKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gb2F1dGguYXBpUmVxdWVzdChcIi9hcGkvdjEvaW5zdGFuY2VcIiwgXCJQQVRDSFwiLCBmb3JtRGF0YUluZm8sIFwiZm9ybVwiKTtcblx0XHR9KS50aGVuKChqc29uKSA9PiB7XG5cdFx0XHRzZXRTdGF0dXMoXCJDb25maWcgc2F2ZWRcIik7XG5cdFx0XHRjb25zb2xlLmxvZyhqc29uKTtcblx0XHR9KS5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0c2V0RXJyb3IoZS5tZXNzYWdlKTtcblx0XHRcdHNldFN0YXR1cyhcIlwiKTtcblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiAoXG5cdFx0PHNlY3Rpb24gY2xhc3NOYW1lPVwiaW5mbyBsb2dpblwiPlxuXHRcdFx0PGgxPkluc3RhbmNlIEluZm9ybWF0aW9uIDxidXR0b24gb25DbGljaz17c3VibWl0fT5TYXZlPC9idXR0b24+PC9oMT5cblx0XHRcdDxkaXYgY2xhc3NOYW1lPVwiZXJyb3IgYWNjZW50XCI+XG5cdFx0XHRcdHtlcnJvck1zZ31cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGRpdj5cblx0XHRcdFx0e3N0YXR1c01zZ31cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGZvcm0gb25TdWJtaXQ9eyhlKSA9PiBlLnByZXZlbnREZWZhdWx0KCl9PlxuXHRcdFx0XHR7ZWRpdGFibGVPYmplY3QoaW5mbyl9XG5cdFx0XHQ8L2Zvcm0+XG5cdFx0PC9zZWN0aW9uPlxuXHQpO1xufTtcblxuZnVuY3Rpb24gZWRpdGFibGVPYmplY3Qob2JqLCBwYXRoPVtdKSB7XG5cdGNvbnN0IHJlYWRPbmx5S2V5cyA9IFtcInVyaVwiLCBcInZlcnNpb25cIiwgXCJ1cmxzX3N0cmVhbWluZ19hcGlcIiwgXCJzdGF0c1wiXTtcblx0Y29uc3QgaGlkZGVuS2V5cyA9IFtcImNvbnRhY3RfYWNjb3VudF9cIiwgXCJ1cmxzXCJdO1xuXHRjb25zdCBleHBsaWNpdFNob3duS2V5cyA9IFtcImNvbnRhY3RfYWNjb3VudF91c2VybmFtZVwiXTtcblx0Y29uc3QgaW1wbGVtZW50ZWRLZXlzID0gXCJ0aXRsZSwgY29udGFjdF9hY2NvdW50X3VzZXJuYW1lLCBlbWFpbCwgc2hvcnRfZGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uLCB0ZXJtcywgYXZhdGFyLCBoZWFkZXJcIi5zcGxpdChcIiwgXCIpO1xuXG5cdGxldCBsaXN0aW5nID0gT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrZXksIHZhbF0pID0+IHtcblx0XHRsZXQgZnVsbGtleSA9IFsuLi5wYXRoLCBrZXldLmpvaW4oXCJfXCIpO1xuXG5cdFx0aWYgKFxuXHRcdFx0aGlkZGVuS2V5cy5pbmNsdWRlcyhmdWxsa2V5KSB8fFxuXHRcdFx0aGlkZGVuS2V5cy5pbmNsdWRlcyhwYXRoLmpvaW4oXCJfXCIpK1wiX1wiKSAvLyBhbHNvIG1hdGNoIGp1c3QgcGFyZW50IHBhdGhcblx0XHQpIHtcblx0XHRcdGlmICghZXhwbGljaXRTaG93bktleXMuaW5jbHVkZXMoZnVsbGtleSkpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuXHRcdFx0Ly8gRklYTUU6IGhhbmRsZSB0aGlzXG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsID09IFwib2JqZWN0XCIpIHtcblx0XHRcdHJldHVybiAoPFJlYWN0LkZyYWdtZW50IGtleT17ZnVsbGtleX0+XG5cdFx0XHRcdHtlZGl0YWJsZU9iamVjdCh2YWwsIFsuLi5wYXRoLCBrZXldKX1cblx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+KTtcblx0XHR9IFxuXG5cdFx0bGV0IGlzSW1wbGVtZW50ZWQgPSBcIlwiO1xuXHRcdGlmICghaW1wbGVtZW50ZWRLZXlzLmluY2x1ZGVzKGZ1bGxrZXkpKSB7XG5cdFx0XHRpc0ltcGxlbWVudGVkID0gXCIgbm90SW1wbGVtZW50ZWRcIjtcblx0XHR9XG5cblx0XHRsZXQgaXNSZWFkT25seSA9IChcblx0XHRcdHJlYWRPbmx5S2V5cy5pbmNsdWRlcyhmdWxsa2V5KSB8fFxuXHRcdFx0cmVhZE9ubHlLZXlzLmluY2x1ZGVzKHBhdGguam9pbihcIl9cIikpIHx8XG5cdFx0XHRpc0ltcGxlbWVudGVkICE9IFwiXCJcblx0XHQpO1xuXG5cdFx0bGV0IGxhYmVsID0ga2V5LnJlcGxhY2UoL18vZywgXCIgXCIpO1xuXHRcdGlmIChwYXRoLmxlbmd0aCA+IDApIHtcblx0XHRcdGxhYmVsID0gYFxcdTAwQTBgLnJlcGVhdCg0ICogcGF0aC5sZW5ndGgpICsgbGFiZWw7XG5cdFx0fVxuXG5cdFx0bGV0IGlucHV0UHJvcHM7XG5cdFx0bGV0IGNoYW5nZUZ1bmM7XG5cdFx0aWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09IGZhbHNlKSB7XG5cdFx0XHRpbnB1dFByb3BzID0ge1xuXHRcdFx0XHR0eXBlOiBcImNoZWNrYm94XCIsXG5cdFx0XHRcdGRlZmF1bHRDaGVja2VkOiB2YWwsXG5cdFx0XHRcdGRpc2FibGVkOiBpc1JlYWRPbmx5XG5cdFx0XHR9O1xuXHRcdFx0Y2hhbmdlRnVuYyA9IChlKSA9PiBlLnRhcmdldC5jaGVja2VkO1xuXHRcdH0gZWxzZSBpZiAodmFsLmxlbmd0aCAhPSAwICYmICFpc05hTih2YWwpKSB7XG5cdFx0XHRpbnB1dFByb3BzID0ge1xuXHRcdFx0XHR0eXBlOiBcIm51bWJlclwiLFxuXHRcdFx0XHRkZWZhdWx0VmFsdWU6IHZhbCxcblx0XHRcdFx0cmVhZE9ubHk6IGlzUmVhZE9ubHlcblx0XHRcdH07XG5cdFx0XHRjaGFuZ2VGdW5jID0gKGUpID0+IGUudGFyZ2V0LnZhbHVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnB1dFByb3BzID0ge1xuXHRcdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdFx0ZGVmYXVsdFZhbHVlOiB2YWwsXG5cdFx0XHRcdHJlYWRPbmx5OiBpc1JlYWRPbmx5XG5cdFx0XHR9O1xuXHRcdFx0Y2hhbmdlRnVuYyA9IChlKSA9PiBlLnRhcmdldC52YWx1ZTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzZXRSZWYoZWxlbWVudCkge1xuXHRcdFx0aWYgKGVsZW1lbnQgIT0gbnVsbCkge1xuXHRcdFx0XHRlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgKGUpID0+IHtcblx0XHRcdFx0XHRvYmpba2V5XSA9IGNoYW5nZUZ1bmMoZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAoXG5cdFx0XHQ8UmVhY3QuRnJhZ21lbnQga2V5PXtmdWxsa2V5fT5cblx0XHRcdFx0PGxhYmVsIGh0bWxGb3I9e2tleX0gY2xhc3NOYW1lPVwiY2FwaXRhbGl6ZVwiPntsYWJlbH08L2xhYmVsPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT17aXNJbXBsZW1lbnRlZH0+XG5cdFx0XHRcdFx0PGlucHV0IGNsYXNzTmFtZT17aXNJbXBsZW1lbnRlZH0gcmVmPXtzZXRSZWZ9IHsuLi5pbnB1dFByb3BzfSAvPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdFx0KTtcblx0fSk7XG5cdHJldHVybiAoXG5cdFx0PFJlYWN0LkZyYWdtZW50PlxuXHRcdFx0e3BhdGggIT0gXCJcIiAmJlxuXHRcdFx0XHQ8PjxiPntwYXRofTo8L2I+IDxzcGFuIGlkPVwiZmlsbGVyXCI+PC9zcGFuPjwvPlxuXHRcdFx0fVxuXHRcdFx0e2xpc3Rpbmd9XG5cdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0KTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoXCJibHVlYmlyZFwiKTtcbmNvbnN0IFJlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuY29uc3QgZmlsZURvd25sb2FkID0gcmVxdWlyZShcImpzLWZpbGUtZG93bmxvYWRcIik7XG5cbmZ1bmN0aW9uIHNvcnRCbG9ja3MoYmxvY2tzKSB7XG5cdHJldHVybiBibG9ja3Muc29ydCgoYSwgYikgPT4geyAvLyBhbHBoYWJldGljYWwgc29ydFxuXHRcdHJldHVybiBhLmRvbWFpbi5sb2NhbGVDb21wYXJlKGIuZG9tYWluKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGRlZHVwbGljYXRlQmxvY2tzKGJsb2Nrcykge1xuXHRsZXQgYSA9IG5ldyBNYXAoKTtcblx0YmxvY2tzLmZvckVhY2goKGJsb2NrKSA9PiB7XG5cdFx0YS5zZXQoYmxvY2suaWQsIGJsb2NrKTtcblx0fSk7XG5cdHJldHVybiBBcnJheS5mcm9tKGEudmFsdWVzKCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIEJsb2Nrcyh7b2F1dGh9KSB7XG5cdGNvbnN0IFtibG9ja3MsIHNldEJsb2Nrc10gPSBSZWFjdC51c2VTdGF0ZShbXSk7XG5cdGNvbnN0IFtpbmZvLCBzZXRJbmZvXSA9IFJlYWN0LnVzZVN0YXRlKFwiRmV0Y2hpbmcgYmxvY2tzXCIpO1xuXHRjb25zdCBbZXJyb3JNc2csIHNldEVycm9yXSA9IFJlYWN0LnVzZVN0YXRlKFwiXCIpO1xuXHRjb25zdCBbY2hlY2tlZCwgc2V0Q2hlY2tlZF0gPSBSZWFjdC51c2VTdGF0ZShuZXcgU2V0KCkpO1xuXG5cdFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0UHJvbWlzZS50cnkoKCkgPT4ge1xuXHRcdFx0cmV0dXJuIG9hdXRoLmFwaVJlcXVlc3QoXCIvYXBpL3YxL2FkbWluL2RvbWFpbl9ibG9ja3NcIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFwiR0VUXCIpO1xuXHRcdH0pLnRoZW4oKGpzb24pID0+IHtcblx0XHRcdHNldEluZm8oXCJcIik7XG5cdFx0XHRzZXRFcnJvcihcIlwiKTtcblx0XHRcdHNldEJsb2Nrcyhzb3J0QmxvY2tzKGpzb24pKTtcblx0XHR9KS5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0c2V0RXJyb3IoZS5tZXNzYWdlKTtcblx0XHRcdHNldEluZm8oXCJcIik7XG5cdFx0fSk7XG5cdH0sIFtdKTtcblxuXHRsZXQgYmxvY2tMaXN0ID0gYmxvY2tzLm1hcCgoYmxvY2spID0+IHtcblx0XHRmdW5jdGlvbiB1cGRhdGUoZSkge1xuXHRcdFx0bGV0IG5ld0NoZWNrZWQgPSBuZXcgU2V0KGNoZWNrZWQudmFsdWVzKCkpO1xuXHRcdFx0aWYgKGUudGFyZ2V0LmNoZWNrZWQpIHtcblx0XHRcdFx0bmV3Q2hlY2tlZC5hZGQoYmxvY2suaWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bmV3Q2hlY2tlZC5kZWxldGUoYmxvY2suaWQpO1xuXHRcdFx0fVxuXHRcdFx0c2V0Q2hlY2tlZChuZXdDaGVja2VkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PFJlYWN0LkZyYWdtZW50IGtleT17YmxvY2suaWR9PlxuXHRcdFx0XHQ8ZGl2PjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBvbkNoYW5nZT17dXBkYXRlfSBjaGVja2VkPXtjaGVja2VkLmhhcyhibG9jay5pZCl9PjwvaW5wdXQ+PC9kaXY+XG5cdFx0XHRcdDxkaXY+e2Jsb2NrLmRvbWFpbn08L2Rpdj5cblx0XHRcdFx0PGRpdj57KG5ldyBEYXRlKGJsb2NrLmNyZWF0ZWRfYXQpKS50b0xvY2FsZVN0cmluZygpfTwvZGl2PlxuXHRcdFx0PC9SZWFjdC5GcmFnbWVudD5cblx0XHQpO1xuXHR9KTtcblxuXHRmdW5jdGlvbiBjbGVhckNoZWNrZWQoKSB7XG5cdFx0c2V0Q2hlY2tlZChuZXcgU2V0KCkpO1xuXHR9XG5cblx0ZnVuY3Rpb24gdW5kb0NoZWNrZWQoKSB7XG5cdFx0bGV0IGFtb3VudCA9IGNoZWNrZWQuc2l6ZTtcblx0XHRpZihjb25maXJtKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlICR7YW1vdW50fSBibG9jayhzKT9gKSkge1xuXHRcdFx0c2V0SW5mbyhcIlwiKTtcblx0XHRcdFByb21pc2UubWFwKEFycmF5LmZyb20oY2hlY2tlZC52YWx1ZXMoKSksIChibG9jaykgPT4ge1xuXHRcdFx0XHRjb25zb2xlLmxvZyhcImRlbGV0aW5nXCIsIGJsb2NrKTtcblx0XHRcdFx0cmV0dXJuIG9hdXRoLmFwaVJlcXVlc3QoYC9hcGkvdjEvYWRtaW4vZG9tYWluX2Jsb2Nrcy8ke2Jsb2NrfWAsIFwiREVMRVRFXCIpO1xuXHRcdFx0fSkudGhlbigocmVzKSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKHJlcyk7XG5cdFx0XHRcdHNldEluZm8oYERlbGV0ZWQgJHthbW91bnR9IGJsb2NrczogJHtyZXMubWFwKChhKSA9PiBhLmRvbWFpbikuam9pbihcIiwgXCIpfWApO1xuXHRcdFx0fSkuY2F0Y2goKGUpID0+IHtcblx0XHRcdFx0c2V0RXJyb3IoZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0bGV0IG5ld0Jsb2NrcyA9IGJsb2Nrcy5maWx0ZXIoKGJsb2NrKSA9PiB7XG5cdFx0XHRcdGlmIChjaGVja2VkLnNpemUgPiAwICYmIGNoZWNrZWQuaGFzKGJsb2NrLmlkKSkge1xuXHRcdFx0XHRcdGNoZWNrZWQuZGVsZXRlKGJsb2NrLmlkKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0c2V0QmxvY2tzKG5ld0Jsb2Nrcyk7XG5cdFx0XHRjbGVhckNoZWNrZWQoKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gKFxuXHRcdDxzZWN0aW9uIGNsYXNzTmFtZT1cImJsb2Nrc1wiPlxuXHRcdFx0PGgxPkJsb2NrczwvaDE+XG5cdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cImVycm9yIGFjY2VudFwiPntlcnJvck1zZ308L2Rpdj5cblx0XHRcdDxkaXY+e2luZm99PC9kaXY+XG5cdFx0XHQ8QWRkQmxvY2sgb2F1dGg9e29hdXRofSBibG9ja3M9e2Jsb2Nrc30gc2V0QmxvY2tzPXtzZXRCbG9ja3N9IC8+XG5cdFx0XHQ8aDM+QmxvY2tzOjwvaDM+XG5cdFx0XHQ8ZGl2IHN0eWxlPXt7ZGlzcGxheTogXCJncmlkXCIsIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IFwiMWZyIGF1dG9cIn19PlxuXHRcdFx0XHQ8c3BhbiBvbkNsaWNrPXtjbGVhckNoZWNrZWR9IGNsYXNzTmFtZT1cImFjY2VudFwiIHN0eWxlPXt7YWxpZ25TZWxmOiBcImVuZFwifX0+dW5jaGVjayBhbGw8L3NwYW4+XG5cdFx0XHRcdDxidXR0b24gb25DbGljaz17dW5kb0NoZWNrZWR9PlVuYmxvY2sgc2VsZWN0ZWQ8L2J1dHRvbj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGRpdiBjbGFzc05hbWU9XCJibG9ja2xpc3Qgb3ZlcmZsb3dcIj5cblx0XHRcdFx0e2Jsb2NrTGlzdH1cblx0XHRcdDwvZGl2PlxuXHRcdFx0PEJ1bGtCbG9ja2luZyBvYXV0aD17b2F1dGh9IGJsb2Nrcz17YmxvY2tzfSBzZXRCbG9ja3M9e3NldEJsb2Nrc30vPlxuXHRcdDwvc2VjdGlvbj5cblx0KTtcbn07XG5cbmZ1bmN0aW9uIEJ1bGtCbG9ja2luZyh7b2F1dGgsIGJsb2Nrcywgc2V0QmxvY2tzfSkge1xuXHRjb25zdCBbYnVsaywgc2V0QnVsa10gPSBSZWFjdC51c2VTdGF0ZShcIlwiKTtcblx0Y29uc3QgW2Jsb2NrTWFwLCBzZXRCbG9ja01hcF0gPSBSZWFjdC51c2VTdGF0ZShuZXcgTWFwKCkpO1xuXHRjb25zdCBbb3V0cHV0LCBzZXRPdXRwdXRdID0gUmVhY3QudXNlU3RhdGUoKTtcblxuXHRSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuXHRcdGxldCBuZXdCbG9ja01hcCA9IG5ldyBNYXAoKTtcblx0XHRibG9ja3MuZm9yRWFjaCgoYmxvY2spID0+IHtcblx0XHRcdG5ld0Jsb2NrTWFwLnNldChibG9jay5kb21haW4sIGJsb2NrKTtcblx0XHR9KTtcblx0XHRzZXRCbG9ja01hcChuZXdCbG9ja01hcCk7XG5cdH0sIFtibG9ja3NdKTtcblxuXHRjb25zdCBmaWxlUmVmID0gUmVhY3QudXNlUmVmKCk7XG5cblx0ZnVuY3Rpb24gZXJyb3IoZSkge1xuXHRcdHNldE91dHB1dCg8ZGl2IGNsYXNzTmFtZT1cImVycm9yIGFjY2VudFwiPntlfTwvZGl2Pik7XG5cdFx0dGhyb3cgZTtcblx0fVxuXG5cdGZ1bmN0aW9uIGZpbGVVcGxvYWQoKSB7XG5cdFx0bGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cdFx0cmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIChlKSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBUT0RPOiB1c2UgdmFsaWRhdGVtP1xuXHRcdFx0XHRsZXQganNvbiA9IEpTT04ucGFyc2UoZS50YXJnZXQucmVzdWx0KTtcblx0XHRcdFx0anNvbi5mb3JFYWNoKChibG9jaykgPT4ge1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiYmxvY2s6XCIsIGJsb2NrKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoKGUpIHtcblx0XHRcdFx0ZXJyb3IoZS5tZXNzYWdlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZWFkZXIucmVhZEFzVGV4dChmaWxlUmVmLmN1cnJlbnQuZmlsZXNbMF0pO1xuXHR9XG5cblx0UmVhY3QudXNlRWZmZWN0KCgpID0+IHtcblx0XHRpZiAoZmlsZVJlZiAmJiBmaWxlUmVmLmN1cnJlbnQpIHtcblx0XHRcdGZpbGVSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZpbGVVcGxvYWQpO1xuXHRcdH1cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xlYW51cCgpIHtcblx0XHRcdGZpbGVSZWYuY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZpbGVVcGxvYWQpO1xuXHRcdH07XG5cdH0pO1xuXG5cdGZ1bmN0aW9uIHRleHRJbXBvcnQoKSB7XG5cdFx0UHJvbWlzZS50cnkoKCkgPT4ge1xuXHRcdFx0aWYgKGJ1bGtbMF0gPT0gXCJbXCIpIHtcblx0XHRcdFx0Ly8gYXNzdW1lIGl0J3MganNvblxuXHRcdFx0XHRyZXR1cm4gSlNPTi5wYXJzZShidWxrKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBidWxrLnNwbGl0KFwiXFxuXCIpLm1hcCgodmFsKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdGRvbWFpbjogdmFsLnRyaW0oKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pLnRoZW4oKGRvbWFpbnMpID0+IHtcblx0XHRcdGNvbnNvbGUubG9nKGRvbWFpbnMpO1xuXHRcdFx0bGV0IGJlZm9yZSA9IGRvbWFpbnMubGVuZ3RoO1xuXHRcdFx0c2V0T3V0cHV0KGBJbXBvcnRpbmcgJHtiZWZvcmV9IGRvbWFpbihzKWApO1xuXHRcdFx0ZG9tYWlucyA9IGRvbWFpbnMuZmlsdGVyKCh7ZG9tYWlufSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gKGRvbWFpbiAhPSBcIlwiICYmICFibG9ja01hcC5oYXMoZG9tYWluKSk7XG5cdFx0XHR9KTtcblx0XHRcdHNldE91dHB1dCg8c3Bhbj57b3V0cHV0fTxici8+e2BEZWR1cGxpY2F0ZWQgJHtiZWZvcmUgLSBkb21haW5zLmxlbmd0aH0vJHtiZWZvcmV9IHdpdGggZXhpc3RpbmcgYmxvY2tzLCBhZGRpbmcgJHtkb21haW5zLmxlbmd0aH0gYmxvY2socylgfTwvc3Bhbj4pO1xuXHRcdFx0aWYgKGRvbWFpbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsZXQgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXHRcdFx0XHRkYXRhLmFwcGVuZChcImRvbWFpbnNcIiwgbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGRvbWFpbnMpXSwge3R5cGU6IFwiYXBwbGljYXRpb24vanNvblwifSksIFwiaW1wb3J0Lmpzb25cIik7XG5cdFx0XHRcdHJldHVybiBvYXV0aC5hcGlSZXF1ZXN0KFwiL2FwaS92MS9hZG1pbi9kb21haW5fYmxvY2tzP2ltcG9ydD10cnVlXCIsIFwiUE9TVFwiLCBkYXRhLCBcImZvcm1cIik7XG5cdFx0XHR9XG5cdFx0fSkudGhlbigoanNvbikgPT4ge1xuXHRcdFx0Y29uc29sZS5sb2coXCJidWxrIGltcG9ydCByZXN1bHQ6XCIsIGpzb24pO1xuXHRcdFx0c2V0QmxvY2tzKHNvcnRCbG9ja3MoZGVkdXBsaWNhdGVCbG9ja3MoWy4uLmpzb24sIC4uLmJsb2Nrc10pKSk7XG5cdFx0fSkuY2F0Y2goKGUpID0+IHtcblx0XHRcdGVycm9yKGUubWVzc2FnZSk7XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0RXhwb3J0KCkge1xuXHRcdHNldEJ1bGsoYmxvY2tzLnJlZHVjZSgoc3RyLCB2YWwpID0+IHtcblx0XHRcdGlmICh0eXBlb2Ygc3RyID09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0cmV0dXJuIHN0ci5kb21haW47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gc3RyICsgXCJcXG5cIiArIHZhbC5kb21haW47XG5cdFx0XHR9XG5cdFx0fSkpO1xuXHR9XG5cblx0ZnVuY3Rpb24ganNvbkV4cG9ydCgpIHtcblx0XHRQcm9taXNlLnRyeSgoKSA9PiB7XG5cdFx0XHRyZXR1cm4gb2F1dGguYXBpUmVxdWVzdChcIi9hcGkvdjEvYWRtaW4vZG9tYWluX2Jsb2Nrcz9leHBvcnQ9dHJ1ZVwiLCBcIkdFVFwiKTtcblx0XHR9KS50aGVuKChqc29uKSA9PiB7XG5cdFx0XHRmaWxlRG93bmxvYWQoSlNPTi5zdHJpbmdpZnkoanNvbiksIFwiYmxvY2stZXhwb3J0Lmpzb25cIik7XG5cdFx0fSkuY2F0Y2goKGUpID0+IHtcblx0XHRcdGVycm9yKGUpO1xuXHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gdGV4dEFyZWFVcGRhdGUoZSkge1xuXHRcdHNldEJ1bGsoZS50YXJnZXQudmFsdWUpO1xuXHR9XG5cblx0cmV0dXJuIChcblx0XHQ8UmVhY3QuRnJhZ21lbnQ+XG5cdFx0XHQ8aDM+QnVsayBpbXBvcnQvZXhwb3J0PC9oMz5cblx0XHRcdDxsYWJlbCBodG1sRm9yPVwiYnVsa1wiPkRvbWFpbnMsIG9uZSBwZXIgbGluZTo8L2xhYmVsPlxuXHRcdFx0PHRleHRhcmVhIHZhbHVlPXtidWxrfSByb3dzPXsyMH0gb25DaGFuZ2U9e3RleHRBcmVhVXBkYXRlfT48L3RleHRhcmVhPlxuXHRcdFx0PGRpdiBjbGFzc05hbWU9XCJjb250cm9sc1wiPlxuXHRcdFx0XHQ8YnV0dG9uIG9uQ2xpY2s9e3RleHRJbXBvcnR9PkltcG9ydCBBbGwgRnJvbSBGaWVsZDwvYnV0dG9uPlxuXHRcdFx0XHQ8YnV0dG9uIG9uQ2xpY2s9e3RleHRFeHBvcnR9PkV4cG9ydCBUbyBGaWVsZDwvYnV0dG9uPlxuXHRcdFx0XHQ8bGFiZWwgY2xhc3NOYW1lPVwiYnV0dG9uXCIgaHRtbEZvcj1cInVwbG9hZFwiPlVwbG9hZCAuanNvbjwvbGFiZWw+XG5cdFx0XHRcdDxidXR0b24gb25DbGljaz17anNvbkV4cG9ydH0+RG93bmxvYWQgLmpzb248L2J1dHRvbj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0e291dHB1dH1cblx0XHRcdDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwidXBsb2FkXCIgY2xhc3NOYW1lPVwiaGlkZGVuXCIgcmVmPXtmaWxlUmVmfT48L2lucHV0PlxuXHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdCk7XG59XG5cbmZ1bmN0aW9uIEFkZEJsb2NrKHtvYXV0aCwgYmxvY2tzLCBzZXRCbG9ja3N9KSB7XG5cdGNvbnN0IFtkb21haW4sIHNldERvbWFpbl0gPSBSZWFjdC51c2VTdGF0ZShcIlwiKTtcblx0Y29uc3QgW3R5cGUsIHNldFR5cGVdID0gUmVhY3QudXNlU3RhdGUoXCJzdXNwZW5kXCIpO1xuXHRjb25zdCBbb2JmdXNjYXRlZCwgc2V0T2JmdXNjYXRlZF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG5cdGNvbnN0IFtwcml2YXRlRGVzY3JpcHRpb24sIHNldFByaXZhdGVEZXNjcmlwdGlvbl0gPSBSZWFjdC51c2VTdGF0ZShcIlwiKTtcblx0Y29uc3QgW3B1YmxpY0Rlc2NyaXB0aW9uLCBzZXRQdWJsaWNEZXNjcmlwdGlvbl0gPSBSZWFjdC51c2VTdGF0ZShcIlwiKTtcblxuXHRmdW5jdGlvbiBhZGRCbG9jaygpIHtcblx0XHRjb25zb2xlLmxvZyhgJHt0eXBlfWluZ2AsIGRvbWFpbik7XG5cdFx0UHJvbWlzZS50cnkoKCkgPT4ge1xuXHRcdFx0cmV0dXJuIG9hdXRoLmFwaVJlcXVlc3QoXCIvYXBpL3YxL2FkbWluL2RvbWFpbl9ibG9ja3NcIiwgXCJQT1NUXCIsIHtcblx0XHRcdFx0ZG9tYWluOiBkb21haW4sXG5cdFx0XHRcdG9iZnVzY2F0ZTogb2JmdXNjYXRlZCxcblx0XHRcdFx0cHJpdmF0ZV9jb21tZW50OiBwcml2YXRlRGVzY3JpcHRpb24sXG5cdFx0XHRcdHB1YmxpY19jb21tZW50OiBwdWJsaWNEZXNjcmlwdGlvblxuXHRcdFx0fSwgXCJqc29uXCIpO1xuXHRcdH0pLnRoZW4oKGpzb24pID0+IHtcblx0XHRcdHNldERvbWFpbihcIlwiKTtcblx0XHRcdHNldFByaXZhdGVEZXNjcmlwdGlvbihcIlwiKTtcblx0XHRcdHNldFB1YmxpY0Rlc2NyaXB0aW9uKFwiXCIpO1xuXHRcdFx0c2V0QmxvY2tzKFtqc29uLCAuLi5ibG9ja3NdKTtcblx0XHR9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIG9uRG9tYWluQ2hhbmdlKGUpIHtcblx0XHRzZXREb21haW4oZS50YXJnZXQudmFsdWUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gb25UeXBlQ2hhbmdlKGUpIHtcblx0XHRzZXRUeXBlKGUudGFyZ2V0LnZhbHVlKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG5cdFx0aWYgKGUua2V5ID09IFwiRW50ZXJcIikge1xuXHRcdFx0YWRkQmxvY2soKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gKFxuXHRcdDxSZWFjdC5GcmFnbWVudD5cblx0XHRcdDxoMz5BZGQgQmxvY2s6PC9oMz5cblx0XHRcdDxkaXYgY2xhc3NOYW1lPVwiYWRkYmxvY2tcIj5cblx0XHRcdFx0PGlucHV0IGlkPVwiZG9tYWluXCIgcGxhY2Vob2xkZXI9XCJpbnN0YW5jZVwiIG9uQ2hhbmdlPXtvbkRvbWFpbkNoYW5nZX0gdmFsdWU9e2RvbWFpbn0gb25LZXlEb3duPXtvbktleURvd259IC8+XG5cdFx0XHRcdDxzZWxlY3QgdmFsdWU9e3R5cGV9IG9uQ2hhbmdlPXtvblR5cGVDaGFuZ2V9PlxuXHRcdFx0XHRcdDxvcHRpb24gaWQ9XCJzdXNwZW5kXCI+U3VzcGVuZDwvb3B0aW9uPlxuXHRcdFx0XHRcdDxvcHRpb24gaWQ9XCJzaWxlbmNlXCI+U2lsZW5jZTwvb3B0aW9uPlxuXHRcdFx0XHQ8L3NlbGVjdD5cblx0XHRcdFx0PGJ1dHRvbiBvbkNsaWNrPXthZGRCbG9ja30+QWRkPC9idXR0b24+XG5cdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0PGxhYmVsIGh0bWxGb3I9XCJwcml2YXRlXCI+UHJpdmF0ZSBkZXNjcmlwdGlvbjo8L2xhYmVsPjxici8+XG5cdFx0XHRcdFx0PHRleHRhcmVhIGlkPVwicHJpdmF0ZVwiIHZhbHVlPXtwcml2YXRlRGVzY3JpcHRpb259IG9uQ2hhbmdlPXsoZSkgPT4gc2V0UHJpdmF0ZURlc2NyaXB0aW9uKGUudGFyZ2V0LnZhbHVlKX0+PC90ZXh0YXJlYT5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0PGxhYmVsIGh0bWxGb3I9XCJwdWJsaWNcIj5QdWJsaWMgZGVzY3JpcHRpb246PC9sYWJlbD48YnIvPlxuXHRcdFx0XHRcdDx0ZXh0YXJlYSBpZD1cInB1YmxpY1wiIHZhbHVlPXtwdWJsaWNEZXNjcmlwdGlvbn0gb25DaGFuZ2U9eyhlKSA9PiBzZXRQdWJsaWNEZXNjcmlwdGlvbihlLnRhcmdldC52YWx1ZSl9PjwvdGV4dGFyZWE+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInNpbmdsZVwiPlxuXHRcdFx0XHRcdDxsYWJlbCBodG1sRm9yPVwib2JmdXNjYXRlXCI+T2JmdXNjYXRlOjwvbGFiZWw+XG5cdFx0XHRcdFx0PGlucHV0IGlkPVwib2JmdXNjYXRlXCIgdHlwZT1cImNoZWNrYm94XCIgdmFsdWU9e29iZnVzY2F0ZWR9IG9uQ2hhbmdlPXsoZSkgPT4gc2V0T2JmdXNjYXRlZChlLnRhcmdldC5jaGVja2VkKX0vPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvUmVhY3QuRnJhZ21lbnQ+XG5cdCk7XG59XG5cbi8vIGZ1bmN0aW9uIEJsb2NrbGlzdCgpIHtcbi8vIFx0cmV0dXJuIChcbi8vIFx0XHQ8c2VjdGlvbiBjbGFzc05hbWU9XCJibG9ja2xpc3RzXCI+XG4vLyBcdFx0XHQ8aDE+QmxvY2tsaXN0czwvaDE+XG4vLyBcdFx0PC9zZWN0aW9uPlxuLy8gXHQpO1xuLy8gfSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZGF0YSwgZmlsZW5hbWUsIG1pbWUsIGJvbSkge1xuICAgIHZhciBibG9iRGF0YSA9ICh0eXBlb2YgYm9tICE9PSAndW5kZWZpbmVkJykgPyBbYm9tLCBkYXRhXSA6IFtkYXRhXVxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoYmxvYkRhdGEsIHt0eXBlOiBtaW1lIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nfSk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIElFIHdvcmthcm91bmQgZm9yIFwiSFRNTDcwMDc6IE9uZSBvciBtb3JlIGJsb2IgVVJMcyB3ZXJlXG4gICAgICAgIC8vIHJldm9rZWQgYnkgY2xvc2luZyB0aGUgYmxvYiBmb3Igd2hpY2ggdGhleSB3ZXJlIGNyZWF0ZWQuXG4gICAgICAgIC8vIFRoZXNlIFVSTHMgd2lsbCBubyBsb25nZXIgcmVzb2x2ZSBhcyB0aGUgZGF0YSBiYWNraW5nXG4gICAgICAgIC8vIHRoZSBVUkwgaGFzIGJlZW4gZnJlZWQuXCJcbiAgICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBibG9iVVJMID0gKHdpbmRvdy5VUkwgJiYgd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwpID8gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYikgOiB3aW5kb3cud2Via2l0VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgdmFyIHRlbXBMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICB0ZW1wTGluay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0ZW1wTGluay5ocmVmID0gYmxvYlVSTDtcbiAgICAgICAgdGVtcExpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVuYW1lKTtcblxuICAgICAgICAvLyBTYWZhcmkgdGhpbmtzIF9ibGFuayBhbmNob3IgYXJlIHBvcCB1cHMuIFdlIG9ubHkgd2FudCB0byBzZXQgX2JsYW5rXG4gICAgICAgIC8vIHRhcmdldCBpZiB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBIVE1MNSBkb3dubG9hZCBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIFRoaXMgYWxsb3dzIHlvdSB0byBkb3dubG9hZCBmaWxlcyBpbiBkZXNrdG9wIHNhZmFyaSBpZiBwb3AgdXAgYmxvY2tpbmdcbiAgICAgICAgLy8gaXMgZW5hYmxlZC5cbiAgICAgICAgaWYgKHR5cGVvZiB0ZW1wTGluay5kb3dubG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRlbXBMaW5rLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wTGluayk7XG4gICAgICAgIHRlbXBMaW5rLmNsaWNrKCk7XG5cbiAgICAgICAgLy8gRml4ZXMgXCJ3ZWJraXQgYmxvYiByZXNvdXJjZSBlcnJvciAxXCJcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVtcExpbmspO1xuICAgICAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVSTCk7XG4gICAgICAgIH0sIDIwMClcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoXCJibHVlYmlyZFwiKTtcbmNvbnN0IFJlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuY29uc3Qgb2F1dGhMaWIgPSByZXF1aXJlKFwiLi9vYXV0aFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBBdXRoKHtzZXRPYXV0aH0pIHtcblx0Y29uc3QgWyBpbnN0YW5jZSwgc2V0SW5zdGFuY2UgXSA9IFJlYWN0LnVzZVN0YXRlKFwiXCIpO1xuXG5cdFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0bGV0IGlzU3RpbGxNb3VudGVkID0gdHJ1ZTtcblx0XHQvLyBjaGVjayBpZiBjdXJyZW50IGRvbWFpbiBydW5zIGFuIGluc3RhbmNlXG5cdFx0bGV0IHRoaXNVcmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuXHRcdHRoaXNVcmwucGF0aG5hbWUgPSBcIi9hcGkvdjEvaW5zdGFuY2VcIjtcblx0XHRmZXRjaCh0aGlzVXJsLmhyZWYpXG5cdFx0XHQudGhlbigocmVzKSA9PiByZXMuanNvbigpKVxuXHRcdFx0LnRoZW4oKGpzb24pID0+IHtcblx0XHRcdFx0aWYgKGpzb24gJiYganNvbi51cmkpIHtcblx0XHRcdFx0XHRpZiAoaXNTdGlsbE1vdW50ZWQpIHtcblx0XHRcdFx0XHRcdHNldEluc3RhbmNlKGpzb24udXJpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKGUpID0+IHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcihcImNhdWdodFwiLCBlKTtcblx0XHRcdFx0Ly8gbm8gaW5zdGFuY2UgaGVyZVxuXHRcdFx0fSk7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdC8vIGNsZWFudXAgZnVuY3Rpb25cblx0XHRcdGlzU3RpbGxNb3VudGVkID0gZmFsc2U7XG5cdFx0fTtcblx0fSwgW10pO1xuXG5cdGZ1bmN0aW9uIGRvQXV0aCgpIHtcblx0XHRsZXQgb2F1dGggPSBvYXV0aExpYih7XG5cdFx0XHRpbnN0YW5jZTogaW5zdGFuY2UsXG5cdFx0XHRjbGllbnRfbmFtZTogXCJHb1RvU29jaWFsIEFkbWluIFBhbmVsXCIsXG5cdFx0XHRzY29wZTogW1wiYWRtaW5cIl0sXG5cdFx0XHR3ZWJzaXRlOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuXHRcdH0pO1xuXHRcdHNldE9hdXRoKG9hdXRoKTtcblxuXHRcdHJldHVybiBQcm9taXNlLnRyeSgoKSA9PiB7XG5cdFx0XHRyZXR1cm4gb2F1dGgucmVnaXN0ZXIoKTtcblx0XHR9KS50aGVuKCgpID0+IHtcblx0XHRcdHJldHVybiBvYXV0aC5hdXRob3JpemUoKTtcblx0XHR9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZUluc3RhbmNlKGUpIHtcblx0XHRpZiAoZS5rZXkgPT0gXCJFbnRlclwiKSB7XG5cdFx0XHRkb0F1dGgoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c2V0SW5zdGFuY2UoZS50YXJnZXQudmFsdWUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiAoXG5cdFx0PHNlY3Rpb24gY2xhc3NOYW1lPVwibG9naW5cIj5cblx0XHRcdDxoMT5PQVVUSCBMb2dpbjo8L2gxPlxuXHRcdFx0PGZvcm0gb25TdWJtaXQ9eyhlKSA9PiBlLnByZXZlbnREZWZhdWx0KCl9PlxuXHRcdFx0XHQ8bGFiZWwgaHRtbEZvcj1cImluc3RhbmNlXCI+SW5zdGFuY2U6IDwvbGFiZWw+XG5cdFx0XHRcdDxpbnB1dCB2YWx1ZT17aW5zdGFuY2V9IG9uQ2hhbmdlPXt1cGRhdGVJbnN0YW5jZX0gaWQ9XCJpbnN0YW5jZVwiLz5cblx0XHRcdFx0PGJ1dHRvbiBvbkNsaWNrPXtkb0F1dGh9PkF1dGhlbnRpY2F0ZTwvYnV0dG9uPlxuXHRcdFx0PC9mb3JtPlxuXHRcdDwvc2VjdGlvbj5cblx0KTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKFwiYmx1ZWJpcmRcIik7XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRVcmwoKSB7XG5cdHJldHVybiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOyAvLyBzdHJpcHMgP3F1ZXJ5PXN0cmluZyBhbmQgI2hhc2hcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBvYXV0aENsaWVudChjb25maWcsIGluaXRTdGF0ZSkge1xuXHQvKiBjb25maWc6IFxuXHRcdGluc3RhbmNlOiBpbnN0YW5jZSBkb21haW4gKGh0dHBzOi8vdGVzdGluZ3Rlc3RpbmcxMjMueHl6KVxuXHRcdGNsaWVudF9uYW1lOiBcIkdvVG9Tb2NpYWwgQWRtaW4gUGFuZWxcIlxuXHRcdHNjb3BlOiBbXVxuXHRcdHdlYnNpdGU6IFxuXHQqL1xuXG5cdGxldCBzdGF0ZSA9IGluaXRTdGF0ZTtcblx0aWYgKGluaXRTdGF0ZSA9PSB1bmRlZmluZWQpIHtcblx0XHRzdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwib2F1dGhcIik7XG5cdFx0aWYgKHN0YXRlID09IHVuZGVmaW5lZCkge1xuXHRcdFx0c3RhdGUgPSB7XG5cdFx0XHRcdGNvbmZpZ1xuXHRcdFx0fTtcblx0XHRcdHN0b3JlU3RhdGUoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3RhdGUgPSBKU09OLnBhcnNlKHN0YXRlKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBzdG9yZVN0YXRlKCkge1xuXHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwib2F1dGhcIiwgSlNPTi5zdHJpbmdpZnkoc3RhdGUpKTtcblx0fVxuXG5cdC8qIHJlZ2lzdGVyIGFwcFxuXHRcdC9hcGkvdjEvYXBwc1xuXHQqL1xuXHRmdW5jdGlvbiByZWdpc3RlcigpIHtcblx0XHRpZiAoc3RhdGUuY2xpZW50X2lkICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRydWU7IC8vIHdlIGFscmVhZHkgaGF2ZSBhIHJlZ2lzdHJhdGlvblxuXHRcdH1cblx0XHRsZXQgdXJsID0gbmV3IFVSTChjb25maWcuaW5zdGFuY2UpO1xuXHRcdHVybC5wYXRobmFtZSA9IFwiL2FwaS92MS9hcHBzXCI7XG5cblx0XHRyZXR1cm4gZmV0Y2godXJsLmhyZWYsIHtcblx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdCdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcblx0XHRcdH0sXG5cdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdGNsaWVudF9uYW1lOiBjb25maWcuY2xpZW50X25hbWUsXG5cdFx0XHRcdHJlZGlyZWN0X3VyaXM6IGdldEN1cnJlbnRVcmwoKSxcblx0XHRcdFx0c2NvcGVzOiBjb25maWcuc2NvcGUuam9pbihcIiBcIiksXG5cdFx0XHRcdHdlYnNpdGU6IGdldEN1cnJlbnRVcmwoKVxuXHRcdFx0fSlcblx0XHR9KS50aGVuKChyZXMpID0+IHtcblx0XHRcdGlmIChyZXMuc3RhdHVzICE9IDIwMCkge1xuXHRcdFx0XHR0aHJvdyByZXM7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzLmpzb24oKTtcblx0XHR9KS50aGVuKChqc29uKSA9PiB7XG5cdFx0XHRzdGF0ZS5jbGllbnRfaWQgPSBqc29uLmNsaWVudF9pZDtcblx0XHRcdHN0YXRlLmNsaWVudF9zZWNyZXQgPSBqc29uLmNsaWVudF9zZWNyZXQ7XG5cdFx0XHRzdG9yZVN0YXRlKCk7XG5cdFx0fSk7XG5cdH1cblx0XG5cdC8qIGF1dGhvcml6ZTpcblx0XHQvb2F1dGgvYXV0aG9yaXplXG5cdFx0XHQ/Y2xpZW50X2lkPUNMSUVOVF9JRFxuXHRcdFx0JnJlZGlyZWN0X3VyaT13aW5kb3cubG9jYXRpb24uaHJlZlxuXHRcdFx0JnJlc3BvbnNlX3R5cGU9Y29kZVxuXHRcdFx0JnNjb3BlPWFkbWluXG5cdCovXG5cdGZ1bmN0aW9uIGF1dGhvcml6ZSgpIHtcblx0XHRsZXQgdXJsID0gbmV3IFVSTChjb25maWcuaW5zdGFuY2UpO1xuXHRcdHVybC5wYXRobmFtZSA9IFwiL29hdXRoL2F1dGhvcml6ZVwiO1xuXHRcdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY2xpZW50X2lkXCIsIHN0YXRlLmNsaWVudF9pZCk7XG5cdFx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJyZWRpcmVjdF91cmlcIiwgZ2V0Q3VycmVudFVybCgpKTtcblx0XHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInJlc3BvbnNlX3R5cGVcIiwgXCJjb2RlXCIpO1xuXHRcdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwic2NvcGVcIiwgY29uZmlnLnNjb3BlLmpvaW4oXCIgXCIpKTtcblxuXHRcdHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsLmhyZWYpO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBjYWxsYmFjaygpIHtcblx0XHRpZiAoc3RhdGUuYWNjZXNzX3Rva2VuICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuOyAvLyB3ZSdyZSBhbHJlYWR5IGRvbmUgOilcblx0XHR9XG5cdFx0bGV0IHBhcmFtcyA9IChuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbikpLnNlYXJjaFBhcmFtcztcblx0XG5cdFx0bGV0IHRva2VuID0gcGFyYW1zLmdldChcImNvZGVcIik7XG5cdFx0aWYgKHRva2VuICE9IG51bGwpIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiZ290IHRva2VuIGNhbGxiYWNrOlwiLCB0b2tlbik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGF1dGhvcml6ZVRva2VuKHRva2VuKVxuXHRcdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKFwiRXJyb3IgcHJvY2Vzc2luZyBvYXV0aCBjYWxsYmFjazpcIiwgZSk7XG5cdFx0XHRcdGxvZ291dCgpOyAvLyBqdXN0IHRvIGJlIHN1cmVcblx0XHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gYXV0aG9yaXplVG9rZW4odG9rZW4pIHtcblx0XHRsZXQgdXJsID0gbmV3IFVSTChjb25maWcuaW5zdGFuY2UpO1xuXHRcdHVybC5wYXRobmFtZSA9IFwiL29hdXRoL3Rva2VuXCI7XG5cdFx0cmV0dXJuIGZldGNoKHVybC5ocmVmLCB7XG5cdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdFx0fSxcblx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0Y2xpZW50X2lkOiBzdGF0ZS5jbGllbnRfaWQsXG5cdFx0XHRcdGNsaWVudF9zZWNyZXQ6IHN0YXRlLmNsaWVudF9zZWNyZXQsXG5cdFx0XHRcdHJlZGlyZWN0X3VyaTogZ2V0Q3VycmVudFVybCgpLFxuXHRcdFx0XHRncmFudF90eXBlOiBcImF1dGhvcml6YXRpb25fY29kZVwiLFxuXHRcdFx0XHRjb2RlOiB0b2tlblxuXHRcdFx0fSlcblx0XHR9KS50aGVuKChyZXMpID0+IHtcblx0XHRcdGlmIChyZXMuc3RhdHVzICE9IDIwMCkge1xuXHRcdFx0XHR0aHJvdyByZXM7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzLmpzb24oKTtcblx0XHR9KS50aGVuKChqc29uKSA9PiB7XG5cdFx0XHRzdGF0ZS5hY2Nlc3NfdG9rZW4gPSBqc29uLmFjY2Vzc190b2tlbjtcblx0XHRcdHN0b3JlU3RhdGUoKTtcblx0XHRcdHdpbmRvdy5sb2NhdGlvbiA9IGdldEN1cnJlbnRVcmwoKTsgLy8gY2xlYXIgP3Rva2VuPVxuXHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gaXNBdXRob3JpemVkKCkge1xuXHRcdHJldHVybiAoc3RhdGUuYWNjZXNzX3Rva2VuICE9IHVuZGVmaW5lZCk7XG5cdH1cblxuXHRmdW5jdGlvbiBhcGlSZXF1ZXN0KHBhdGgsIG1ldGhvZCwgZGF0YSwgdHlwZT1cImpzb25cIikge1xuXHRcdGlmICghaXNBdXRob3JpemVkKCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vdCBBdXRoZW50aWNhdGVkXCIpO1xuXHRcdH1cblx0XHRsZXQgdXJsID0gbmV3IFVSTChjb25maWcuaW5zdGFuY2UpO1xuXHRcdGxldCBbcCwgc10gPSBwYXRoLnNwbGl0KFwiP1wiKTtcblx0XHR1cmwucGF0aG5hbWUgPSBwO1xuXHRcdHVybC5zZWFyY2ggPSBzO1xuXHRcdGxldCBoZWFkZXJzID0ge1xuXHRcdFx0XCJBdXRob3JpemF0aW9uXCI6IGBCZWFyZXIgJHtzdGF0ZS5hY2Nlc3NfdG9rZW59YFxuXHRcdH07XG5cdFx0bGV0IGJvZHkgPSBkYXRhO1xuXHRcdGlmICh0eXBlID09IFwianNvblwiICYmIGJvZHkgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG5cdFx0XHRib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cdFx0fVxuXHRcdHJldHVybiBmZXRjaCh1cmwuaHJlZiwge1xuXHRcdFx0bWV0aG9kLFxuXHRcdFx0aGVhZGVycyxcblx0XHRcdGJvZHlcblx0XHR9KS50aGVuKChyZXMpID0+IHtcblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChbcmVzLmpzb24oKSwgcmVzXSk7XG5cdFx0fSkudGhlbigoW2pzb24sIHJlc10pID0+IHtcblx0XHRcdGlmIChyZXMuc3RhdHVzICE9IDIwMCkge1xuXHRcdFx0XHRpZiAoanNvbi5lcnJvcikge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihqc29uLmVycm9yKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7cmVzLnN0YXR1c306ICR7cmVzLnN0YXR1c1RleHR9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBqc29uO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gbG9nb3V0KCkge1xuXHRcdGxldCB1cmwgPSBuZXcgVVJMKGNvbmZpZy5pbnN0YW5jZSk7XG5cdFx0dXJsLnBhdGhuYW1lID0gXCIvb2F1dGgvcmV2b2tlXCI7XG5cdFx0cmV0dXJuIGZldGNoKHVybC5ocmVmLCB7XG5cdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdFx0fSxcblx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0Y2xpZW50X2lkOiBzdGF0ZS5jbGllbnRfaWQsXG5cdFx0XHRcdGNsaWVudF9zZWNyZXQ6IHN0YXRlLmNsaWVudF9zZWNyZXQsXG5cdFx0XHRcdHRva2VuOiBzdGF0ZS5hY2Nlc3NfdG9rZW4sXG5cdFx0XHR9KVxuXHRcdH0pLnRoZW4oKHJlcykgPT4ge1xuXHRcdFx0aWYgKHJlcy5zdGF0dXMgIT0gMjAwKSB7XG5cdFx0XHRcdC8vIEdvVG9Tb2NpYWwgZG9lc24ndCBhY3R1YWxseSBpbXBsZW1lbnQgdGhpcyByb3V0ZSB5ZXQsXG5cdFx0XHRcdC8vIHNvIGVycm9yIGlzIHRvIGJlIGV4cGVjdGVkXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXMuanNvbigpO1xuXHRcdH0pLmNhdGNoKCgpID0+IHtcblx0XHRcdC8vIHNlZSBhYm92ZVxuXHRcdH0pLnRoZW4oKCkgPT4ge1xuXHRcdFx0bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJvYXV0aFwiKTtcblx0XHRcdHdpbmRvdy5sb2NhdGlvbiA9IGdldEN1cnJlbnRVcmwoKTtcblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0cmVnaXN0ZXIsIGF1dGhvcml6ZSwgY2FsbGJhY2ssIGlzQXV0aG9yaXplZCwgYXBpUmVxdWVzdCwgbG9nb3V0XG5cdH07XG59O1xuIl19 diff --git a/web/assets/bundled/base.css b/web/assets/bundled/base.css deleted file mode 100644 index ce1dd1e14..000000000 --- a/web/assets/bundled/base.css +++ /dev/null @@ -1,232 +0,0 @@ - -html, body { - padding: 0; - margin: 0; - background: var(--bg_accent); - color: var(--fg); - font-family: sans-serif; -} - -body { - display: grid; - - grid-template-rows: auto 1fr auto; - min-height: 100vh; - line-height: 1.5em; -} - -main { - background: var(--bg); - display: grid; - padding-top: 2rem; - padding-bottom: 2rem; - grid-template-columns: 1fr 50% 1fr; - grid-template-columns: auto min(92%, 90ch) auto; -} - -main .left { - grid-column: 1; - } - -main .right { - grid-column: 3; - } - -main.lightgray { - background: var(--bg); - } - -main > * { - align-self: start; - grid-column: 2; - } - -header { - background: var(--bg_accent); - padding: 2rem 0; - padding-bottom: 0; - display: flex; - flex-wrap: wrap; -} - -header img { - height: 4rem; - padding-left: 2rem; - padding-bottom: 2rem; - } - -header div { - height: 100%; - margin: 0 2rem; - margin-top: -2rem; - flex-grow: 1; - align-self: center; - display: flex; - } - -header div h1 { - align-self: center; - } - -h1 { - /* color: $acc1; */ - margin: 0; - line-height: 2.4rem; -} - -a { - color: var(--acc1); -} - -.button, button { - border-radius: 0.2rem; - background: var(--acc1); - color: var(--fg); - text-decoration: none; - font-size: 1.2rem; - font-weight: bold; - padding: 0.5rem; - border: none; - cursor: pointer; -} - -.button:hover, button:hover { - background: var(--acc2); - } - -.count { - background: var(--bg_accent); - border-radius: 0.3rem; - padding: 0.2rem; -} - -.nounderline { - text-decoration: none; -} - -.accent { - color: var(--acc1); -} - -.logo { - justify-self: center; -} - -.logo img { - height: 30vh; - } - -section.apps { - align-self: start; -} - -section.apps .applist { - display: grid; - grid-template-columns: 1fr 1fr; - grid-gap: 0.5rem; - align-content: start; - } - -section.apps .applist .entry { - display: grid; - grid-template-columns: 30% 1fr; - gap: 0.5rem; - padding: 0.5rem; - background: var(--bg_accent); - border-radius: 0.5rem; - } - -section.apps .applist .entry .logo { - align-self: center; - width: 100%; - -o-object-fit: contain; - object-fit: contain; - flex: 1 1 auto; - } - -section.apps .applist .entry .logo.redraw { - fill: var(--fg); - stroke: var(--fg); - } - -section.apps .applist .entry div { - padding: 1rem 0; - } - -section.apps .applist .entry div h3 { - margin-top: 0; - } - -section.login form { - display: inline-grid; - grid-template-columns: auto 100%; - grid-gap: 0.7rem; - } - -section.login form button { - place-self: center; - grid-column: 2; - } - -section.error { - display: flex; - flex-direction: row; - align-items: center; -} - -section.error span { - font-size: 2em; - } - -section.error pre { - border: 1px solid #ff000080; - margin-left: 1em; - padding: 0 0.7em; - border-radius: 0.5em; - background-color: #ff000010; - font-size: 1.3em; - white-space: pre-wrap; - } - -input, select, textarea { - border: 1px solid var(--fg); - color: var(--fg); - background: var(--bg); - width: 100%; -} - -footer { - align-self: end; - - padding: 2rem; - display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr; -} - -footer a { - font-weight: bold; - } - -@media screen and (orientation: portrait) { - main { - grid-template-columns: 1fr 92% 1fr; - } - - header { - text-align: center; - } - - footer { - margin-top: 2rem; - grid-template-columns: 1fr; - } - - footer div { - margin: 0.3rem 0; - } - - section.apps .applist { - grid-template-columns: 1fr; - } -} - diff --git a/web/assets/bundled/panels-admin-style.css b/web/assets/bundled/panels-admin-style.css deleted file mode 100644 index aebeaaefb..000000000 --- a/web/assets/bundled/panels-admin-style.css +++ /dev/null @@ -1,126 +0,0 @@ - -body { - grid-template-rows: auto 1fr; -} - -.capitalize { - text-transform: capitalize; -} - -section { - margin-bottom: 1rem; -} - -input, select, textarea { - box-sizing: border-box; -} - -section.info form { - grid-template-columns: auto 1fr; - width: calc(100% - 0.35rem); - } - -section.info form input { - width: 100%; - line-height: 1.5rem; - } - -section.info form label, section.info form input { - padding: 0.2rem 0.5rem; - } - -section.info form input[type=checkbox] { - justify-self: start; - width: initial; - } - -section.info form input:-moz-read-only { - border: none; - } - -section.info form input:read-only { - border: none; - } - -section.info form input:invalid { - border-color: red; - } - -section.info textarea { - width: 100%; - height: 8rem; - } - -section.info h1 { - display: flex; - justify-content: space-between; - margin-bottom: 0.5rem; - } - -section.blocks .overflow { - max-height: 80vh; - overflow-y: auto; - } - -section.blocks .blocklist { - display: grid; - grid-template-columns: auto 1fr auto; - grid-gap: 0.35rem 0; - } - -section.blocks .blocklist div { - background: rgb(70, 79, 88); - padding: 0.2rem 0.4rem; - } - -section.blocks .addblock { - display: grid; - grid-template-columns: 1fr auto auto; - grid-gap: 0.35rem; - } - -section.blocks .addblock input, section.blocks .addblock select { - font-size: 1.2rem; - } - -section.blocks .addblock input, section.blocks .addblock select, section.blocks .addblock textarea { - padding: 0.5rem; - } - -section.blocks .addblock div { - grid-column: 1/4; - } - -section.blocks .addblock div.single input { - width: initial; - } - -section.blocks h3 { - margin-bottom: 0; - } - -section.blocks .controls { - display: flex; - gap: 0.5rem; - } - -.error { - font-weight: bold; -} - -.hidden { - display: none; -} - -.notImplemented { - border: 2px solid rgb(70, 79, 88); - background: repeating-linear-gradient( - -45deg, - #525c66, - #525c66 10px, - rgb(70, 79, 88) 10px, - rgb(70, 79, 88) 20px - ) !important; -} - - diff --git a/web/assets/bundled/profile.css b/web/assets/bundled/profile.css deleted file mode 100644 index 2f883306e..000000000 --- a/web/assets/bundled/profile.css +++ /dev/null @@ -1,114 +0,0 @@ - -main { - background: transparent; -} - -.headerimage img { - width: 100%; - height: 15em; - -o-object-fit: cover; - object-fit: cover; - border-radius: 10px; - } - -.profile { - position: relative; - background: color(var(--bg) lightness(-3%)); - padding: 2rem; - display: flex; - flex-wrap: wrap; - justify-content: space-around; - gap: 0.5rem; - margin-bottom: 0.2rem; -} - -.profile .basic { - display: flex; - flex-direction: column; - flex: 1 1 25em; - gap: 0.5rem; - } - -.profile .basic a { - position: relative; - z-index: 1; - color: inherit; - text-decoration: none; - } - -.profile .basic .avatar-container { - position: relative; - width: 100%; - max-width: 25em; - } - -.profile .basic .avatar-container .avatar { - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - } - -.profile .basic .avatar-container .avatar img { - -o-object-fit: cover; - object-fit: cover; - border-radius: 10px; - width: 100%; - height: 100%; - } - -.profile .basic .avatar-container:before { - content: ""; - float: left; - padding-top: 100%; - } - -.profile .basic .displayname { - font-weight: bold; - font-size: 1.6rem; - align-self: start; - } - -.profile .detailed { - display: flex; - flex-direction: column; - flex: 1 1 25em; - } - -.profile .detailed h2 { - margin-top: 0; - } - -.profile .detailed .bio { - margin: 0; - } - -.profile .detailed .bio a { - color: var(--acc1); - text-decoration: underline; - } - -.accountstats { - position: relative; - background: color(var(--bg) lightness(-3%)); - padding: 0.5rem; - display: flex; - flex-wrap: wrap; - justify-content: space-evenly; - gap: 0.5rem; - margin-bottom: 0.2rem; -} - -.accountstats .entry { - background: color(var(--bg) lightness(+3%)); - padding: 0.5rem; - flex-grow: 1; - text-align: center; - } - -footer + div { - /* something weird from the devstack.. */ - display: none; -} - diff --git a/web/assets/bundled/status.css b/web/assets/bundled/status.css deleted file mode 100644 index 87ce2d09e..000000000 --- a/web/assets/bundled/status.css +++ /dev/null @@ -1,238 +0,0 @@ - -main { - background: transparent; - grid-auto-rows: auto; -} - -.thread { - display: flex; - flex-direction: column; -} - -.toot { - position: relative; - background: color(var(--bg) lightness(-3%)); - padding: 2rem; - /* padding-bottom: 0; */ - display: grid; - grid-template-columns: 3.2rem auto 1fr; - -moz-column-gap: 0.5rem; - column-gap: 0.5rem; - margin-bottom: 0.2rem; -} - -.toot a { - position: relative; - z-index: 1; - color: inherit; - text-decoration: none; - } - -.toot .avatar { - grid-row: span 2; - } - -.toot .avatar img { - height: 3.2rem; - width: 3.2rem; - -o-object-fit: cover; - object-fit: cover; - } - -.toot .displayname { - font-weight: bold; - font-size: 1.2rem; - align-self: start; - } - -.toot .username { - color: var(--fg_dark); - justify-self: start; - } - -.toot input.spoiler:checked ~ .content { - display: none; - } - -.toot .spoiler label { - background: var(--acc1); - border-radius: 0.3rem; - padding: 0.3rem; - margin-left: 0.4rem; - position: relative; - z-index: 2; - cursor: pointer; - } - -.toot .text { - margin: 0; - grid-column: span 2; - } - -.toot .text a { - color: var(--acc1); - text-decoration: underline; - } - -.toot .media { - margin-top: 0.6rem; - border-radius: 0.2rem; - grid-column: span 3; - display: grid; - grid-template-columns: 50% 50%; - grid-auto-rows: 10rem; - overflow: hidden; - gap: 0.3rem; - } - -.toot .media a { - position: relative; - } - -.toot .media .no-image-desc { - display: flex; - position: absolute; - bottom: 0.1rem; - right: 0.4rem; - color: white; - background: var(--blue); - padding: 0.2rem 0.4rem; - border-radius: 100%; - z-index: 3; - } - -.toot .media .no-image-desc i.fa { - display: block; - line-height: 1.3rem; - } - -.toot .media .no-image-desc span { - margin-left: 0.3rem; - display: none; - } - -.toot .media .no-image-desc:hover span { - display: block; - } - -.toot .media .no-image-desc:hover { - border-radius: 0.2rem; -} - -.toot .media img { - width: 100%; - height: 100%; - -o-object-fit: cover; - object-fit: cover; - } - -.toot .media.single a { - grid-column: span 2; - } - -.toot .media.odd a:first-child, .toot .media.double a { - grid-row: span 2; - } - -.toot .info { - display: none; - } - -.toot .info div { - position: relative; - padding-right: 1.3rem; - } - -.toot .info .stats { - display: flex; - } - -.toot .info { - - color: #b0b0b5; - grid-column: span 3; - margin-top: 0.5rem; - flex-wrap: wrap; -} - -.toot .info div.stats::after { - display: none; - } - -.toot .info div::after { - --size: 0.25rem; - display: block; - background: var(--fg_dark); - height: var(--size); - width: var(--size); - content: ""; - position: absolute; - top: calc((1.5rem - var(--size)) / 2); - right: 0.55rem; - border-radius: 1rem; - } - -.toot .info div:last-child::after { - display: none; - } - -.toot .info div:last-child { - margin-right: 0; -} - -.toot .toot-link { - top: 0; - right: 0; - bottom: 0; - left: 0; - overflow: hidden; - text-indent: 100%; - white-space: nowrap; - - position: absolute; - z-index: 0; - } - -.toot { - - --border-radius: 0.3rem; -} - -.toot:first-child { - /* top left, top right */ - border-radius: var(--border)-radius var(--border)-radius 0 0; - } - -.toot:last-child { - /* bottom left, bottom right */ - border-radius: 0 0 var(--border)-radius var(--border)-radius; - padding-bottom: 1.5rem; - } - -.toot.expanded { - background: var(--bg); - padding-bottom: 1.5rem; - } - -.toot.expanded .displayname { - grid-column: span 2; - } - -.toot.expanded .text { - grid-column: span 3; - grid-row: span 1; - margin-top: 0.3rem; - } - -.toot.expanded .info { - display: flex; - } - -.toot.expanded .media { - grid-auto-rows: 1fr; - max-height: 120rem; - } - -footer + div { /* something weird from the devstack.. */ - display: none; -} diff --git a/web/assets/bundled/user-panel.js b/web/assets/bundled/user-panel.js deleted file mode 100644 index 52effe321..000000000 --- a/web/assets/bundled/user-panel.js +++ /dev/null @@ -1,18 +0,0 @@ -require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o - - + + {{range .stylesheets}} {{end}}