From cadd58187a656de6882c4c181fa609eb6e796eeb Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 18 Aug 2023 17:03:38 +0100 Subject: [PATCH 1/4] Initial work on adding passkeys Mostly starting to get some javascript set up --- .editorconfig | 3 + .eslintrc.yml | 3 +- .stylelintrc | 6 +- public/assets/app.js | 6 +- public/assets/app.js.br | Bin 16618 -> 16895 bytes resources/css/app.css | 12 +- resources/css/code.css | 2 +- resources/css/colours.css | 18 +-- resources/css/content.css | 55 ++++--- resources/css/fonts.css | 8 +- resources/css/h-card.css | 56 ++++---- resources/css/layout.css | 26 ++-- resources/css/posse.css | 3 - resources/css/variables.css | 36 ++--- resources/js/app.js | 9 ++ resources/js/auth.js | 36 +++++ resources/views/admin/welcome.blade.php | 5 + webpack.config.js | 184 ++++++++++++------------ 18 files changed, 256 insertions(+), 212 deletions(-) delete mode 100644 resources/css/posse.css create mode 100644 resources/js/auth.js diff --git a/.editorconfig b/.editorconfig index 8f0de65c..0b5d680f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,6 +8,9 @@ indent_style = space insert_final_newline = true trim_trailing_whitespace = true +[*.{js,css}] +indent_size = 2 + [*.md] trim_trailing_whitespace = false diff --git a/.eslintrc.yml b/.eslintrc.yml index a16298c1..d3156688 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -1,5 +1,6 @@ parserOptions: sourceType: 'module' + ecmaVersion: 8 extends: 'eslint:recommended' env: browser: true @@ -9,7 +10,7 @@ ignorePatterns: rules: indent: - error - - 4 + - 2 linebreak-style: - error - unix diff --git a/.stylelintrc b/.stylelintrc index c4ff038c..a9a9091b 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -1,7 +1,3 @@ { - "extends": ["stylelint-config-standard"], - "rules": { - "indentation": 4, - "import-notation": "string" - } + "extends": ["stylelint-config-standard"] } diff --git a/public/assets/app.js b/public/assets/app.js index b2c27953..e8471e65 100644 --- a/public/assets/app.js +++ b/public/assets/app.js @@ -16,9 +16,7 @@ \*****************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _css_app_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../css/app.css */ "./resources/css/app.css"); - +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _css_app_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../css/app.css */ \"./resources/css/app.css\");\n\n\n// import { Auth } from './auth.js';\n//\n// let auth = new Auth();\n\n// auth.createCredentials().then((credentials) => {\n// // eslint-disable-next-line no-console\n// console.log(credentials);\n// });//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYXBwLmpzIiwibWFwcGluZ3MiOiI7O0FBQXdCOztBQUV4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qYnVrLWZyb250ZW5kLy4vcmVzb3VyY2VzL2pzL2FwcC5qcz82ZDQwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi4vY3NzL2FwcC5jc3MnO1xuXG4vLyBpbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi9hdXRoLmpzJztcbi8vXG4vLyBsZXQgYXV0aCA9IG5ldyBBdXRoKCk7XG5cbi8vIGF1dGguY3JlYXRlQ3JlZGVudGlhbHMoKS50aGVuKChjcmVkZW50aWFscykgPT4ge1xuLy8gICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuLy8gICBjb25zb2xlLmxvZyhjcmVkZW50aWFscyk7XG4vLyB9KTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/app.js\n"); /***/ }), @@ -28,7 +26,7 @@ __webpack_require__.r(__webpack_exports__); \***********************************************************************************************************************************************************************/ /***/ (function(module, __webpack_exports__, __webpack_require__) { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"./node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--font-family-headings:\\\"Archer SSm A\\\",\\\"Archer SSm B\\\",serif;--font-family-body:\\\"Verlag A\\\",\\\"Verlag B\\\",sans-serif;--font-family-monospace:\\\"Operator Mono SSm A\\\",\\\"Operator Mono SSm B\\\",monospace;--font-size-sm:0.75rem;--font-size-base:1rem;--font-size-md:1.25rem;--font-size-lg:1.5rem;--font-size-xl:1.75rem;--font-size-xxl:2rem;--font-size-xxxl:2.25rem;--color-primary:#334700;--color-secondary:#e3ffb7;--color-link:#00649e;--color-link-visited:#bc7aff;--color-primary-shadow:rgba(16,25,0,.4)}@supports (color:color(display-p3 0 0 0)){:root{--color-primary:color(display-p3 0.21567 0.27838 0.03615);--color-secondary:color(display-p3 0.91016 0.99842 0.74082);--color-link:color(display-p3 0.01045 0.38351 0.63618);--color-link-visited:color(display-p3 0.70467 0.47549 0.99958);--color-primary-shadow:color(display-p3 0.06762 0.09646 0.00441/0.4)}}@supports (color:oklch(0% 0 0)){:root{--color-primary:oklch(36.8% 0.1 125.505);--color-secondary:oklch(96.3% 0.1 125.505);--color-link:oklch(48.09% 0.146 241.41);--color-link-visited:oklch(70.44% 0.21 304.41);--color-primary-shadow:oklch(19.56% 0.054 125.505/40%)}}body{background-color:var(--color-secondary);color:var(--color-primary);font-family:var(--font-family-body);font-size:var(--font-size-md)}code{font-family:var(--font-family-monospace)}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-headings)}.grid{display:grid;grid-template-columns:5vw 1fr 5vw;grid-template-rows:-webkit-min-content 1fr -webkit-min-content;grid-template-rows:min-content 1fr min-content;row-gap:1rem}#site-header{grid-column:2/3;grid-row:1/2}main{grid-row:2/3}footer,main{grid-column:2/3}footer{grid-row:3/4}footer .iwc-logo{max-width:85vw}a{color:var(--color-link)}a:visited{color:var(--color-link-visited)}#site-header a:visited{color:var(--color-link)}.hljs{border-radius:.5rem}.p-bridgy-twitter-content{display:none}.h-card .hovercard{-webkit-box-orient:vertical;-webkit-box-direction:normal;background-color:var(--color-secondary);border-radius:1rem;-webkit-box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);display:none;-ms-flex-direction:column;flex-direction:column;gap:.5rem;opacity:0;padding:1rem;position:absolute;-webkit-transition:opacity .5s ease-in-out;transition:opacity .5s ease-in-out;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;z-index:100}.h-card .hovercard .u-photo{max-width:6rem}.h-card .hovercard .social-icon{height:1rem;width:1rem}.h-card:hover .hovercard{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1}.h-entry{-webkit-border-start:1px solid var(--color-primary);-webkit-padding-start:.5rem;border-inline-start:1px solid var(--color-primary);padding-inline-start:.5rem}.h-entry .reply-to{font-style:italic}.h-entry .post-info a{text-decoration:none}.h-entry .note-metadata{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;gap:1rem}.h-entry .note-metadata .syndication-links{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.h-entry .note-metadata .syndication-links a{text-decoration:none}.h-entry .note-metadata .syndication-links a svg{height:1rem;width:1rem}\", \"\",{\"version\":3,\"sources\":[\"webpack://./resources/css/variables.css\",\"webpack://./resources/css/fonts.css\",\"webpack://./resources/css/colours.css\",\"webpack://./resources/css/layout.css\",\"webpack://./resources/css/code.css\",\"webpack://./resources/css/posse.css\",\"webpack://./resources/css/h-card.css\",\"webpack://./resources/css/content.css\"],\"names\":[],\"mappings\":\"AAAA,MAEI,0DAA6D,CAC7D,mDAAsD,CACtD,6EAAgF,CAGhF,sBAAuB,CACvB,qBAAsB,CACtB,sBAAuB,CACvB,qBAAsB,CACtB,sBAAuB,CACvB,oBAAqB,CACrB,wBAAyB,CAGzB,uBAAyC,CACzC,yBAA2C,CAC3C,oBAAwC,CACxC,4BAA+C,CAC/C,uCACJ,CArBA,0CAAA,MAgBI,yDAAyC,CACzC,2DAA2C,CAC3C,sDAAwC,CACxC,8DAA+C,CAC/C,oEACJ,CAAA,CArBA,gCAAA,MAgBI,wCAAyC,CACzC,0CAA2C,CAC3C,uCAAwC,CACxC,8CAA+C,CAC/C,sDACJ,CAAA,CCrBA,KCCI,uCAAwC,CACxC,0BAA2B,CDD3B,mCAAoC,CACpC,6BACJ,CAEA,KACI,wCACJ,CAEA,kBAMI,uCACJ,CEhBA,MACI,YAAa,CACb,iCAAkC,CAClC,8DAA+C,CAA/C,8CAA+C,CAC/C,YACJ,CAEA,aACI,eAAkB,CAClB,YACJ,CAEA,KAEI,YACJ,CAEA,YAJI,eAWJ,CAPA,OAEI,YAKJ,CAHI,iBACI,cACJ,CDlBJ,EACI,uBAKJ,CAHI,UACI,+BACJ,CAIA,uBACI,uBACJ,CEhBJ,MACI,mBACJ,CCFA,0BACI,YACJ,CCDI,mBAWI,2BAAsB,CAAtB,4BAAsB,CAJtB,uCAAwC,CAFxC,kBAAmB,CACnB,kEAA2D,CAA3D,0DAA2D,CAL3D,YAAa,CAUb,yBAAsB,CAAtB,qBAAsB,CACtB,SAAU,CAFV,SAAU,CANV,YAAa,CAFb,iBAAkB,CAOlB,0CAAoC,CAApC,kCAAoC,CADpC,yBAAkB,CAAlB,sBAAkB,CAAlB,iBAAkB,CALlB,WAmBJ,CARI,4BACI,cACJ,CAEA,gCAEI,WAAY,CADZ,UAEJ,CAIA,yBACI,mBAAa,CAAb,mBAAa,CAAb,YAAa,CACb,SACJ,CC1BR,SACI,mDAAmD,CACnD,2BAA2B,CAD3B,kDAAmD,CACnD,0BA8BJ,CA5BI,mBACI,iBACJ,CAGI,sBACI,oBACJ,CAGJ,wBAEI,6BAAmB,CAAnB,4BAAmB,CADnB,mBAAa,CAAb,mBAAa,CAAb,YAAa,CACb,sBAAmB,CAAnB,kBAAmB,CACnB,QAcJ,CAZI,2CACI,6BAAmB,CAAnB,4BAAmB,CAAnB,sBAAmB,CAAnB,kBAUJ,CARI,6CACI,oBAMJ,CAJI,iDAEI,WAAY,CADZ,UAEJ\",\"sourcesContent\":[\":root {\\n /* Font Family */\\n --font-family-headings: \\\"Archer SSm A\\\", \\\"Archer SSm B\\\", serif;\\n --font-family-body: \\\"Verlag A\\\", \\\"Verlag B\\\", sans-serif;\\n --font-family-monospace: \\\"Operator Mono SSm A\\\", \\\"Operator Mono SSm B\\\", monospace;\\n\\n /* Font Size */\\n --font-size-sm: 0.75rem; /* 12px */\\n --font-size-base: 1rem; /* 16px, base */\\n --font-size-md: 1.25rem; /* 20px */\\n --font-size-lg: 1.5rem; /* 24px */\\n --font-size-xl: 1.75rem; /* 28px */\\n --font-size-xxl: 2rem; /* 32px */\\n --font-size-xxxl: 2.25rem; /* 36px */\\n\\n /* Colours */\\n --color-primary: oklch(36.8% 0.1 125.505);\\n --color-secondary: oklch(96.3% 0.1 125.505);\\n --color-link: oklch(48.09% 0.146 241.41);\\n --color-link-visited: oklch(70.44% 0.21 304.41);\\n --color-primary-shadow: oklch(19.56% 0.054 125.505 / 40%);\\n}\\n\",\"body {\\n font-family: var(--font-family-body);\\n font-size: var(--font-size-md);\\n}\\n\\ncode {\\n font-family: var(--font-family-monospace);\\n}\\n\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n font-family: var(--font-family-headings);\\n}\\n\",\"body {\\n background-color: var(--color-secondary);\\n color: var(--color-primary);\\n}\\n\\na {\\n color: var(--color-link);\\n\\n &:visited {\\n color: var(--color-link-visited);\\n }\\n}\\n\\n#site-header {\\n & a:visited {\\n color: var(--color-link);\\n }\\n}\\n\",\".grid {\\n display: grid;\\n grid-template-columns: 5vw 1fr 5vw;\\n grid-template-rows: min-content 1fr min-content;\\n row-gap: 1rem;\\n}\\n\\n#site-header {\\n grid-column: 2 / 3;\\n grid-row: 1 / 2;\\n}\\n\\nmain {\\n grid-column: 2 / 3;\\n grid-row: 2 / 3;\\n}\\n\\nfooter {\\n grid-column: 2 / 3;\\n grid-row: 3 / 4;\\n\\n & .iwc-logo {\\n max-width: 85vw;\\n }\\n}\\n\",\".hljs {\\n border-radius: .5rem;\\n}\\n\",\".p-bridgy-twitter-content {\\n display: none;\\n}\\n\",\".h-card {\\n & .hovercard {\\n display: none;\\n position: absolute;\\n z-index: 100;\\n padding: 1rem;\\n border-radius: 1rem;\\n box-shadow: 0 .5rem .5rem .5rem var(--color-primary-shadow);\\n background-color: var(--color-secondary);\\n width: fit-content;\\n transition: opacity 0.5s ease-in-out;\\n opacity: 0;\\n flex-direction: column;\\n gap: .5rem;\\n\\n & .u-photo {\\n max-width: 6rem;\\n }\\n\\n & .social-icon {\\n width: 1rem;\\n height: 1rem;\\n }\\n }\\n\\n &:hover {\\n & .hovercard {\\n display: flex;\\n opacity: 1;\\n }\\n }\\n}\\n\",\"@import \\\"posse.css\\\";\\n@import \\\"h-card.css\\\";\\n\\n.h-entry {\\n border-inline-start: 1px solid var(--color-primary);\\n padding-inline-start: .5rem;\\n\\n & .reply-to {\\n font-style: italic;\\n }\\n\\n & .post-info {\\n & a {\\n text-decoration: none;\\n }\\n }\\n\\n & .note-metadata {\\n display: flex;\\n flex-direction: row;\\n gap: 1rem;\\n\\n & .syndication-links {\\n flex-flow: row wrap;\\n\\n & a {\\n text-decoration: none;\\n\\n & svg {\\n width: 1rem;\\n height: 1rem;\\n }\\n }\\n }\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ __webpack_exports__[\"default\"] = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cnVsZVNldFsxXS5ydWxlc1sxXS51c2VbMV0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P3J1bGVTZXRbMV0ucnVsZXNbMV0udXNlWzJdIS4vcmVzb3VyY2VzL2Nzcy9hcHAuY3NzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDNkc7QUFDakI7QUFDNUYsOEJBQThCLG1GQUEyQixDQUFDLDRGQUFxQztBQUMvRjtBQUNBLGdEQUFnRCwrREFBK0Qsd0RBQXdELGtGQUFrRix1QkFBdUIsc0JBQXNCLHVCQUF1QixzQkFBc0IsdUJBQXVCLHFCQUFxQix5QkFBeUIsd0JBQXdCLDBCQUEwQixxQkFBcUIsNkJBQTZCLHdDQUF3QywwQ0FBMEMsTUFBTSwwREFBMEQsNERBQTRELHVEQUF1RCwrREFBK0Qsc0VBQXNFLGdDQUFnQyxNQUFNLHlDQUF5QywyQ0FBMkMsd0NBQXdDLCtDQUErQyx3REFBd0QsS0FBSyx3Q0FBd0MsMkJBQTJCLG9DQUFvQyw4QkFBOEIsS0FBSyx5Q0FBeUMsa0JBQWtCLHdDQUF3QyxNQUFNLGFBQWEsa0NBQWtDLCtEQUErRCwrQ0FBK0MsYUFBYSxhQUFhLGdCQUFnQixhQUFhLEtBQUssYUFBYSxZQUFZLGdCQUFnQixPQUFPLGFBQWEsaUJBQWlCLGVBQWUsRUFBRSx3QkFBd0IsVUFBVSxnQ0FBZ0MsdUJBQXVCLHdCQUF3QixNQUFNLG9CQUFvQiwwQkFBMEIsYUFBYSxtQkFBbUIsNEJBQTRCLDZCQUE2Qix3Q0FBd0MsbUJBQW1CLG1FQUFtRSwyREFBMkQsYUFBYSwwQkFBMEIsc0JBQXNCLFVBQVUsVUFBVSxhQUFhLGtCQUFrQiwyQ0FBMkMsbUNBQW1DLDBCQUEwQix1QkFBdUIsa0JBQWtCLFlBQVksNEJBQTRCLGVBQWUsZ0NBQWdDLFlBQVksV0FBVyx5QkFBeUIsb0JBQW9CLG9CQUFvQixhQUFhLFVBQVUsU0FBUyxvREFBb0QsNEJBQTRCLG1EQUFtRCwyQkFBMkIsbUJBQW1CLGtCQUFrQixzQkFBc0IscUJBQXFCLHdCQUF3Qiw4QkFBOEIsNkJBQTZCLG9CQUFvQixvQkFBb0IsYUFBYSx1QkFBdUIsbUJBQW1CLFNBQVMsMkNBQTJDLDhCQUE4Qiw2QkFBNkIsdUJBQXVCLG1CQUFtQiw2Q0FBNkMscUJBQXFCLGlEQUFpRCxZQUFZLFdBQVcsT0FBTyw0cERBQTRwRCwrRkFBK0YsaUVBQWlFLDJGQUEyRix3REFBd0QsMkNBQTJDLGlEQUFpRCwyQ0FBMkMsMkNBQTJDLDJDQUEyQywyQ0FBMkMsK0VBQStFLGtEQUFrRCwrQ0FBK0Msc0RBQXNELGdFQUFnRSxHQUFHLFdBQVcsMkNBQTJDLHFDQUFxQyxHQUFHLFVBQVUsZ0RBQWdELEdBQUcsaUNBQWlDLCtDQUErQyxHQUFHLFdBQVcsK0NBQStDLGtDQUFrQyxHQUFHLE9BQU8sK0JBQStCLG1CQUFtQiwyQ0FBMkMsT0FBTyxHQUFHLGtCQUFrQixtQkFBbUIsbUNBQW1DLE9BQU8sR0FBRyxZQUFZLG9CQUFvQix5Q0FBeUMsc0RBQXNELG9CQUFvQixHQUFHLGtCQUFrQix5QkFBeUIsc0JBQXNCLEdBQUcsVUFBVSx5QkFBeUIsc0JBQXNCLEdBQUcsWUFBWSx5QkFBeUIsc0JBQXNCLHFCQUFxQiwwQkFBMEIsT0FBTyxHQUFHLFlBQVksMkJBQTJCLEdBQUcsZ0NBQWdDLG9CQUFvQixHQUFHLGNBQWMsb0JBQW9CLHdCQUF3Qiw2QkFBNkIsdUJBQXVCLHdCQUF3Qiw4QkFBOEIsc0VBQXNFLG1EQUFtRCw2QkFBNkIsK0NBQStDLHFCQUFxQixpQ0FBaUMscUJBQXFCLHdCQUF3Qiw4QkFBOEIsV0FBVyw0QkFBNEIsMEJBQTBCLDJCQUEyQixXQUFXLE9BQU8saUJBQWlCLHdCQUF3Qiw0QkFBNEIseUJBQXlCLFdBQVcsT0FBTyxHQUFHLDJCQUEyQix5QkFBeUIsY0FBYywwREFBMEQsa0NBQWtDLHFCQUFxQiw2QkFBNkIsT0FBTyxzQkFBc0IsZUFBZSxvQ0FBb0MsV0FBVyxPQUFPLDBCQUEwQix3QkFBd0IsOEJBQThCLG9CQUFvQixrQ0FBa0Msa0NBQWtDLHFCQUFxQix3Q0FBd0MsMkJBQTJCLGtDQUFrQyxtQ0FBbUMsbUJBQW1CLGVBQWUsV0FBVyxPQUFPLEdBQUcscUJBQXFCO0FBQ3RwUTtBQUNBLCtEQUFlLHVCQUF1QixFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vamJ1ay1mcm9udGVuZC8uL3Jlc291cmNlcy9jc3MvYXBwLmNzcz8wYmExIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiOnJvb3R7LS1mb250LWZhbWlseS1oZWFkaW5nczpcXFwiQXJjaGVyIFNTbSBBXFxcIixcXFwiQXJjaGVyIFNTbSBCXFxcIixzZXJpZjstLWZvbnQtZmFtaWx5LWJvZHk6XFxcIlZlcmxhZyBBXFxcIixcXFwiVmVybGFnIEJcXFwiLHNhbnMtc2VyaWY7LS1mb250LWZhbWlseS1tb25vc3BhY2U6XFxcIk9wZXJhdG9yIE1vbm8gU1NtIEFcXFwiLFxcXCJPcGVyYXRvciBNb25vIFNTbSBCXFxcIixtb25vc3BhY2U7LS1mb250LXNpemUtc206MC43NXJlbTstLWZvbnQtc2l6ZS1iYXNlOjFyZW07LS1mb250LXNpemUtbWQ6MS4yNXJlbTstLWZvbnQtc2l6ZS1sZzoxLjVyZW07LS1mb250LXNpemUteGw6MS43NXJlbTstLWZvbnQtc2l6ZS14eGw6MnJlbTstLWZvbnQtc2l6ZS14eHhsOjIuMjVyZW07LS1jb2xvci1wcmltYXJ5OiMzMzQ3MDA7LS1jb2xvci1zZWNvbmRhcnk6I2UzZmZiNzstLWNvbG9yLWxpbms6IzAwNjQ5ZTstLWNvbG9yLWxpbmstdmlzaXRlZDojYmM3YWZmOy0tY29sb3ItcHJpbWFyeS1zaGFkb3c6cmdiYSgxNiwyNSwwLC40KX1Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yKGRpc3BsYXktcDMgMCAwIDApKXs6cm9vdHstLWNvbG9yLXByaW1hcnk6Y29sb3IoZGlzcGxheS1wMyAwLjIxNTY3IDAuMjc4MzggMC4wMzYxNSk7LS1jb2xvci1zZWNvbmRhcnk6Y29sb3IoZGlzcGxheS1wMyAwLjkxMDE2IDAuOTk4NDIgMC43NDA4Mik7LS1jb2xvci1saW5rOmNvbG9yKGRpc3BsYXktcDMgMC4wMTA0NSAwLjM4MzUxIDAuNjM2MTgpOy0tY29sb3ItbGluay12aXNpdGVkOmNvbG9yKGRpc3BsYXktcDMgMC43MDQ2NyAwLjQ3NTQ5IDAuOTk5NTgpOy0tY29sb3ItcHJpbWFyeS1zaGFkb3c6Y29sb3IoZGlzcGxheS1wMyAwLjA2NzYyIDAuMDk2NDYgMC4wMDQ0MS8wLjQpfX1Ac3VwcG9ydHMgKGNvbG9yOm9rbGNoKDAlIDAgMCkpezpyb290ey0tY29sb3ItcHJpbWFyeTpva2xjaCgzNi44JSAwLjEgMTI1LjUwNSk7LS1jb2xvci1zZWNvbmRhcnk6b2tsY2goOTYuMyUgMC4xIDEyNS41MDUpOy0tY29sb3ItbGluazpva2xjaCg0OC4wOSUgMC4xNDYgMjQxLjQxKTstLWNvbG9yLWxpbmstdmlzaXRlZDpva2xjaCg3MC40NCUgMC4yMSAzMDQuNDEpOy0tY29sb3ItcHJpbWFyeS1zaGFkb3c6b2tsY2goMTkuNTYlIDAuMDU0IDEyNS41MDUvNDAlKX19Ym9keXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNvbG9yLXNlY29uZGFyeSk7Y29sb3I6dmFyKC0tY29sb3ItcHJpbWFyeSk7Zm9udC1mYW1pbHk6dmFyKC0tZm9udC1mYW1pbHktYm9keSk7Zm9udC1zaXplOnZhcigtLWZvbnQtc2l6ZS1tZCl9Y29kZXtmb250LWZhbWlseTp2YXIoLS1mb250LWZhbWlseS1tb25vc3BhY2UpfWgxLGgyLGgzLGg0LGg1LGg2e2ZvbnQtZmFtaWx5OnZhcigtLWZvbnQtZmFtaWx5LWhlYWRpbmdzKX0uZ3JpZHtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjV2dyAxZnIgNXZ3O2dyaWQtdGVtcGxhdGUtcm93czotd2Via2l0LW1pbi1jb250ZW50IDFmciAtd2Via2l0LW1pbi1jb250ZW50O2dyaWQtdGVtcGxhdGUtcm93czptaW4tY29udGVudCAxZnIgbWluLWNvbnRlbnQ7cm93LWdhcDoxcmVtfSNzaXRlLWhlYWRlcntncmlkLWNvbHVtbjoyLzM7Z3JpZC1yb3c6MS8yfW1haW57Z3JpZC1yb3c6Mi8zfWZvb3RlcixtYWlue2dyaWQtY29sdW1uOjIvM31mb290ZXJ7Z3JpZC1yb3c6My80fWZvb3RlciAuaXdjLWxvZ297bWF4LXdpZHRoOjg1dnd9YXtjb2xvcjp2YXIoLS1jb2xvci1saW5rKX1hOnZpc2l0ZWR7Y29sb3I6dmFyKC0tY29sb3ItbGluay12aXNpdGVkKX0jc2l0ZS1oZWFkZXIgYTp2aXNpdGVke2NvbG9yOnZhcigtLWNvbG9yLWxpbmspfS5obGpze2JvcmRlci1yYWRpdXM6LjVyZW19LnAtYnJpZGd5LXR3aXR0ZXItY29udGVudHtkaXNwbGF5Om5vbmV9LmgtY2FyZCAuaG92ZXJjYXJkey13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsO2JhY2tncm91bmQtY29sb3I6dmFyKC0tY29sb3Itc2Vjb25kYXJ5KTtib3JkZXItcmFkaXVzOjFyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgLjVyZW0gLjVyZW0gLjVyZW0gdmFyKC0tY29sb3ItcHJpbWFyeS1zaGFkb3cpO2JveC1zaGFkb3c6MCAuNXJlbSAuNXJlbSAuNXJlbSB2YXIoLS1jb2xvci1wcmltYXJ5LXNoYWRvdyk7ZGlzcGxheTpub25lOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDouNXJlbTtvcGFjaXR5OjA7cGFkZGluZzoxcmVtO3Bvc2l0aW9uOmFic29sdXRlOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOm9wYWNpdHkgLjVzIGVhc2UtaW4tb3V0O3dpZHRoOi13ZWJraXQtZml0LWNvbnRlbnQ7d2lkdGg6LW1vei1maXQtY29udGVudDt3aWR0aDpmaXQtY29udGVudDt6LWluZGV4OjEwMH0uaC1jYXJkIC5ob3ZlcmNhcmQgLnUtcGhvdG97bWF4LXdpZHRoOjZyZW19LmgtY2FyZCAuaG92ZXJjYXJkIC5zb2NpYWwtaWNvbntoZWlnaHQ6MXJlbTt3aWR0aDoxcmVtfS5oLWNhcmQ6aG92ZXIgLmhvdmVyY2FyZHtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4O29wYWNpdHk6MX0uaC1lbnRyeXstd2Via2l0LWJvcmRlci1zdGFydDoxcHggc29saWQgdmFyKC0tY29sb3ItcHJpbWFyeSk7LXdlYmtpdC1wYWRkaW5nLXN0YXJ0Oi41cmVtO2JvcmRlci1pbmxpbmUtc3RhcnQ6MXB4IHNvbGlkIHZhcigtLWNvbG9yLXByaW1hcnkpO3BhZGRpbmctaW5saW5lLXN0YXJ0Oi41cmVtfS5oLWVudHJ5IC5yZXBseS10b3tmb250LXN0eWxlOml0YWxpY30uaC1lbnRyeSAucG9zdC1pbmZvIGF7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LmgtZW50cnkgLm5vdGUtbWV0YWRhdGF7LXdlYmtpdC1ib3gtb3JpZW50Omhvcml6b250YWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC1kaXJlY3Rpb246cm93O2dhcDoxcmVtfS5oLWVudHJ5IC5ub3RlLW1ldGFkYXRhIC5zeW5kaWNhdGlvbi1saW5rc3std2Via2l0LWJveC1vcmllbnQ6aG9yaXpvbnRhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsOy1tcy1mbGV4LWZsb3c6cm93IHdyYXA7ZmxleC1mbG93OnJvdyB3cmFwfS5oLWVudHJ5IC5ub3RlLW1ldGFkYXRhIC5zeW5kaWNhdGlvbi1saW5rcyBhe3RleHQtZGVjb3JhdGlvbjpub25lfS5oLWVudHJ5IC5ub3RlLW1ldGFkYXRhIC5zeW5kaWNhdGlvbi1saW5rcyBhIHN2Z3toZWlnaHQ6MXJlbTt3aWR0aDoxcmVtfVwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3Jlc291cmNlcy9jc3MvdmFyaWFibGVzLmNzc1wiLFwid2VicGFjazovLy4vcmVzb3VyY2VzL2Nzcy9mb250cy5jc3NcIixcIndlYnBhY2s6Ly8uL3Jlc291cmNlcy9jc3MvY29sb3Vycy5jc3NcIixcIndlYnBhY2s6Ly8uL3Jlc291cmNlcy9jc3MvbGF5b3V0LmNzc1wiLFwid2VicGFjazovLy4vcmVzb3VyY2VzL2Nzcy9jb2RlLmNzc1wiLFwid2VicGFjazovLy4vcmVzb3VyY2VzL2Nzcy9wb3NzZS5jc3NcIixcIndlYnBhY2s6Ly8uL3Jlc291cmNlcy9jc3MvaC1jYXJkLmNzc1wiLFwid2VicGFjazovLy4vcmVzb3VyY2VzL2Nzcy9jb250ZW50LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxNQUVJLDBEQUE2RCxDQUM3RCxtREFBc0QsQ0FDdEQsNkVBQWdGLENBR2hGLHNCQUF1QixDQUN2QixxQkFBc0IsQ0FDdEIsc0JBQXVCLENBQ3ZCLHFCQUFzQixDQUN0QixzQkFBdUIsQ0FDdkIsb0JBQXFCLENBQ3JCLHdCQUF5QixDQUd6Qix1QkFBeUMsQ0FDekMseUJBQTJDLENBQzNDLG9CQUF3QyxDQUN4Qyw0QkFBK0MsQ0FDL0MsdUNBQ0osQ0FyQkEsMENBQUEsTUFnQkkseURBQXlDLENBQ3pDLDJEQUEyQyxDQUMzQyxzREFBd0MsQ0FDeEMsOERBQStDLENBQy9DLG9FQUNKLENBQUEsQ0FyQkEsZ0NBQUEsTUFnQkksd0NBQXlDLENBQ3pDLDBDQUEyQyxDQUMzQyx1Q0FBd0MsQ0FDeEMsOENBQStDLENBQy9DLHNEQUNKLENBQUEsQ0NyQkEsS0NDSSx1Q0FBd0MsQ0FDeEMsMEJBQTJCLENERDNCLG1DQUFvQyxDQUNwQyw2QkFDSixDQUVBLEtBQ0ksd0NBQ0osQ0FFQSxrQkFNSSx1Q0FDSixDRWhCQSxNQUNJLFlBQWEsQ0FDYixpQ0FBa0MsQ0FDbEMsOERBQStDLENBQS9DLDhDQUErQyxDQUMvQyxZQUNKLENBRUEsYUFDSSxlQUFrQixDQUNsQixZQUNKLENBRUEsS0FFSSxZQUNKLENBRUEsWUFKSSxlQVdKLENBUEEsT0FFSSxZQUtKLENBSEksaUJBQ0ksY0FDSixDRGxCSixFQUNJLHVCQUtKLENBSEksVUFDSSwrQkFDSixDQUlBLHVCQUNJLHVCQUNKLENFaEJKLE1BQ0ksbUJBQ0osQ0NGQSwwQkFDSSxZQUNKLENDREksbUJBV0ksMkJBQXNCLENBQXRCLDRCQUFzQixDQUp0Qix1Q0FBd0MsQ0FGeEMsa0JBQW1CLENBQ25CLGtFQUEyRCxDQUEzRCwwREFBMkQsQ0FMM0QsWUFBYSxDQVViLHlCQUFzQixDQUF0QixxQkFBc0IsQ0FDdEIsU0FBVSxDQUZWLFNBQVUsQ0FOVixZQUFhLENBRmIsaUJBQWtCLENBT2xCLDBDQUFvQyxDQUFwQyxrQ0FBb0MsQ0FEcEMseUJBQWtCLENBQWxCLHNCQUFrQixDQUFsQixpQkFBa0IsQ0FMbEIsV0FtQkosQ0FSSSw0QkFDSSxjQUNKLENBRUEsZ0NBRUksV0FBWSxDQURaLFVBRUosQ0FJQSx5QkFDSSxtQkFBYSxDQUFiLG1CQUFhLENBQWIsWUFBYSxDQUNiLFNBQ0osQ0MxQlIsU0FDSSxtREFBbUQsQ0FDbkQsMkJBQTJCLENBRDNCLGtEQUFtRCxDQUNuRCwwQkE4QkosQ0E1QkksbUJBQ0ksaUJBQ0osQ0FHSSxzQkFDSSxvQkFDSixDQUdKLHdCQUVJLDZCQUFtQixDQUFuQiw0QkFBbUIsQ0FEbkIsbUJBQWEsQ0FBYixtQkFBYSxDQUFiLFlBQWEsQ0FDYixzQkFBbUIsQ0FBbkIsa0JBQW1CLENBQ25CLFFBY0osQ0FaSSwyQ0FDSSw2QkFBbUIsQ0FBbkIsNEJBQW1CLENBQW5CLHNCQUFtQixDQUFuQixrQkFVSixDQVJJLDZDQUNJLG9CQU1KLENBSkksaURBRUksV0FBWSxDQURaLFVBRUpcIixcInNvdXJjZXNDb250ZW50XCI6W1wiOnJvb3Qge1xcbiAgICAvKiBGb250IEZhbWlseSAqL1xcbiAgICAtLWZvbnQtZmFtaWx5LWhlYWRpbmdzOiBcXFwiQXJjaGVyIFNTbSBBXFxcIiwgXFxcIkFyY2hlciBTU20gQlxcXCIsIHNlcmlmO1xcbiAgICAtLWZvbnQtZmFtaWx5LWJvZHk6IFxcXCJWZXJsYWcgQVxcXCIsIFxcXCJWZXJsYWcgQlxcXCIsIHNhbnMtc2VyaWY7XFxuICAgIC0tZm9udC1mYW1pbHktbW9ub3NwYWNlOiBcXFwiT3BlcmF0b3IgTW9ubyBTU20gQVxcXCIsIFxcXCJPcGVyYXRvciBNb25vIFNTbSBCXFxcIiwgbW9ub3NwYWNlO1xcblxcbiAgICAvKiBGb250IFNpemUgKi9cXG4gICAgLS1mb250LXNpemUtc206IDAuNzVyZW07ICAgLyogMTJweCAqL1xcbiAgICAtLWZvbnQtc2l6ZS1iYXNlOiAxcmVtOyAgICAvKiAxNnB4LCBiYXNlICovXFxuICAgIC0tZm9udC1zaXplLW1kOiAxLjI1cmVtOyAgIC8qIDIwcHggKi9cXG4gICAgLS1mb250LXNpemUtbGc6IDEuNXJlbTsgICAgLyogMjRweCAqL1xcbiAgICAtLWZvbnQtc2l6ZS14bDogMS43NXJlbTsgICAvKiAyOHB4ICovXFxuICAgIC0tZm9udC1zaXplLXh4bDogMnJlbTsgICAgIC8qIDMycHggKi9cXG4gICAgLS1mb250LXNpemUteHh4bDogMi4yNXJlbTsgLyogMzZweCAqL1xcblxcbiAgICAvKiBDb2xvdXJzICovXFxuICAgIC0tY29sb3ItcHJpbWFyeTogb2tsY2goMzYuOCUgMC4xIDEyNS41MDUpO1xcbiAgICAtLWNvbG9yLXNlY29uZGFyeTogb2tsY2goOTYuMyUgMC4xIDEyNS41MDUpO1xcbiAgICAtLWNvbG9yLWxpbms6IG9rbGNoKDQ4LjA5JSAwLjE0NiAyNDEuNDEpO1xcbiAgICAtLWNvbG9yLWxpbmstdmlzaXRlZDogb2tsY2goNzAuNDQlIDAuMjEgMzA0LjQxKTtcXG4gICAgLS1jb2xvci1wcmltYXJ5LXNoYWRvdzogb2tsY2goMTkuNTYlIDAuMDU0IDEyNS41MDUgLyA0MCUpO1xcbn1cXG5cIixcImJvZHkge1xcbiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYm9keSk7XFxuICAgIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLW1kKTtcXG59XFxuXFxuY29kZSB7XFxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1tb25vc3BhY2UpO1xcbn1cXG5cXG5oMSxcXG5oMixcXG5oMyxcXG5oNCxcXG5oNSxcXG5oNiB7XFxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1oZWFkaW5ncyk7XFxufVxcblwiLFwiYm9keSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLXNlY29uZGFyeSk7XFxuICAgIGNvbG9yOiB2YXIoLS1jb2xvci1wcmltYXJ5KTtcXG59XFxuXFxuYSB7XFxuICAgIGNvbG9yOiB2YXIoLS1jb2xvci1saW5rKTtcXG5cXG4gICAgJjp2aXNpdGVkIHtcXG4gICAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci1saW5rLXZpc2l0ZWQpO1xcbiAgICB9XFxufVxcblxcbiNzaXRlLWhlYWRlciB7XFxuICAgICYgYTp2aXNpdGVkIHtcXG4gICAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci1saW5rKTtcXG4gICAgfVxcbn1cXG5cIixcIi5ncmlkIHtcXG4gICAgZGlzcGxheTogZ3JpZDtcXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA1dncgMWZyIDV2dztcXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBtaW4tY29udGVudCAxZnIgbWluLWNvbnRlbnQ7XFxuICAgIHJvdy1nYXA6IDFyZW07XFxufVxcblxcbiNzaXRlLWhlYWRlciB7XFxuICAgIGdyaWQtY29sdW1uOiAyIC8gMztcXG4gICAgZ3JpZC1yb3c6IDEgLyAyO1xcbn1cXG5cXG5tYWluIHtcXG4gICAgZ3JpZC1jb2x1bW46IDIgLyAzO1xcbiAgICBncmlkLXJvdzogMiAvIDM7XFxufVxcblxcbmZvb3RlciB7XFxuICAgIGdyaWQtY29sdW1uOiAyIC8gMztcXG4gICAgZ3JpZC1yb3c6IDMgLyA0O1xcblxcbiAgICAmIC5pd2MtbG9nbyB7XFxuICAgICAgICBtYXgtd2lkdGg6IDg1dnc7XFxuICAgIH1cXG59XFxuXCIsXCIuaGxqcyB7XFxuICAgIGJvcmRlci1yYWRpdXM6IC41cmVtO1xcbn1cXG5cIixcIi5wLWJyaWRneS10d2l0dGVyLWNvbnRlbnQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cIixcIi5oLWNhcmQge1xcbiAgICAmIC5ob3ZlcmNhcmQge1xcbiAgICAgICAgZGlzcGxheTogbm9uZTtcXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgICAgIHotaW5kZXg6IDEwMDtcXG4gICAgICAgIHBhZGRpbmc6IDFyZW07XFxuICAgICAgICBib3JkZXItcmFkaXVzOiAxcmVtO1xcbiAgICAgICAgYm94LXNoYWRvdzogMCAuNXJlbSAuNXJlbSAuNXJlbSB2YXIoLS1jb2xvci1wcmltYXJ5LXNoYWRvdyk7XFxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1zZWNvbmRhcnkpO1xcbiAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzIGVhc2UtaW4tb3V0O1xcbiAgICAgICAgb3BhY2l0eTogMDtcXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgICAgICBnYXA6IC41cmVtO1xcblxcbiAgICAgICAgJiAudS1waG90byB7XFxuICAgICAgICAgICAgbWF4LXdpZHRoOiA2cmVtO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgJiAuc29jaWFsLWljb24ge1xcbiAgICAgICAgICAgIHdpZHRoOiAxcmVtO1xcbiAgICAgICAgICAgIGhlaWdodDogMXJlbTtcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICAmOmhvdmVyIHtcXG4gICAgICAgICYgLmhvdmVyY2FyZCB7XFxuICAgICAgICAgICAgZGlzcGxheTogZmxleDtcXG4gICAgICAgICAgICBvcGFjaXR5OiAxO1xcbiAgICAgICAgfVxcbiAgICB9XFxufVxcblwiLFwiQGltcG9ydCBcXFwicG9zc2UuY3NzXFxcIjtcXG5AaW1wb3J0IFxcXCJoLWNhcmQuY3NzXFxcIjtcXG5cXG4uaC1lbnRyeSB7XFxuICAgIGJvcmRlci1pbmxpbmUtc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1jb2xvci1wcmltYXJ5KTtcXG4gICAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IC41cmVtO1xcblxcbiAgICAmIC5yZXBseS10byB7XFxuICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICAgIH1cXG5cXG4gICAgJiAucG9zdC1pbmZvIHtcXG4gICAgICAgICYgYSB7XFxuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgICYgLm5vdGUtbWV0YWRhdGEge1xcbiAgICAgICAgZGlzcGxheTogZmxleDtcXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgICAgICBnYXA6IDFyZW07XFxuXFxuICAgICAgICAmIC5zeW5kaWNhdGlvbi1saW5rcyB7XFxuICAgICAgICAgICAgZmxleC1mbG93OiByb3cgd3JhcDtcXG5cXG4gICAgICAgICAgICAmIGEge1xcbiAgICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuXFxuICAgICAgICAgICAgICAgICYgc3ZnIHtcXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxcmVtO1xcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxcmVtO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./resources/css/app.css\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"./node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--font-family-headings:\\\"Archer SSm A\\\",\\\"Archer SSm B\\\",serif;--font-family-body:\\\"Verlag A\\\",\\\"Verlag B\\\",sans-serif;--font-family-monospace:\\\"Operator Mono SSm A\\\",\\\"Operator Mono SSm B\\\",monospace;--font-size-sm:0.75rem;--font-size-base:1rem;--font-size-md:1.25rem;--font-size-lg:1.5rem;--font-size-xl:1.75rem;--font-size-xxl:2rem;--font-size-xxxl:2.25rem;--color-primary:#334700;--color-secondary:#e3ffb7;--color-link:#00649e;--color-link-visited:#bc7aff;--color-primary-shadow:rgba(16,25,0,.4)}@supports (color:color(display-p3 0 0 0)){:root{--color-primary:color(display-p3 0.21567 0.27838 0.03615);--color-secondary:color(display-p3 0.91016 0.99842 0.74082);--color-link:color(display-p3 0.01045 0.38351 0.63618);--color-link-visited:color(display-p3 0.70467 0.47549 0.99958);--color-primary-shadow:color(display-p3 0.06762 0.09646 0.00441/0.4)}}@supports (color:oklch(0% 0 0)){:root{--color-primary:oklch(36.8% 0.1 125.505deg);--color-secondary:oklch(96.3% 0.1 125.505deg);--color-link:oklch(48.09% 0.146 241.41deg);--color-link-visited:oklch(70.44% 0.21 304.41deg);--color-primary-shadow:oklch(19.56% 0.054 125.505deg/40%)}}body{background-color:var(--color-secondary);color:var(--color-primary);font-family:var(--font-family-body);font-size:var(--font-size-md)}code{font-family:var(--font-family-monospace)}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-headings)}.grid{display:grid;grid-template-columns:5vw 1fr 5vw;grid-template-rows:-webkit-min-content 1fr -webkit-min-content;grid-template-rows:min-content 1fr min-content;row-gap:1rem}#site-header{grid-column:2/3;grid-row:1/2}main{grid-row:2/3}footer,main{grid-column:2/3}footer{grid-row:3/4}footer .iwc-logo{max-width:85vw}a{color:var(--color-link)}a:visited{color:var(--color-link-visited)}#site-header a:visited{color:var(--color-link)}.hljs{border-radius:.5rem}.h-card .hovercard{-webkit-box-orient:vertical;-webkit-box-direction:normal;background-color:var(--color-secondary);border-radius:1rem;-webkit-box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);display:none;-ms-flex-direction:column;flex-direction:column;gap:.5rem;opacity:0;padding:1rem;position:absolute;-webkit-transition:opacity .5s ease-in-out;transition:opacity .5s ease-in-out;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;z-index:100}.h-card .hovercard .u-photo{max-width:6rem}.h-card .hovercard .social-icon{height:1rem;width:1rem}.h-card:hover .hovercard{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1}.h-entry{-webkit-border-start:1px solid var(--color-primary);-webkit-padding-start:.5rem;border-inline-start:1px solid var(--color-primary);padding-inline-start:.5rem}.h-entry .reply-to{font-style:italic}.h-entry .post-info a{text-decoration:none}.h-entry .note-metadata{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;gap:1rem}.h-entry .note-metadata .syndication-links{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.h-entry .note-metadata .syndication-links a{text-decoration:none}.h-entry .note-metadata .syndication-links a svg{height:1rem;width:1rem}\", \"\",{\"version\":3,\"sources\":[\"webpack://./resources/css/variables.css\",\"webpack://./resources/css/fonts.css\",\"webpack://./resources/css/colours.css\",\"webpack://./resources/css/layout.css\",\"webpack://./resources/css/code.css\",\"webpack://./resources/css/h-card.css\",\"webpack://./resources/css/content.css\"],\"names\":[],\"mappings\":\"AAAA,MAEE,0DAA6D,CAC7D,mDAAsD,CACtD,6EAAgF,CAGhF,sBAAuB,CACvB,qBAAsB,CACtB,sBAAuB,CACvB,qBAAsB,CACtB,sBAAuB,CACvB,oBAAqB,CACrB,wBAAyB,CAGzB,uBAA4C,CAC5C,yBAA8C,CAC9C,oBAA2C,CAC3C,4BAAkD,CAClD,uCACF,CArBA,0CAAA,MAgBE,yDAA4C,CAC5C,2DAA8C,CAC9C,sDAA2C,CAC3C,8DAAkD,CAClD,oEACF,CAAA,CArBA,gCAAA,MAgBE,2CAA4C,CAC5C,6CAA8C,CAC9C,0CAA2C,CAC3C,iDAAkD,CAClD,yDACF,CAAA,CCrBA,KCCE,uCAAwC,CACxC,0BAA2B,CDD3B,mCAAoC,CACpC,6BACF,CAEA,KACE,wCACF,CAEA,kBAME,uCACF,CEhBA,MACE,YAAa,CACb,iCAAkC,CAClC,8DAA+C,CAA/C,8CAA+C,CAC/C,YACF,CAEA,aACE,eAAkB,CAClB,YACF,CAEA,KAEE,YACF,CAEA,YAJE,eAWF,CAPA,OAEE,YAKF,CAHE,iBACE,cACF,CDlBF,EACE,uBAKF,CAHE,UACE,+BACF,CAIA,uBACE,uBACF,CEhBF,MACE,mBACF,CCDE,mBAWE,2BAAsB,CAAtB,4BAAsB,CAJtB,uCAAwC,CAFxC,kBAAmB,CACnB,kEAA2D,CAA3D,0DAA2D,CAL3D,YAAa,CAUb,yBAAsB,CAAtB,qBAAsB,CACtB,SAAU,CAFV,SAAU,CANV,YAAa,CAFb,iBAAkB,CAOlB,0CAAoC,CAApC,kCAAoC,CADpC,yBAAkB,CAAlB,sBAAkB,CAAlB,iBAAkB,CALlB,WAmBF,CARE,4BACE,cACF,CAEA,gCAEE,WAAY,CADZ,UAEF,CAIA,yBACE,mBAAa,CAAb,mBAAa,CAAb,YAAa,CACb,SACF,CC3BJ,SACE,mDAAmD,CACnD,2BAA2B,CAD3B,kDAAmD,CACnD,0BA8BF,CA5BE,mBACE,iBACF,CAGE,sBACE,oBACF,CAGF,wBAEE,6BAAmB,CAAnB,4BAAmB,CADnB,mBAAa,CAAb,mBAAa,CAAb,YAAa,CACb,sBAAmB,CAAnB,kBAAmB,CACnB,QAcF,CAZE,2CACE,6BAAmB,CAAnB,4BAAmB,CAAnB,sBAAmB,CAAnB,kBAUF,CARE,6CACE,oBAMF,CAJE,iDAEE,WAAY,CADZ,UAEF\",\"sourcesContent\":[\":root {\\n /* Font Family */\\n --font-family-headings: \\\"Archer SSm A\\\", \\\"Archer SSm B\\\", serif;\\n --font-family-body: \\\"Verlag A\\\", \\\"Verlag B\\\", sans-serif;\\n --font-family-monospace: \\\"Operator Mono SSm A\\\", \\\"Operator Mono SSm B\\\", monospace;\\n\\n /* Font Size */\\n --font-size-sm: 0.75rem; /* 12px */\\n --font-size-base: 1rem; /* 16px, base */\\n --font-size-md: 1.25rem; /* 20px */\\n --font-size-lg: 1.5rem; /* 24px */\\n --font-size-xl: 1.75rem; /* 28px */\\n --font-size-xxl: 2rem; /* 32px */\\n --font-size-xxxl: 2.25rem; /* 36px */\\n\\n /* Colours */\\n --color-primary: oklch(36.8% 0.1 125.505deg);\\n --color-secondary: oklch(96.3% 0.1 125.505deg);\\n --color-link: oklch(48.09% 0.146 241.41deg);\\n --color-link-visited: oklch(70.44% 0.21 304.41deg);\\n --color-primary-shadow: oklch(19.56% 0.054 125.505deg / 40%);\\n}\\n\",\"body {\\n font-family: var(--font-family-body);\\n font-size: var(--font-size-md);\\n}\\n\\ncode {\\n font-family: var(--font-family-monospace);\\n}\\n\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n font-family: var(--font-family-headings);\\n}\\n\",\"body {\\n background-color: var(--color-secondary);\\n color: var(--color-primary);\\n}\\n\\na {\\n color: var(--color-link);\\n\\n &:visited {\\n color: var(--color-link-visited);\\n }\\n}\\n\\n#site-header {\\n & a:visited {\\n color: var(--color-link);\\n }\\n}\\n\",\".grid {\\n display: grid;\\n grid-template-columns: 5vw 1fr 5vw;\\n grid-template-rows: min-content 1fr min-content;\\n row-gap: 1rem;\\n}\\n\\n#site-header {\\n grid-column: 2 / 3;\\n grid-row: 1 / 2;\\n}\\n\\nmain {\\n grid-column: 2 / 3;\\n grid-row: 2 / 3;\\n}\\n\\nfooter {\\n grid-column: 2 / 3;\\n grid-row: 3 / 4;\\n\\n & .iwc-logo {\\n max-width: 85vw;\\n }\\n}\\n\",\".hljs {\\n border-radius: .5rem;\\n}\\n\",\".h-card {\\n & .hovercard {\\n display: none;\\n position: absolute;\\n z-index: 100;\\n padding: 1rem;\\n border-radius: 1rem;\\n box-shadow: 0 .5rem .5rem .5rem var(--color-primary-shadow);\\n background-color: var(--color-secondary);\\n width: fit-content;\\n transition: opacity 0.5s ease-in-out;\\n opacity: 0;\\n flex-direction: column;\\n gap: .5rem;\\n\\n & .u-photo {\\n max-width: 6rem;\\n }\\n\\n & .social-icon {\\n width: 1rem;\\n height: 1rem;\\n }\\n }\\n\\n &:hover {\\n & .hovercard {\\n display: flex;\\n opacity: 1;\\n }\\n }\\n}\\n\",\"@import url('h-card.css');\\n\\n.h-entry {\\n border-inline-start: 1px solid var(--color-primary);\\n padding-inline-start: .5rem;\\n\\n & .reply-to {\\n font-style: italic;\\n }\\n\\n & .post-info {\\n & a {\\n text-decoration: none;\\n }\\n }\\n\\n & .note-metadata {\\n display: flex;\\n flex-direction: row;\\n gap: 1rem;\\n\\n & .syndication-links {\\n flex-flow: row wrap;\\n\\n & a {\\n text-decoration: none;\\n\\n & svg {\\n width: 1rem;\\n height: 1rem;\\n }\\n }\\n }\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ __webpack_exports__[\"default\"] = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cnVsZVNldFsxXS5ydWxlc1sxXS51c2VbMV0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P3J1bGVTZXRbMV0ucnVsZXNbMV0udXNlWzJdIS4vcmVzb3VyY2VzL2Nzcy9hcHAuY3NzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDNkc7QUFDakI7QUFDNUYsOEJBQThCLG1GQUEyQixDQUFDLDRGQUFxQztBQUMvRjtBQUNBLGdEQUFnRCwrREFBK0Qsd0RBQXdELGtGQUFrRix1QkFBdUIsc0JBQXNCLHVCQUF1QixzQkFBc0IsdUJBQXVCLHFCQUFxQix5QkFBeUIsd0JBQXdCLDBCQUEwQixxQkFBcUIsNkJBQTZCLHdDQUF3QywwQ0FBMEMsTUFBTSwwREFBMEQsNERBQTRELHVEQUF1RCwrREFBK0Qsc0VBQXNFLGdDQUFnQyxNQUFNLDRDQUE0Qyw4Q0FBOEMsMkNBQTJDLGtEQUFrRCwyREFBMkQsS0FBSyx3Q0FBd0MsMkJBQTJCLG9DQUFvQyw4QkFBOEIsS0FBSyx5Q0FBeUMsa0JBQWtCLHdDQUF3QyxNQUFNLGFBQWEsa0NBQWtDLCtEQUErRCwrQ0FBK0MsYUFBYSxhQUFhLGdCQUFnQixhQUFhLEtBQUssYUFBYSxZQUFZLGdCQUFnQixPQUFPLGFBQWEsaUJBQWlCLGVBQWUsRUFBRSx3QkFBd0IsVUFBVSxnQ0FBZ0MsdUJBQXVCLHdCQUF3QixNQUFNLG9CQUFvQixtQkFBbUIsNEJBQTRCLDZCQUE2Qix3Q0FBd0MsbUJBQW1CLG1FQUFtRSwyREFBMkQsYUFBYSwwQkFBMEIsc0JBQXNCLFVBQVUsVUFBVSxhQUFhLGtCQUFrQiwyQ0FBMkMsbUNBQW1DLDBCQUEwQix1QkFBdUIsa0JBQWtCLFlBQVksNEJBQTRCLGVBQWUsZ0NBQWdDLFlBQVksV0FBVyx5QkFBeUIsb0JBQW9CLG9CQUFvQixhQUFhLFVBQVUsU0FBUyxvREFBb0QsNEJBQTRCLG1EQUFtRCwyQkFBMkIsbUJBQW1CLGtCQUFrQixzQkFBc0IscUJBQXFCLHdCQUF3Qiw4QkFBOEIsNkJBQTZCLG9CQUFvQixvQkFBb0IsYUFBYSx1QkFBdUIsbUJBQW1CLFNBQVMsMkNBQTJDLDhCQUE4Qiw2QkFBNkIsdUJBQXVCLG1CQUFtQiw2Q0FBNkMscUJBQXFCLGlEQUFpRCxZQUFZLFdBQVcsT0FBTyxzbURBQXNtRCwyRkFBMkYsK0RBQStELHlGQUF5RixvREFBb0QseUNBQXlDLCtDQUErQyx5Q0FBeUMseUNBQXlDLHlDQUF5Qyx5Q0FBeUMsOEVBQThFLG1EQUFtRCxnREFBZ0QsdURBQXVELGlFQUFpRSxHQUFHLFdBQVcseUNBQXlDLG1DQUFtQyxHQUFHLFVBQVUsOENBQThDLEdBQUcsaUNBQWlDLDZDQUE2QyxHQUFHLFdBQVcsNkNBQTZDLGdDQUFnQyxHQUFHLE9BQU8sNkJBQTZCLGlCQUFpQix1Q0FBdUMsS0FBSyxHQUFHLGtCQUFrQixpQkFBaUIsK0JBQStCLEtBQUssR0FBRyxZQUFZLGtCQUFrQix1Q0FBdUMsb0RBQW9ELGtCQUFrQixHQUFHLGtCQUFrQix1QkFBdUIsb0JBQW9CLEdBQUcsVUFBVSx1QkFBdUIsb0JBQW9CLEdBQUcsWUFBWSx1QkFBdUIsb0JBQW9CLG1CQUFtQixzQkFBc0IsS0FBSyxHQUFHLFlBQVkseUJBQXlCLEdBQUcsY0FBYyxrQkFBa0Isb0JBQW9CLHlCQUF5QixtQkFBbUIsb0JBQW9CLDBCQUEwQixrRUFBa0UsK0NBQStDLHlCQUF5QiwyQ0FBMkMsaUJBQWlCLDZCQUE2QixpQkFBaUIsb0JBQW9CLHdCQUF3QixPQUFPLHdCQUF3QixvQkFBb0IscUJBQXFCLE9BQU8sS0FBSyxlQUFlLG9CQUFvQixzQkFBc0IsbUJBQW1CLE9BQU8sS0FBSyxHQUFHLCtCQUErQixjQUFjLHdEQUF3RCxnQ0FBZ0MsbUJBQW1CLHlCQUF5QixLQUFLLG9CQUFvQixXQUFXLDhCQUE4QixPQUFPLEtBQUssd0JBQXdCLG9CQUFvQiwwQkFBMEIsZ0JBQWdCLDhCQUE4Qiw0QkFBNEIsZUFBZSxnQ0FBZ0MsbUJBQW1CLHdCQUF3Qix5QkFBeUIsV0FBVyxTQUFTLE9BQU8sS0FBSyxHQUFHLHFCQUFxQjtBQUN6c1A7QUFDQSwrREFBZSx1QkFBdUIsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2pidWstZnJvbnRlbmQvLi9yZXNvdXJjZXMvY3NzL2FwcC5jc3M/MGJhMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIjpyb290ey0tZm9udC1mYW1pbHktaGVhZGluZ3M6XFxcIkFyY2hlciBTU20gQVxcXCIsXFxcIkFyY2hlciBTU20gQlxcXCIsc2VyaWY7LS1mb250LWZhbWlseS1ib2R5OlxcXCJWZXJsYWcgQVxcXCIsXFxcIlZlcmxhZyBCXFxcIixzYW5zLXNlcmlmOy0tZm9udC1mYW1pbHktbW9ub3NwYWNlOlxcXCJPcGVyYXRvciBNb25vIFNTbSBBXFxcIixcXFwiT3BlcmF0b3IgTW9ubyBTU20gQlxcXCIsbW9ub3NwYWNlOy0tZm9udC1zaXplLXNtOjAuNzVyZW07LS1mb250LXNpemUtYmFzZToxcmVtOy0tZm9udC1zaXplLW1kOjEuMjVyZW07LS1mb250LXNpemUtbGc6MS41cmVtOy0tZm9udC1zaXplLXhsOjEuNzVyZW07LS1mb250LXNpemUteHhsOjJyZW07LS1mb250LXNpemUteHh4bDoyLjI1cmVtOy0tY29sb3ItcHJpbWFyeTojMzM0NzAwOy0tY29sb3Itc2Vjb25kYXJ5OiNlM2ZmYjc7LS1jb2xvci1saW5rOiMwMDY0OWU7LS1jb2xvci1saW5rLXZpc2l0ZWQ6I2JjN2FmZjstLWNvbG9yLXByaW1hcnktc2hhZG93OnJnYmEoMTYsMjUsMCwuNCl9QHN1cHBvcnRzIChjb2xvcjpjb2xvcihkaXNwbGF5LXAzIDAgMCAwKSl7OnJvb3R7LS1jb2xvci1wcmltYXJ5OmNvbG9yKGRpc3BsYXktcDMgMC4yMTU2NyAwLjI3ODM4IDAuMDM2MTUpOy0tY29sb3Itc2Vjb25kYXJ5OmNvbG9yKGRpc3BsYXktcDMgMC45MTAxNiAwLjk5ODQyIDAuNzQwODIpOy0tY29sb3ItbGluazpjb2xvcihkaXNwbGF5LXAzIDAuMDEwNDUgMC4zODM1MSAwLjYzNjE4KTstLWNvbG9yLWxpbmstdmlzaXRlZDpjb2xvcihkaXNwbGF5LXAzIDAuNzA0NjcgMC40NzU0OSAwLjk5OTU4KTstLWNvbG9yLXByaW1hcnktc2hhZG93OmNvbG9yKGRpc3BsYXktcDMgMC4wNjc2MiAwLjA5NjQ2IDAuMDA0NDEvMC40KX19QHN1cHBvcnRzIChjb2xvcjpva2xjaCgwJSAwIDApKXs6cm9vdHstLWNvbG9yLXByaW1hcnk6b2tsY2goMzYuOCUgMC4xIDEyNS41MDVkZWcpOy0tY29sb3Itc2Vjb25kYXJ5Om9rbGNoKDk2LjMlIDAuMSAxMjUuNTA1ZGVnKTstLWNvbG9yLWxpbms6b2tsY2goNDguMDklIDAuMTQ2IDI0MS40MWRlZyk7LS1jb2xvci1saW5rLXZpc2l0ZWQ6b2tsY2goNzAuNDQlIDAuMjEgMzA0LjQxZGVnKTstLWNvbG9yLXByaW1hcnktc2hhZG93Om9rbGNoKDE5LjU2JSAwLjA1NCAxMjUuNTA1ZGVnLzQwJSl9fWJvZHl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1jb2xvci1zZWNvbmRhcnkpO2NvbG9yOnZhcigtLWNvbG9yLXByaW1hcnkpO2ZvbnQtZmFtaWx5OnZhcigtLWZvbnQtZmFtaWx5LWJvZHkpO2ZvbnQtc2l6ZTp2YXIoLS1mb250LXNpemUtbWQpfWNvZGV7Zm9udC1mYW1pbHk6dmFyKC0tZm9udC1mYW1pbHktbW9ub3NwYWNlKX1oMSxoMixoMyxoNCxoNSxoNntmb250LWZhbWlseTp2YXIoLS1mb250LWZhbWlseS1oZWFkaW5ncyl9LmdyaWR7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczo1dncgMWZyIDV2dztncmlkLXRlbXBsYXRlLXJvd3M6LXdlYmtpdC1taW4tY29udGVudCAxZnIgLXdlYmtpdC1taW4tY29udGVudDtncmlkLXRlbXBsYXRlLXJvd3M6bWluLWNvbnRlbnQgMWZyIG1pbi1jb250ZW50O3Jvdy1nYXA6MXJlbX0jc2l0ZS1oZWFkZXJ7Z3JpZC1jb2x1bW46Mi8zO2dyaWQtcm93OjEvMn1tYWlue2dyaWQtcm93OjIvM31mb290ZXIsbWFpbntncmlkLWNvbHVtbjoyLzN9Zm9vdGVye2dyaWQtcm93OjMvNH1mb290ZXIgLml3Yy1sb2dve21heC13aWR0aDo4NXZ3fWF7Y29sb3I6dmFyKC0tY29sb3ItbGluayl9YTp2aXNpdGVke2NvbG9yOnZhcigtLWNvbG9yLWxpbmstdmlzaXRlZCl9I3NpdGUtaGVhZGVyIGE6dmlzaXRlZHtjb2xvcjp2YXIoLS1jb2xvci1saW5rKX0uaGxqc3tib3JkZXItcmFkaXVzOi41cmVtfS5oLWNhcmQgLmhvdmVyY2FyZHstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNvbG9yLXNlY29uZGFyeSk7Ym9yZGVyLXJhZGl1czoxcmVtOy13ZWJraXQtYm94LXNoYWRvdzowIC41cmVtIC41cmVtIC41cmVtIHZhcigtLWNvbG9yLXByaW1hcnktc2hhZG93KTtib3gtc2hhZG93OjAgLjVyZW0gLjVyZW0gLjVyZW0gdmFyKC0tY29sb3ItcHJpbWFyeS1zaGFkb3cpO2Rpc3BsYXk6bm9uZTstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6LjVyZW07b3BhY2l0eTowO3BhZGRpbmc6MXJlbTtwb3NpdGlvbjphYnNvbHV0ZTstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlLWluLW91dDt3aWR0aDotd2Via2l0LWZpdC1jb250ZW50O3dpZHRoOi1tb3otZml0LWNvbnRlbnQ7d2lkdGg6Zml0LWNvbnRlbnQ7ei1pbmRleDoxMDB9LmgtY2FyZCAuaG92ZXJjYXJkIC51LXBob3Rve21heC13aWR0aDo2cmVtfS5oLWNhcmQgLmhvdmVyY2FyZCAuc29jaWFsLWljb257aGVpZ2h0OjFyZW07d2lkdGg6MXJlbX0uaC1jYXJkOmhvdmVyIC5ob3ZlcmNhcmR7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtvcGFjaXR5OjF9LmgtZW50cnl7LXdlYmtpdC1ib3JkZXItc3RhcnQ6MXB4IHNvbGlkIHZhcigtLWNvbG9yLXByaW1hcnkpOy13ZWJraXQtcGFkZGluZy1zdGFydDouNXJlbTtib3JkZXItaW5saW5lLXN0YXJ0OjFweCBzb2xpZCB2YXIoLS1jb2xvci1wcmltYXJ5KTtwYWRkaW5nLWlubGluZS1zdGFydDouNXJlbX0uaC1lbnRyeSAucmVwbHktdG97Zm9udC1zdHlsZTppdGFsaWN9LmgtZW50cnkgLnBvc3QtaW5mbyBhe3RleHQtZGVjb3JhdGlvbjpub25lfS5oLWVudHJ5IC5ub3RlLW1ldGFkYXRhey13ZWJraXQtYm94LW9yaWVudDpob3Jpem9udGFsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvdztnYXA6MXJlbX0uaC1lbnRyeSAubm90ZS1tZXRhZGF0YSAuc3luZGljYXRpb24tbGlua3N7LXdlYmtpdC1ib3gtb3JpZW50Omhvcml6b250YWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1mbG93OnJvdyB3cmFwO2ZsZXgtZmxvdzpyb3cgd3JhcH0uaC1lbnRyeSAubm90ZS1tZXRhZGF0YSAuc3luZGljYXRpb24tbGlua3MgYXt0ZXh0LWRlY29yYXRpb246bm9uZX0uaC1lbnRyeSAubm90ZS1tZXRhZGF0YSAuc3luZGljYXRpb24tbGlua3MgYSBzdmd7aGVpZ2h0OjFyZW07d2lkdGg6MXJlbX1cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9yZXNvdXJjZXMvY3NzL3ZhcmlhYmxlcy5jc3NcIixcIndlYnBhY2s6Ly8uL3Jlc291cmNlcy9jc3MvZm9udHMuY3NzXCIsXCJ3ZWJwYWNrOi8vLi9yZXNvdXJjZXMvY3NzL2NvbG91cnMuY3NzXCIsXCJ3ZWJwYWNrOi8vLi9yZXNvdXJjZXMvY3NzL2xheW91dC5jc3NcIixcIndlYnBhY2s6Ly8uL3Jlc291cmNlcy9jc3MvY29kZS5jc3NcIixcIndlYnBhY2s6Ly8uL3Jlc291cmNlcy9jc3MvaC1jYXJkLmNzc1wiLFwid2VicGFjazovLy4vcmVzb3VyY2VzL2Nzcy9jb250ZW50LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxNQUVFLDBEQUE2RCxDQUM3RCxtREFBc0QsQ0FDdEQsNkVBQWdGLENBR2hGLHNCQUF1QixDQUN2QixxQkFBc0IsQ0FDdEIsc0JBQXVCLENBQ3ZCLHFCQUFzQixDQUN0QixzQkFBdUIsQ0FDdkIsb0JBQXFCLENBQ3JCLHdCQUF5QixDQUd6Qix1QkFBNEMsQ0FDNUMseUJBQThDLENBQzlDLG9CQUEyQyxDQUMzQyw0QkFBa0QsQ0FDbEQsdUNBQ0YsQ0FyQkEsMENBQUEsTUFnQkUseURBQTRDLENBQzVDLDJEQUE4QyxDQUM5QyxzREFBMkMsQ0FDM0MsOERBQWtELENBQ2xELG9FQUNGLENBQUEsQ0FyQkEsZ0NBQUEsTUFnQkUsMkNBQTRDLENBQzVDLDZDQUE4QyxDQUM5QywwQ0FBMkMsQ0FDM0MsaURBQWtELENBQ2xELHlEQUNGLENBQUEsQ0NyQkEsS0NDRSx1Q0FBd0MsQ0FDeEMsMEJBQTJCLENERDNCLG1DQUFvQyxDQUNwQyw2QkFDRixDQUVBLEtBQ0Usd0NBQ0YsQ0FFQSxrQkFNRSx1Q0FDRixDRWhCQSxNQUNFLFlBQWEsQ0FDYixpQ0FBa0MsQ0FDbEMsOERBQStDLENBQS9DLDhDQUErQyxDQUMvQyxZQUNGLENBRUEsYUFDRSxlQUFrQixDQUNsQixZQUNGLENBRUEsS0FFRSxZQUNGLENBRUEsWUFKRSxlQVdGLENBUEEsT0FFRSxZQUtGLENBSEUsaUJBQ0UsY0FDRixDRGxCRixFQUNFLHVCQUtGLENBSEUsVUFDRSwrQkFDRixDQUlBLHVCQUNFLHVCQUNGLENFaEJGLE1BQ0UsbUJBQ0YsQ0NERSxtQkFXRSwyQkFBc0IsQ0FBdEIsNEJBQXNCLENBSnRCLHVDQUF3QyxDQUZ4QyxrQkFBbUIsQ0FDbkIsa0VBQTJELENBQTNELDBEQUEyRCxDQUwzRCxZQUFhLENBVWIseUJBQXNCLENBQXRCLHFCQUFzQixDQUN0QixTQUFVLENBRlYsU0FBVSxDQU5WLFlBQWEsQ0FGYixpQkFBa0IsQ0FPbEIsMENBQW9DLENBQXBDLGtDQUFvQyxDQURwQyx5QkFBa0IsQ0FBbEIsc0JBQWtCLENBQWxCLGlCQUFrQixDQUxsQixXQW1CRixDQVJFLDRCQUNFLGNBQ0YsQ0FFQSxnQ0FFRSxXQUFZLENBRFosVUFFRixDQUlBLHlCQUNFLG1CQUFhLENBQWIsbUJBQWEsQ0FBYixZQUFhLENBQ2IsU0FDRixDQzNCSixTQUNFLG1EQUFtRCxDQUNuRCwyQkFBMkIsQ0FEM0Isa0RBQW1ELENBQ25ELDBCQThCRixDQTVCRSxtQkFDRSxpQkFDRixDQUdFLHNCQUNFLG9CQUNGLENBR0Ysd0JBRUUsNkJBQW1CLENBQW5CLDRCQUFtQixDQURuQixtQkFBYSxDQUFiLG1CQUFhLENBQWIsWUFBYSxDQUNiLHNCQUFtQixDQUFuQixrQkFBbUIsQ0FDbkIsUUFjRixDQVpFLDJDQUNFLDZCQUFtQixDQUFuQiw0QkFBbUIsQ0FBbkIsc0JBQW1CLENBQW5CLGtCQVVGLENBUkUsNkNBQ0Usb0JBTUYsQ0FKRSxpREFFRSxXQUFZLENBRFosVUFFRlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI6cm9vdCB7XFxuICAvKiBGb250IEZhbWlseSAqL1xcbiAgLS1mb250LWZhbWlseS1oZWFkaW5nczogXFxcIkFyY2hlciBTU20gQVxcXCIsIFxcXCJBcmNoZXIgU1NtIEJcXFwiLCBzZXJpZjtcXG4gIC0tZm9udC1mYW1pbHktYm9keTogXFxcIlZlcmxhZyBBXFxcIiwgXFxcIlZlcmxhZyBCXFxcIiwgc2Fucy1zZXJpZjtcXG4gIC0tZm9udC1mYW1pbHktbW9ub3NwYWNlOiBcXFwiT3BlcmF0b3IgTW9ubyBTU20gQVxcXCIsIFxcXCJPcGVyYXRvciBNb25vIFNTbSBCXFxcIiwgbW9ub3NwYWNlO1xcblxcbiAgLyogRm9udCBTaXplICovXFxuICAtLWZvbnQtc2l6ZS1zbTogMC43NXJlbTsgICAvKiAxMnB4ICovXFxuICAtLWZvbnQtc2l6ZS1iYXNlOiAxcmVtOyAgICAvKiAxNnB4LCBiYXNlICovXFxuICAtLWZvbnQtc2l6ZS1tZDogMS4yNXJlbTsgICAvKiAyMHB4ICovXFxuICAtLWZvbnQtc2l6ZS1sZzogMS41cmVtOyAgICAvKiAyNHB4ICovXFxuICAtLWZvbnQtc2l6ZS14bDogMS43NXJlbTsgICAvKiAyOHB4ICovXFxuICAtLWZvbnQtc2l6ZS14eGw6IDJyZW07ICAgICAvKiAzMnB4ICovXFxuICAtLWZvbnQtc2l6ZS14eHhsOiAyLjI1cmVtOyAvKiAzNnB4ICovXFxuXFxuICAvKiBDb2xvdXJzICovXFxuICAtLWNvbG9yLXByaW1hcnk6IG9rbGNoKDM2LjglIDAuMSAxMjUuNTA1ZGVnKTtcXG4gIC0tY29sb3Itc2Vjb25kYXJ5OiBva2xjaCg5Ni4zJSAwLjEgMTI1LjUwNWRlZyk7XFxuICAtLWNvbG9yLWxpbms6IG9rbGNoKDQ4LjA5JSAwLjE0NiAyNDEuNDFkZWcpO1xcbiAgLS1jb2xvci1saW5rLXZpc2l0ZWQ6IG9rbGNoKDcwLjQ0JSAwLjIxIDMwNC40MWRlZyk7XFxuICAtLWNvbG9yLXByaW1hcnktc2hhZG93OiBva2xjaCgxOS41NiUgMC4wNTQgMTI1LjUwNWRlZyAvIDQwJSk7XFxufVxcblwiLFwiYm9keSB7XFxuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYm9keSk7XFxuICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS1tZCk7XFxufVxcblxcbmNvZGUge1xcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5LW1vbm9zcGFjZSk7XFxufVxcblxcbmgxLFxcbmgyLFxcbmgzLFxcbmg0LFxcbmg1LFxcbmg2IHtcXG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1oZWFkaW5ncyk7XFxufVxcblwiLFwiYm9keSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1zZWNvbmRhcnkpO1xcbiAgY29sb3I6IHZhcigtLWNvbG9yLXByaW1hcnkpO1xcbn1cXG5cXG5hIHtcXG4gIGNvbG9yOiB2YXIoLS1jb2xvci1saW5rKTtcXG5cXG4gICY6dmlzaXRlZCB7XFxuICAgIGNvbG9yOiB2YXIoLS1jb2xvci1saW5rLXZpc2l0ZWQpO1xcbiAgfVxcbn1cXG5cXG4jc2l0ZS1oZWFkZXIge1xcbiAgJiBhOnZpc2l0ZWQge1xcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItbGluayk7XFxuICB9XFxufVxcblwiLFwiLmdyaWQge1xcbiAgZGlzcGxheTogZ3JpZDtcXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNXZ3IDFmciA1dnc7XFxuICBncmlkLXRlbXBsYXRlLXJvd3M6IG1pbi1jb250ZW50IDFmciBtaW4tY29udGVudDtcXG4gIHJvdy1nYXA6IDFyZW07XFxufVxcblxcbiNzaXRlLWhlYWRlciB7XFxuICBncmlkLWNvbHVtbjogMiAvIDM7XFxuICBncmlkLXJvdzogMSAvIDI7XFxufVxcblxcbm1haW4ge1xcbiAgZ3JpZC1jb2x1bW46IDIgLyAzO1xcbiAgZ3JpZC1yb3c6IDIgLyAzO1xcbn1cXG5cXG5mb290ZXIge1xcbiAgZ3JpZC1jb2x1bW46IDIgLyAzO1xcbiAgZ3JpZC1yb3c6IDMgLyA0O1xcblxcbiAgJiAuaXdjLWxvZ28ge1xcbiAgICBtYXgtd2lkdGg6IDg1dnc7XFxuICB9XFxufVxcblwiLFwiLmhsanMge1xcbiAgYm9yZGVyLXJhZGl1czogLjVyZW07XFxufVxcblwiLFwiLmgtY2FyZCB7XFxuICAmIC5ob3ZlcmNhcmQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHotaW5kZXg6IDEwMDtcXG4gICAgcGFkZGluZzogMXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogMXJlbTtcXG4gICAgYm94LXNoYWRvdzogMCAuNXJlbSAuNXJlbSAuNXJlbSB2YXIoLS1jb2xvci1wcmltYXJ5LXNoYWRvdyk7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLXNlY29uZGFyeSk7XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzIGVhc2UtaW4tb3V0O1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBnYXA6IC41cmVtO1xcblxcbiAgICAmIC51LXBob3RvIHtcXG4gICAgICBtYXgtd2lkdGg6IDZyZW07XFxuICAgIH1cXG5cXG4gICAgJiAuc29jaWFsLWljb24ge1xcbiAgICAgIHdpZHRoOiAxcmVtO1xcbiAgICAgIGhlaWdodDogMXJlbTtcXG4gICAgfVxcbiAgfVxcblxcbiAgJjpob3ZlciB7XFxuICAgICYgLmhvdmVyY2FyZCB7XFxuICAgICAgZGlzcGxheTogZmxleDtcXG4gICAgICBvcGFjaXR5OiAxO1xcbiAgICB9XFxuICB9XFxufVxcblwiLFwiQGltcG9ydCB1cmwoJ2gtY2FyZC5jc3MnKTtcXG5cXG4uaC1lbnRyeSB7XFxuICBib3JkZXItaW5saW5lLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tY29sb3ItcHJpbWFyeSk7XFxuICBwYWRkaW5nLWlubGluZS1zdGFydDogLjVyZW07XFxuXFxuICAmIC5yZXBseS10byB7XFxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIH1cXG5cXG4gICYgLnBvc3QtaW5mbyB7XFxuICAgICYgYSB7XFxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICB9XFxuICB9XFxuXFxuICAmIC5ub3RlLW1ldGFkYXRhIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgZ2FwOiAxcmVtO1xcblxcbiAgICAmIC5zeW5kaWNhdGlvbi1saW5rcyB7XFxuICAgICAgZmxleC1mbG93OiByb3cgd3JhcDtcXG5cXG4gICAgICAmIGEge1xcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcblxcbiAgICAgICAgJiBzdmcge1xcbiAgICAgICAgICB3aWR0aDogMXJlbTtcXG4gICAgICAgICAgaGVpZ2h0OiAxcmVtO1xcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./resources/css/app.css\n"); /***/ }), diff --git a/public/assets/app.js.br b/public/assets/app.js.br index eac06b5426ca72ff6f3a743c3ab89561721be8e5..dc6eb881df1f9dd789d3dfb90c0478bb9aabfa94 100644 GIT binary patch literal 16895 zcma!E%^P?iFO~T&{zn70+CAVqEN-(fDXX_F za9s-eEL7lONHgZ!6kp^ ztap=hU%d4?^T!)ULYMY-h=$)jEPbENu=3^S?bG6)&p-XLb>7Scf}Uw*5>+?NHfk)I zF@aTQ{!j1A=iYx`{r}h8{ki9>-iNMGdq2Oa$u`cf;a<8^@{$DWDBZkUB~ep1R9Ei5 zQC4}AnITy4VD8FyHh*1B#T}10e_y@+R``?+^<)M8-DBm;ZZo$i9*BflJj~BC?{$C$&dS7*_S}5PjlIMlb7y0bW zyt_;FobC6w534I0o;S{5=(r+v;nF5c$vGaLo8MV}x4YBs?!mTj!-c!EkKYadGjH@x z#Ingd#6-lfoaba`b;=aZWH_?9Ai!&8iAN~k)NFCzGjo@$+qtMjLrQ#U`$p~yk3@ET zwLiF~;)l|EanUIOlk_yFsIYi2PE6SCC)7AuZ|lFXm{MO>^L-mO2(Ucl-j}KU|FRFm zoyY%oA7p5bJ9z*C793>Qf46Ijhp=Y#-;*W#k9Exc{K!17M7_1_ve+LXuN(U7_U_Uu z|IYXQ=Oudu1%*{SN>>#U4m513Z)j{R-B{vhnpc0tPTM#*^V!k=dww#>^KrEva9kk3 zA;Q(@q#JN|_Dv^wz4?y&>Q^{3y<=6lbtUD-?VBgRu|$<;`lcFtDMwT5p%{KqzpYMhLYN8&? zthl&);z^|lZQE;$^-f62uBlm;@1|rQnE6`Dc}Zr^*Af#pkqah=D`zlk?%XzswPx1a z-$nf{Z{ptA{NKBft%^;cGJU}`rYi};*-dk5D$QohD&E1r#U!LV5unFM0UDb=j}8Z*?VC+@8R(B%z_d zyy8n@3afT1|KTaMFC)1p+E(U-NPoHb)G)78I`KYp@b+Ur*M551=>KNvDl>n_6`m}= z4ehO#=ZbW0ni_ZM>nHID=gT)X)-RpRGsF|Y1=J)=iTF5{#8c5uPy#P zd%^YI?TePp7WM45y4!O%C#rh)i+01yo7Y*~n>l0Uo)c;pKg?^maJuB@-`6saeNJTG zs=KuC-dg6Sht)G4g!{7cZL0Y){The8C8t=};zupF15&STJNn?dl&xLM*MDCEYPdrq znBMbgEf@Xv_GFvveeDYd`&SpFKl$@5tu&pn$V2*ySb0N)XB_#Q$Am{u4m zE>k=q`_1+6%n0>Qr)LSzyJ`B>ZvVB=4L;ewLz#D-|L-czb~@nZ;ie-wtzKzQ3Y=oC zon)O;{Y+;bT`|$z@PnL&=JxMVOz)*@-`?F7KX2*Wv-h7?<;^+$Z}s%0A0~%t-`IHi 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 Kwf_r0qXGcgI%CoR literal 16618 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 Lv;HwX=41x|%A!5$ diff --git a/resources/css/app.css b/resources/css/app.css index d810ef58..ca75b3e5 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1,6 +1,6 @@ -@import "variables.css"; -@import "fonts.css"; -@import "layout.css"; -@import "colours.css"; -@import "code.css"; -@import "content.css"; +@import url('variables.css'); +@import url('fonts.css'); +@import url('layout.css'); +@import url('colours.css'); +@import url('code.css'); +@import url('content.css'); diff --git a/resources/css/code.css b/resources/css/code.css index 8524dbbd..88b8f5fa 100644 --- a/resources/css/code.css +++ b/resources/css/code.css @@ -1,3 +1,3 @@ .hljs { - border-radius: .5rem; + border-radius: .5rem; } diff --git a/resources/css/colours.css b/resources/css/colours.css index 2eecc8bf..65b95212 100644 --- a/resources/css/colours.css +++ b/resources/css/colours.css @@ -1,18 +1,18 @@ body { - background-color: var(--color-secondary); - color: var(--color-primary); + background-color: var(--color-secondary); + color: var(--color-primary); } a { - color: var(--color-link); + color: var(--color-link); - &:visited { - color: var(--color-link-visited); - } + &:visited { + color: var(--color-link-visited); + } } #site-header { - & a:visited { - color: var(--color-link); - } + & a:visited { + color: var(--color-link); + } } diff --git a/resources/css/content.css b/resources/css/content.css index e89befba..c656acef 100644 --- a/resources/css/content.css +++ b/resources/css/content.css @@ -1,36 +1,35 @@ -@import "posse.css"; -@import "h-card.css"; +@import url('h-card.css'); .h-entry { - border-inline-start: 1px solid var(--color-primary); - padding-inline-start: .5rem; + border-inline-start: 1px solid var(--color-primary); + padding-inline-start: .5rem; - & .reply-to { - font-style: italic; + & .reply-to { + font-style: italic; + } + + & .post-info { + & a { + text-decoration: none; } + } - & .post-info { - & a { - text-decoration: none; - } - } - - & .note-metadata { - display: flex; - flex-direction: row; - gap: 1rem; - - & .syndication-links { - flex-flow: row wrap; - - & a { - text-decoration: none; - - & svg { - width: 1rem; - height: 1rem; - } - } + & .note-metadata { + display: flex; + flex-direction: row; + gap: 1rem; + + & .syndication-links { + flex-flow: row wrap; + + & a { + text-decoration: none; + + & svg { + width: 1rem; + height: 1rem; } + } } + } } diff --git a/resources/css/fonts.css b/resources/css/fonts.css index b11a1128..91b3749b 100644 --- a/resources/css/fonts.css +++ b/resources/css/fonts.css @@ -1,10 +1,10 @@ body { - font-family: var(--font-family-body); - font-size: var(--font-size-md); + font-family: var(--font-family-body); + font-size: var(--font-size-md); } code { - font-family: var(--font-family-monospace); + font-family: var(--font-family-monospace); } h1, @@ -13,5 +13,5 @@ h3, h4, h5, h6 { - font-family: var(--font-family-headings); + font-family: var(--font-family-headings); } diff --git a/resources/css/h-card.css b/resources/css/h-card.css index dea4e7c5..de901e08 100644 --- a/resources/css/h-card.css +++ b/resources/css/h-card.css @@ -1,32 +1,32 @@ .h-card { + & .hovercard { + display: none; + position: absolute; + z-index: 100; + padding: 1rem; + border-radius: 1rem; + box-shadow: 0 .5rem .5rem .5rem var(--color-primary-shadow); + background-color: var(--color-secondary); + width: fit-content; + transition: opacity 0.5s ease-in-out; + opacity: 0; + flex-direction: column; + gap: .5rem; + + & .u-photo { + max-width: 6rem; + } + + & .social-icon { + width: 1rem; + height: 1rem; + } + } + + &:hover { & .hovercard { - display: none; - position: absolute; - z-index: 100; - padding: 1rem; - border-radius: 1rem; - box-shadow: 0 .5rem .5rem .5rem var(--color-primary-shadow); - background-color: var(--color-secondary); - width: fit-content; - transition: opacity 0.5s ease-in-out; - opacity: 0; - flex-direction: column; - gap: .5rem; - - & .u-photo { - max-width: 6rem; - } - - & .social-icon { - width: 1rem; - height: 1rem; - } - } - - &:hover { - & .hovercard { - display: flex; - opacity: 1; - } + display: flex; + opacity: 1; } + } } diff --git a/resources/css/layout.css b/resources/css/layout.css index 0163e7f1..f0a40dd6 100644 --- a/resources/css/layout.css +++ b/resources/css/layout.css @@ -1,25 +1,25 @@ .grid { - display: grid; - grid-template-columns: 5vw 1fr 5vw; - grid-template-rows: min-content 1fr min-content; - row-gap: 1rem; + display: grid; + grid-template-columns: 5vw 1fr 5vw; + grid-template-rows: min-content 1fr min-content; + row-gap: 1rem; } #site-header { - grid-column: 2 / 3; - grid-row: 1 / 2; + grid-column: 2 / 3; + grid-row: 1 / 2; } main { - grid-column: 2 / 3; - grid-row: 2 / 3; + grid-column: 2 / 3; + grid-row: 2 / 3; } footer { - grid-column: 2 / 3; - grid-row: 3 / 4; + grid-column: 2 / 3; + grid-row: 3 / 4; - & .iwc-logo { - max-width: 85vw; - } + & .iwc-logo { + max-width: 85vw; + } } diff --git a/resources/css/posse.css b/resources/css/posse.css deleted file mode 100644 index b131bdfe..00000000 --- a/resources/css/posse.css +++ /dev/null @@ -1,3 +0,0 @@ -.p-bridgy-twitter-content { - display: none; -} diff --git a/resources/css/variables.css b/resources/css/variables.css index 5aedebb8..c5fc61b7 100644 --- a/resources/css/variables.css +++ b/resources/css/variables.css @@ -1,22 +1,22 @@ :root { - /* Font Family */ - --font-family-headings: "Archer SSm A", "Archer SSm B", serif; - --font-family-body: "Verlag A", "Verlag B", sans-serif; - --font-family-monospace: "Operator Mono SSm A", "Operator Mono SSm B", monospace; + /* Font Family */ + --font-family-headings: "Archer SSm A", "Archer SSm B", serif; + --font-family-body: "Verlag A", "Verlag B", sans-serif; + --font-family-monospace: "Operator Mono SSm A", "Operator Mono SSm B", monospace; - /* Font Size */ - --font-size-sm: 0.75rem; /* 12px */ - --font-size-base: 1rem; /* 16px, base */ - --font-size-md: 1.25rem; /* 20px */ - --font-size-lg: 1.5rem; /* 24px */ - --font-size-xl: 1.75rem; /* 28px */ - --font-size-xxl: 2rem; /* 32px */ - --font-size-xxxl: 2.25rem; /* 36px */ + /* Font Size */ + --font-size-sm: 0.75rem; /* 12px */ + --font-size-base: 1rem; /* 16px, base */ + --font-size-md: 1.25rem; /* 20px */ + --font-size-lg: 1.5rem; /* 24px */ + --font-size-xl: 1.75rem; /* 28px */ + --font-size-xxl: 2rem; /* 32px */ + --font-size-xxxl: 2.25rem; /* 36px */ - /* Colours */ - --color-primary: oklch(36.8% 0.1 125.505); - --color-secondary: oklch(96.3% 0.1 125.505); - --color-link: oklch(48.09% 0.146 241.41); - --color-link-visited: oklch(70.44% 0.21 304.41); - --color-primary-shadow: oklch(19.56% 0.054 125.505 / 40%); + /* Colours */ + --color-primary: oklch(36.8% 0.1 125.505deg); + --color-secondary: oklch(96.3% 0.1 125.505deg); + --color-link: oklch(48.09% 0.146 241.41deg); + --color-link-visited: oklch(70.44% 0.21 304.41deg); + --color-primary-shadow: oklch(19.56% 0.054 125.505deg / 40%); } diff --git a/resources/js/app.js b/resources/js/app.js index f65cc9bd..69946e98 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1 +1,10 @@ import '../css/app.css'; + +// import { Auth } from './auth.js'; +// +// let auth = new Auth(); + +// auth.createCredentials().then((credentials) => { +// // eslint-disable-next-line no-console +// console.log(credentials); +// }); diff --git a/resources/js/auth.js b/resources/js/auth.js new file mode 100644 index 00000000..d181f62d --- /dev/null +++ b/resources/js/auth.js @@ -0,0 +1,36 @@ +class Auth { + constructor() {} + + async createCredentials() { + const publicKeyCredentialCreationOptions = { + challenge: Uint8Array.from( + 'randomStringFromServer', + c => c.charCodeAt(0) + ), + rp: { + id: 'jonnybarnes.localhost', + name: 'JB', + }, + user: { + id: Uint8Array.from( + 'UZSL85T9AFC', + c => c.charCodeAt(0) + ), + name: 'jonny@jonnybarnes.uk', + displayName: 'Jonny', + }, + pubKeyCredParams: [{alg: -7, type: 'public-key'}], + // authenticatorSelection: { + // authenticatorAttachment: 'cross-platform', + // }, + timeout: 60000, + attestation: 'direct' + }; + + return await navigator.credentials.create({ + publicKey: publicKeyCredentialCreationOptions + }); + } +} + +export { Auth }; diff --git a/resources/views/admin/welcome.blade.php b/resources/views/admin/welcome.blade.php index 4ca4c4d0..3cce67d7 100644 --- a/resources/views/admin/welcome.blade.php +++ b/resources/views/admin/welcome.blade.php @@ -51,4 +51,9 @@

Edit your bio.

+ +

Passkeys

+

+ List passkeys here? +

@stop diff --git a/webpack.config.js b/webpack.config.js index 447c6d42..3c7cc93c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -6,103 +6,103 @@ const EslintPlugin = require('eslint-webpack-plugin'); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const config = { - entry: ['./resources/js/app.js'], - output: { - path: path.resolve('./public/assets'), - filename: 'app.js', - }, - module: { - rules: [{ - test: /\.js$/, - exclude: /node_modules/, - use: { - loader: 'babel-loader', - options: { - presets: [ - ['@babel/preset-env', { targets: "defaults" }] - ] - } - } - }] - }, - plugins: [ - new StyleLintPlugin({ - configFile: path.resolve(__dirname + '/.stylelintrc'), - context: path.resolve(__dirname + '/resources/css'), - files: '**/*.css', - }), - new EslintPlugin({ - context: path.resolve(__dirname + '/resources/js'), - files: '**/*.js', - }), - new CompressionPlugin({ - filename: "[path][base].br", - algorithm: "brotliCompress", - test: /\.js$|\.css$/, - exclude: /.map$/, - compressionOptions: { - params: { - [zlib.constants.BROTLI_PARAM_QUALITY]: 11, - }, - }, - }), - ] + entry: ['./resources/js/app.js'], + output: { + path: path.resolve('./public/assets'), + filename: 'app.js', + }, + module: { + rules: [{ + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + presets: [ + ['@babel/preset-env', { targets: "defaults" }] + ] + } + } + }] + }, + plugins: [ + new StyleLintPlugin({ + configFile: path.resolve(__dirname + '/.stylelintrc'), + context: path.resolve(__dirname + '/resources/css'), + files: '**/*.css', + }), + new EslintPlugin({ + context: path.resolve(__dirname + '/resources/js'), + files: '**/*.js', + }), + new CompressionPlugin({ + filename: "[path][base].br", + algorithm: "brotliCompress", + test: /\.js$|\.css$/, + exclude: /.map$/, + compressionOptions: { + params: { + [zlib.constants.BROTLI_PARAM_QUALITY]: 11, + }, + }, + }), + ] }; module.exports = (env, argv) => { - if (argv.mode === 'development') { - config.devtool = 'eval-source-map'; + if (argv.mode === 'development') { + config.devtool = 'eval-source-map'; - config.module.rules.push({ - test: /\.css$/, - exclude: /node_modules/, - use: [ - { - loader: 'style-loader' - }, - { - loader: 'css-loader', - options: { - sourceMap: true - } - }, - { - loader: 'postcss-loader', - options: { - postcssOptions: { - config: path.resolve(__dirname, 'postcss.config.js'), - }, - sourceMap: true - } - } - ] - }); - } + config.module.rules.push({ + test: /\.css$/, + exclude: /node_modules/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + sourceMap: true + } + }, + { + loader: 'postcss-loader', + options: { + postcssOptions: { + config: path.resolve(__dirname, 'postcss.config.js'), + }, + sourceMap: true + } + } + ] + }); + } - if (argv.mode === 'production') { - config.module.rules.push({ - test: /\.css$/, - exclude: /node_modules/, - use: [ - { - loader: MiniCssExtractPlugin.loader, - }, - { - loader: 'css-loader', - }, - { - loader: 'postcss-loader', - options: { - postcssOptions: { - config: path.resolve(__dirname, 'postcss.config.js'), - }, - } - } - ] - }); + if (argv.mode === 'production') { + config.module.rules.push({ + test: /\.css$/, + exclude: /node_modules/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + }, + { + loader: 'css-loader', + }, + { + loader: 'postcss-loader', + options: { + postcssOptions: { + config: path.resolve(__dirname, 'postcss.config.js'), + }, + } + } + ] + }); - config.plugins.push(new MiniCssExtractPlugin({filename: 'app.css'})); - } + config.plugins.push(new MiniCssExtractPlugin({filename: 'app.css'})); + } - return config; + return config; }; From 2fb8339d91631b7779349a735e8238ada01e1697 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Mon, 25 Sep 2023 18:31:38 +0100 Subject: [PATCH 2/4] Admin can now hopefully add a passkey to their account --- .eslintrc.yml | 13 ++- .../Controllers/Admin/PasskeysController.php | 93 ++++++++++++++++++ app/Models/Passkey.php | 42 ++++++++ app/Models/User.php | 6 ++ composer.json | 1 + database/factories/PasskeyFactory.php | 34 +++++++ .../2023_08_27_113904_create_passkeys.php | 33 +++++++ postcss.config.js | 28 +++--- public/assets/app.js | 12 ++- public/assets/app.js.br | Bin 16895 -> 20470 bytes resources/js/app.js | 15 +-- resources/js/auth.js | 85 +++++++++++++--- .../views/admin/passkeys/index.blade.php | 18 ++++ resources/views/admin/welcome.blade.php | 2 +- resources/views/master.blade.php | 1 + routes/web.php | 8 ++ 16 files changed, 351 insertions(+), 40 deletions(-) create mode 100644 app/Http/Controllers/Admin/PasskeysController.php create mode 100644 app/Models/Passkey.php create mode 100644 database/factories/PasskeyFactory.php create mode 100644 database/migrations/2023_08_27_113904_create_passkeys.php create mode 100644 resources/views/admin/passkeys/index.blade.php diff --git a/.eslintrc.yml b/.eslintrc.yml index d3156688..8e72ef3e 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -1,6 +1,6 @@ parserOptions: sourceType: 'module' - ecmaVersion: 8 + ecmaVersion: 'latest' extends: 'eslint:recommended' env: browser: true @@ -25,3 +25,14 @@ rules: - allow: - warn - error + no-await-in-loop: + - error + no-promise-executor-return: + - error + require-atomic-updates: + - error + max-nested-callbacks: + - error + - 3 + prefer-promise-reject-errors: + - error diff --git a/app/Http/Controllers/Admin/PasskeysController.php b/app/Http/Controllers/Admin/PasskeysController.php new file mode 100644 index 00000000..61388175 --- /dev/null +++ b/app/Http/Controllers/Admin/PasskeysController.php @@ -0,0 +1,93 @@ +user(); + $passkeys = $user->passkey; + + return view('admin.passkeys.index', compact('passkeys')); + } + + public function save(Request $request): JsonResponse + { + $validator = Validator::make($request->all(), [ + 'id' => 'required|string|unique:App\Models\Passkey,passkey_id', + 'public_key' => 'required|file', + 'transports' => 'required|json', + 'challenge' => 'required|string', + ]); + + if ($validator->fails()) { + return response()->json([ + 'success' => false, + 'message' => 'Passkey could not be saved (validation failed)', + ]); + } + + $validated = $validator->validated(); + + if ( + !session()->has('challenge') || + $validated['challenge'] !== session('challenge') + ) { + return response()->json([ + 'success' => false, + 'message' => 'Passkey could not be saved (challenge failed)', + ]); + } + + $passkey = new Passkey(); + $passkey->passkey_id = $validated['id']; + $passkey->passkey = $validated['public_key']->get(); + $passkey->transports = json_decode($validated['transports'], true, 512, JSON_THROW_ON_ERROR); + $passkey->user_id = auth()->user()->id; + $passkey->save(); + + return response()->json([ + 'success' => true, + 'message' => 'Passkey saved successfully', + ]); + } + + public function init(): JsonResponse + { + /** @var User $user */ + $user = auth()->user(); + $passkeys = $user->passkey()->get(); + + $existing = $passkeys->map(function (Passkey $passkey) { + return [ + 'id' => $passkey->passkey_id, + 'transports' => $passkey->transports, + 'type' => 'public-key', + ]; + })->all(); + + $challenge = Hash::make(random_bytes(32)); + session(['challenge' => $challenge]); + + return response()->json([ + 'challenge' => $challenge, + 'userId' => $user->name, + 'existing' => $existing, + ]); + } +} diff --git a/app/Models/Passkey.php b/app/Models/Passkey.php new file mode 100644 index 00000000..64461eca --- /dev/null +++ b/app/Models/Passkey.php @@ -0,0 +1,42 @@ + stream_get_contents($value), + set: static fn ($value) => pg_escape_bytea($value), + ); + } + + /** + * Save and access the transports appropriately. + */ + protected function transports(): Attribute + { + return Attribute::make( + get: static fn ($value) => json_decode($value, true, 512, JSON_THROW_ON_ERROR), + set: static fn ($value) => json_encode($value, JSON_THROW_ON_ERROR), + ); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index bc57ee54..7bd0472f 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; @@ -24,4 +25,9 @@ class User extends Authenticatable 'password', 'remember_token', ]; + + public function passkey(): HasMany + { + return $this->hasMany(Passkey::class); + } } diff --git a/composer.json b/composer.json index f644792f..c41e6eff 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ "ext-dom": "*", "ext-intl": "*", "ext-json": "*", + "ext-pgsql": "*", "cviebrock/eloquent-sluggable": "^10.0", "guzzlehttp/guzzle": "^7.2", "indieauth/client": "^1.1", diff --git a/database/factories/PasskeyFactory.php b/database/factories/PasskeyFactory.php new file mode 100644 index 00000000..8e70e21d --- /dev/null +++ b/database/factories/PasskeyFactory.php @@ -0,0 +1,34 @@ + + */ +class PasskeyFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = Passkey::class; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'user_id' => $this->faker->numberBetween(1, 1000), + 'passkey_id' => $this->faker->uuid, + 'passkey' => $this->faker->sha256, + 'transports' => ['internal'], + ]; + } +} diff --git a/database/migrations/2023_08_27_113904_create_passkeys.php b/database/migrations/2023_08_27_113904_create_passkeys.php new file mode 100644 index 00000000..a2450d65 --- /dev/null +++ b/database/migrations/2023_08_27_113904_create_passkeys.php @@ -0,0 +1,33 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->string('passkey_id')->unique(); + $table->binary('passkey'); + $table->json('transports'); + $table->timestamps(); + + $table->foreign('user_id')->references('id')->on('users'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('passkeys'); + } +}; diff --git a/postcss.config.js b/postcss.config.js index b3f36747..f0ba5a6f 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,16 +1,16 @@ module.exports = { - plugins: { - 'postcss-import': {}, - 'autoprefixer': {}, - '@csstools/postcss-oklab-function': { - preserve: true - }, - 'postcss-nesting': {}, - 'postcss-combine-media-query': {}, - 'postcss-combine-duplicated-selectors': { - removeDuplicatedProperties: true, - removeDuplicatedValues: true - }, - 'cssnano': { preset: 'default' }, - } + plugins: { + 'postcss-import': {}, + 'autoprefixer': {}, + '@csstools/postcss-oklab-function': { + preserve: true + }, + 'postcss-nesting': {}, + 'postcss-combine-media-query': {}, + 'postcss-combine-duplicated-selectors': { + removeDuplicatedProperties: true, + removeDuplicatedValues: true + }, + 'cssnano': { preset: 'default' }, + } }; diff --git a/public/assets/app.js b/public/assets/app.js index e8471e65..f30dcde8 100644 --- a/public/assets/app.js +++ b/public/assets/app.js @@ -16,7 +16,17 @@ \*****************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _css_app_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../css/app.css */ \"./resources/css/app.css\");\n\n\n// import { Auth } from './auth.js';\n//\n// let auth = new Auth();\n\n// auth.createCredentials().then((credentials) => {\n// // eslint-disable-next-line no-console\n// console.log(credentials);\n// });//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYXBwLmpzIiwibWFwcGluZ3MiOiI7O0FBQXdCOztBQUV4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qYnVrLWZyb250ZW5kLy4vcmVzb3VyY2VzL2pzL2FwcC5qcz82ZDQwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi4vY3NzL2FwcC5jc3MnO1xuXG4vLyBpbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi9hdXRoLmpzJztcbi8vXG4vLyBsZXQgYXV0aCA9IG5ldyBBdXRoKCk7XG5cbi8vIGF1dGguY3JlYXRlQ3JlZGVudGlhbHMoKS50aGVuKChjcmVkZW50aWFscykgPT4ge1xuLy8gICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuLy8gICBjb25zb2xlLmxvZyhjcmVkZW50aWFscyk7XG4vLyB9KTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/app.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _css_app_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../css/app.css */ \"./resources/css/app.css\");\n/* harmony import */ var _auth_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./auth.js */ \"./resources/js/auth.js\");\n\n\nlet auth = new _auth_js__WEBPACK_IMPORTED_MODULE_1__.Auth();\ndocument.querySelectorAll('.add-passkey').forEach(el => {\n el.addEventListener('click', () => {\n auth.register();\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYXBwLmpzIiwibWFwcGluZ3MiOiI7OztBQUF3QjtBQUVTO0FBRWpDLElBQUlDLElBQUksR0FBRyxJQUFJRCwwQ0FBSSxDQUFDLENBQUM7QUFFckJFLFFBQVEsQ0FBQ0MsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUNDLE9BQU8sQ0FBRUMsRUFBRSxJQUFLO0VBQ3hEQSxFQUFFLENBQUNDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxNQUFNO0lBQ2pDTCxJQUFJLENBQUNNLFFBQVEsQ0FBQyxDQUFDO0VBQ2pCLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2pidWstZnJvbnRlbmQvLi9yZXNvdXJjZXMvanMvYXBwLmpzPzZkNDAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuLi9jc3MvYXBwLmNzcyc7XG5cbmltcG9ydCB7IEF1dGggfSBmcm9tICcuL2F1dGguanMnO1xuXG5sZXQgYXV0aCA9IG5ldyBBdXRoKCk7XG5cbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hZGQtcGFzc2tleScpLmZvckVhY2goKGVsKSA9PiB7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGF1dGgucmVnaXN0ZXIoKTtcbiAgfSk7XG59KTtcbiJdLCJuYW1lcyI6WyJBdXRoIiwiYXV0aCIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJlbCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZWdpc3RlciJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/app.js\n"); + +/***/ }), + +/***/ "./resources/js/auth.js": +/*!******************************!*\ + !*** ./resources/js/auth.js ***! + \******************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Auth: function() { return /* binding */ Auth; }\n/* harmony export */ });\nclass Auth {\n constructor() {}\n async register() {\n const {\n challenge,\n userId,\n existing\n } = await this.getRegisterData();\n const publicKeyCredentialCreationOptions = {\n challenge: new TextEncoder().encode(challenge),\n rp: {\n name: 'JB'\n },\n user: {\n id: new TextEncoder().encode(userId),\n name: 'jonny@jonnybarnes.uk',\n displayName: 'Jonny'\n },\n pubKeyCredParams: [{\n alg: -8,\n type: 'public-key'\n },\n // Ed25519\n {\n alg: -7,\n type: 'public-key'\n },\n // ES256\n {\n alg: -257,\n type: 'public-key'\n } // RS256\n ],\n\n excludeCredentials: existing,\n authenticatorSelection: {\n userVerification: 'preferred',\n residentKey: 'required'\n },\n timeout: 60000\n };\n const publicKeyCredential = await navigator.credentials.create({\n publicKey: publicKeyCredentialCreationOptions\n });\n if (!publicKeyCredential) {\n throw new Error('Error generating a passkey');\n }\n const {\n id // the key id a.k.a. kid\n } = publicKeyCredential;\n const publicKey = publicKeyCredential.response.getPublicKey();\n const transports = publicKeyCredential.response.getTransports();\n const response = publicKeyCredential.response;\n const clientJSONArrayBuffer = response.clientDataJSON;\n const clientJSON = JSON.parse(new TextDecoder().decode(clientJSONArrayBuffer));\n const clientChallenge = clientJSON.challenge;\n // base64 decode the challenge\n const clientChallengeDecoded = atob(clientChallenge);\n const saved = await this.savePasskey(id, publicKey, transports, clientChallengeDecoded);\n if (saved) {\n window.location.reload();\n } else {\n alert('There was an error saving the passkey');\n }\n }\n async getRegisterData() {\n const response = await fetch('/admin/passkeys/init');\n return await response.json();\n }\n async savePasskey(id, publicKey, transports, challenge) {\n const formData = new FormData();\n formData.append('id', id);\n formData.append('transports', JSON.stringify(transports));\n formData.append('challenge', challenge);\n\n // Convert the ArrayBuffer to a Uint8Array\n const publicKeyArray = new Uint8Array(publicKey);\n\n // Create a Blob from the Uint8Array\n const publicKeyBlob = new Blob([publicKeyArray], {\n type: 'application/octet-stream'\n });\n formData.append('public_key', publicKeyBlob);\n const response = await fetch('/admin/passkeys/save', {\n method: 'POST',\n body: formData,\n headers: {\n 'X-CSRF-TOKEN': document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content')\n }\n });\n return response.ok;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQy9CLEVBQUUsRUFBRWMsU0FBUyxFQUFFSSxVQUFVLEVBQUU1QixTQUFTLEVBQUU7SUFDdEQsTUFBTWdELFFBQVEsR0FBRyxJQUFJQyxRQUFRLENBQUMsQ0FBQztJQUMvQkQsUUFBUSxDQUFDRSxNQUFNLENBQUMsSUFBSSxFQUFFeEMsRUFBRSxDQUFDO0lBQ3pCc0MsUUFBUSxDQUFDRSxNQUFNLENBQUMsWUFBWSxFQUFFakIsSUFBSSxDQUFDa0IsU0FBUyxDQUFDdkIsVUFBVSxDQUFDLENBQUM7SUFDekRvQixRQUFRLENBQUNFLE1BQU0sQ0FBQyxXQUFXLEVBQUVsRCxTQUFTLENBQUM7O0lBRXZDO0lBQ0EsTUFBTW9ELGNBQWMsR0FBRyxJQUFJQyxVQUFVLENBQUM3QixTQUFTLENBQUM7O0lBRWhEO0lBQ0EsTUFBTThCLGFBQWEsR0FBRyxJQUFJQyxJQUFJLENBQUMsQ0FBQ0gsY0FBYyxDQUFDLEVBQUU7TUFBRXRDLElBQUksRUFBRTtJQUEyQixDQUFDLENBQUM7SUFFdEZrQyxRQUFRLENBQUNFLE1BQU0sQ0FBQyxZQUFZLEVBQUVJLGFBQWEsQ0FBQztJQUU1QyxNQUFNNUIsUUFBUSxHQUFHLE1BQU1vQixLQUFLLENBQUMsc0JBQXNCLEVBQUU7TUFDbkRVLE1BQU0sRUFBRSxNQUFNO01BQ2RDLElBQUksRUFBRVQsUUFBUTtNQUNkVSxPQUFPLEVBQUU7UUFDUCxjQUFjLEVBQUVDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUNDLFlBQVksQ0FBQyxTQUFTO01BQzFGO0lBQ0YsQ0FBQyxDQUFDO0lBRUYsT0FBT25DLFFBQVEsQ0FBQ29DLEVBQUU7RUFDcEI7QUFDRiIsInNvdXJjZXMiOlsid2VicGFjazovL2pidWstZnJvbnRlbmQvLi9yZXNvdXJjZXMvanMvYXV0aC5qcz84ZjRmIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEF1dGgge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgYXN5bmMgcmVnaXN0ZXIoKSB7XG4gICAgY29uc3QgeyBjaGFsbGVuZ2UsIHVzZXJJZCwgZXhpc3RpbmcgfSA9IGF3YWl0IHRoaXMuZ2V0UmVnaXN0ZXJEYXRhKCk7XG5cbiAgICBjb25zdCBwdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zID0ge1xuICAgICAgY2hhbGxlbmdlOiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoY2hhbGxlbmdlKSxcbiAgICAgIHJwOiB7XG4gICAgICAgIG5hbWU6ICdKQicsXG4gICAgICB9LFxuICAgICAgdXNlcjoge1xuICAgICAgICBpZDogbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHVzZXJJZCksXG4gICAgICAgIG5hbWU6ICdqb25ueUBqb25ueWJhcm5lcy51aycsXG4gICAgICAgIGRpc3BsYXlOYW1lOiAnSm9ubnknLFxuICAgICAgfSxcbiAgICAgIHB1YktleUNyZWRQYXJhbXM6IFtcbiAgICAgICAge2FsZzogLTgsIHR5cGU6ICdwdWJsaWMta2V5J30sIC8vIEVkMjU1MTlcbiAgICAgICAge2FsZzogLTcsIHR5cGU6ICdwdWJsaWMta2V5J30sIC8vIEVTMjU2XG4gICAgICAgIHthbGc6IC0yNTcsIHR5cGU6ICdwdWJsaWMta2V5J30sIC8vIFJTMjU2XG4gICAgICBdLFxuICAgICAgZXhjbHVkZUNyZWRlbnRpYWxzOiBleGlzdGluZyxcbiAgICAgIGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246IHtcbiAgICAgICAgdXNlclZlcmlmaWNhdGlvbjogJ3ByZWZlcnJlZCcsXG4gICAgICAgIHJlc2lkZW50S2V5OiAncmVxdWlyZWQnLFxuICAgICAgfSxcbiAgICAgIHRpbWVvdXQ6IDYwMDAwLFxuICAgIH07XG5cbiAgICBjb25zdCBwdWJsaWNLZXlDcmVkZW50aWFsID0gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSh7XG4gICAgICBwdWJsaWNLZXk6IHB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNcbiAgICB9KTtcbiAgICBpZiAoIXB1YmxpY0tleUNyZWRlbnRpYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgZ2VuZXJhdGluZyBhIHBhc3NrZXknKTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgaWQgLy8gdGhlIGtleSBpZCBhLmsuYS4ga2lkXG4gICAgfSA9IHB1YmxpY0tleUNyZWRlbnRpYWw7XG4gICAgY29uc3QgcHVibGljS2V5ID0gcHVibGljS2V5Q3JlZGVudGlhbC5yZXNwb25zZS5nZXRQdWJsaWNLZXkoKTtcbiAgICBjb25zdCB0cmFuc3BvcnRzID0gcHVibGljS2V5Q3JlZGVudGlhbC5yZXNwb25zZS5nZXRUcmFuc3BvcnRzKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBwdWJsaWNLZXlDcmVkZW50aWFsLnJlc3BvbnNlO1xuICAgIGNvbnN0IGNsaWVudEpTT05BcnJheUJ1ZmZlciA9IHJlc3BvbnNlLmNsaWVudERhdGFKU09OO1xuICAgIGNvbnN0IGNsaWVudEpTT04gPSBKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjbGllbnRKU09OQXJyYXlCdWZmZXIpKTtcbiAgICBjb25zdCBjbGllbnRDaGFsbGVuZ2UgPSBjbGllbnRKU09OLmNoYWxsZW5nZTtcbiAgICAvLyBiYXNlNjQgZGVjb2RlIHRoZSBjaGFsbGVuZ2VcbiAgICBjb25zdCBjbGllbnRDaGFsbGVuZ2VEZWNvZGVkID0gYXRvYihjbGllbnRDaGFsbGVuZ2UpO1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBhd2FpdCB0aGlzLnNhdmVQYXNza2V5KGlkLCBwdWJsaWNLZXksIHRyYW5zcG9ydHMsIGNsaWVudENoYWxsZW5nZURlY29kZWQpO1xuXG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsZXJ0KCdUaGVyZSB3YXMgYW4gZXJyb3Igc2F2aW5nIHRoZSBwYXNza2V5Jyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0UmVnaXN0ZXJEYXRhKCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hZG1pbi9wYXNza2V5cy9pbml0Jyk7XG5cbiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZVBhc3NrZXkoaWQsIHB1YmxpY0tleSwgdHJhbnNwb3J0cywgY2hhbGxlbmdlKSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2lkJywgaWQpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgndHJhbnNwb3J0cycsIEpTT04uc3RyaW5naWZ5KHRyYW5zcG9ydHMpKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2NoYWxsZW5nZScsIGNoYWxsZW5nZSk7XG5cbiAgICAvLyBDb252ZXJ0IHRoZSBBcnJheUJ1ZmZlciB0byBhIFVpbnQ4QXJyYXlcbiAgICBjb25zdCBwdWJsaWNLZXlBcnJheSA9IG5ldyBVaW50OEFycmF5KHB1YmxpY0tleSk7XG5cbiAgICAvLyBDcmVhdGUgYSBCbG9iIGZyb20gdGhlIFVpbnQ4QXJyYXlcbiAgICBjb25zdCBwdWJsaWNLZXlCbG9iID0gbmV3IEJsb2IoW3B1YmxpY0tleUFycmF5XSwgeyB0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9KTtcblxuICAgIGZvcm1EYXRhLmFwcGVuZCgncHVibGljX2tleScsIHB1YmxpY0tleUJsb2IpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FkbWluL3Bhc3NrZXlzL3NhdmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IGZvcm1EYXRhLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1DU1JGLVRPS0VOJzogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmdldEF0dHJpYnV0ZSgnY29udGVudCcpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXNwb25zZS5vaztcbiAgfVxufVxuXG5leHBvcnQgeyBBdXRoIH07XG4iXSwibmFtZXMiOlsiQXV0aCIsImNvbnN0cnVjdG9yIiwicmVnaXN0ZXIiLCJjaGFsbGVuZ2UiLCJ1c2VySWQiLCJleGlzdGluZyIsImdldFJlZ2lzdGVyRGF0YSIsInB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMiLCJUZXh0RW5jb2RlciIsImVuY29kZSIsInJwIiwibmFtZSIsInVzZXIiLCJpZCIsImRpc3BsYXlOYW1lIiwicHViS2V5Q3JlZFBhcmFtcyIsImFsZyIsInR5cGUiLCJleGNsdWRlQ3JlZGVudGlhbHMiLCJhdXRoZW50aWNhdG9yU2VsZWN0aW9uIiwidXNlclZlcmlmaWNhdGlvbiIsInJlc2lkZW50S2V5IiwidGltZW91dCIsInB1YmxpY0tleUNyZWRlbnRpYWwiLCJuYXZpZ2F0b3IiLCJjcmVkZW50aWFscyIsImNyZWF0ZSIsInB1YmxpY0tleSIsIkVycm9yIiwicmVzcG9uc2UiLCJnZXRQdWJsaWNLZXkiLCJ0cmFuc3BvcnRzIiwiZ2V0VHJhbnNwb3J0cyIsImNsaWVudEpTT05BcnJheUJ1ZmZlciIsImNsaWVudERhdGFKU09OIiwiY2xpZW50SlNPTiIsIkpTT04iLCJwYXJzZSIsIlRleHREZWNvZGVyIiwiZGVjb2RlIiwiY2xpZW50Q2hhbGxlbmdlIiwiY2xpZW50Q2hhbGxlbmdlRGVjb2RlZCIsImF0b2IiLCJzYXZlZCIsInNhdmVQYXNza2V5Iiwid2luZG93IiwibG9jYXRpb24iLCJyZWxvYWQiLCJhbGVydCIsImZldGNoIiwianNvbiIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJhcHBlbmQiLCJzdHJpbmdpZnkiLCJwdWJsaWNLZXlBcnJheSIsIlVpbnQ4QXJyYXkiLCJwdWJsaWNLZXlCbG9iIiwiQmxvYiIsIm1ldGhvZCIsImJvZHkiLCJoZWFkZXJzIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiZ2V0QXR0cmlidXRlIiwib2siXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/auth.js\n"); /***/ }), diff --git a/public/assets/app.js.br b/public/assets/app.js.br index dc6eb881df1f9dd789d3dfb90c0478bb9aabfa94..ed35c5c40262388d1ecc3d17265dd7ef77644d23 100644 GIT binary patch literal 20470 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 G%mx5QE~(Q1 literal 16895 zcma!E%^P?iFO~T&{zn70+CAVqEN-(fDXX_F za9s-eEL7lONHgZ!6kp^ ztap=hU%d4?^T!)ULYMY-h=$)jEPbENu=3^S?bG6)&p-XLb>7Scf}Uw*5>+?NHfk)I zF@aTQ{!j1A=iYx`{r}h8{ki9>-iNMGdq2Oa$u`cf;a<8^@{$DWDBZkUB~ep1R9Ei5 zQC4}AnITy4VD8FyHh*1B#T}10e_y@+R``?+^<)M8-DBm;ZZo$i9*BflJj~BC?{$C$&dS7*_S}5PjlIMlb7y0bW zyt_;FobC6w534I0o;S{5=(r+v;nF5c$vGaLo8MV}x4YBs?!mTj!-c!EkKYadGjH@x z#Ingd#6-lfoaba`b;=aZWH_?9Ai!&8iAN~k)NFCzGjo@$+qtMjLrQ#U`$p~yk3@ET zwLiF~;)l|EanUIOlk_yFsIYi2PE6SCC)7AuZ|lFXm{MO>^L-mO2(Ucl-j}KU|FRFm zoyY%oA7p5bJ9z*C793>Qf46Ijhp=Y#-;*W#k9Exc{K!17M7_1_ve+LXuN(U7_U_Uu z|IYXQ=Oudu1%*{SN>>#U4m513Z)j{R-B{vhnpc0tPTM#*^V!k=dww#>^KrEva9kk3 zA;Q(@q#JN|_Dv^wz4?y&>Q^{3y<=6lbtUD-?VBgRu|$<;`lcFtDMwT5p%{KqzpYMhLYN8&? zthl&);z^|lZQE;$^-f62uBlm;@1|rQnE6`Dc}Zr^*Af#pkqah=D`zlk?%XzswPx1a z-$nf{Z{ptA{NKBft%^;cGJU}`rYi};*-dk5D$QohD&E1r#U!LV5unFM0UDb=j}8Z*?VC+@8R(B%z_d zyy8n@3afT1|KTaMFC)1p+E(U-NPoHb)G)78I`KYp@b+Ur*M551=>KNvDl>n_6`m}= z4ehO#=ZbW0ni_ZM>nHID=gT)X)-RpRGsF|Y1=J)=iTF5{#8c5uPy#P zd%^YI?TePp7WM45y4!O%C#rh)i+01yo7Y*~n>l0Uo)c;pKg?^maJuB@-`6saeNJTG zs=KuC-dg6Sht)G4g!{7cZL0Y){The8C8t=};zupF15&STJNn?dl&xLM*MDCEYPdrq znBMbgEf@Xv_GFvveeDYd`&SpFKl$@5tu&pn$V2*ySb0N)XB_#Q$Am{u4m zE>k=q`_1+6%n0>Qr)LSzyJ`B>ZvVB=4L;ewLz#D-|L-czb~@nZ;ie-wtzKzQ3Y=oC zon)O;{Y+;bT`|$z@PnL&=JxMVOz)*@-`?F7KX2*Wv-h7?<;^+$Z}s%0A0~%t-`IHi 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 Kwf_r0qXGcgI%CoR diff --git a/resources/js/app.js b/resources/js/app.js index 69946e98..06c635a9 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,10 +1,11 @@ import '../css/app.css'; -// import { Auth } from './auth.js'; -// -// let auth = new Auth(); +import { Auth } from './auth.js'; -// auth.createCredentials().then((credentials) => { -// // eslint-disable-next-line no-console -// console.log(credentials); -// }); +let auth = new Auth(); + +document.querySelectorAll('.add-passkey').forEach((el) => { + el.addEventListener('click', () => { + auth.register(); + }); +}); diff --git a/resources/js/auth.js b/resources/js/auth.js index d181f62d..905db945 100644 --- a/resources/js/auth.js +++ b/resources/js/auth.js @@ -1,35 +1,88 @@ class Auth { constructor() {} - async createCredentials() { + async register() { + const { challenge, userId, existing } = await this.getRegisterData(); + const publicKeyCredentialCreationOptions = { - challenge: Uint8Array.from( - 'randomStringFromServer', - c => c.charCodeAt(0) - ), + challenge: new TextEncoder().encode(challenge), rp: { - id: 'jonnybarnes.localhost', name: 'JB', }, user: { - id: Uint8Array.from( - 'UZSL85T9AFC', - c => c.charCodeAt(0) - ), + id: new TextEncoder().encode(userId), name: 'jonny@jonnybarnes.uk', displayName: 'Jonny', }, - pubKeyCredParams: [{alg: -7, type: 'public-key'}], - // authenticatorSelection: { - // authenticatorAttachment: 'cross-platform', - // }, + pubKeyCredParams: [ + {alg: -8, type: 'public-key'}, // Ed25519 + {alg: -7, type: 'public-key'}, // ES256 + {alg: -257, type: 'public-key'}, // RS256 + ], + excludeCredentials: existing, + authenticatorSelection: { + userVerification: 'preferred', + residentKey: 'required', + }, timeout: 60000, - attestation: 'direct' }; - return await navigator.credentials.create({ + const publicKeyCredential = await navigator.credentials.create({ publicKey: publicKeyCredentialCreationOptions }); + if (!publicKeyCredential) { + throw new Error('Error generating a passkey'); + } + const { + id // the key id a.k.a. kid + } = publicKeyCredential; + const publicKey = publicKeyCredential.response.getPublicKey(); + const transports = publicKeyCredential.response.getTransports(); + const response = publicKeyCredential.response; + const clientJSONArrayBuffer = response.clientDataJSON; + const clientJSON = JSON.parse(new TextDecoder().decode(clientJSONArrayBuffer)); + const clientChallenge = clientJSON.challenge; + // base64 decode the challenge + const clientChallengeDecoded = atob(clientChallenge); + + const saved = await this.savePasskey(id, publicKey, transports, clientChallengeDecoded); + + if (saved) { + window.location.reload(); + } else { + alert('There was an error saving the passkey'); + } + } + + async getRegisterData() { + const response = await fetch('/admin/passkeys/init'); + + return await response.json(); + } + + async savePasskey(id, publicKey, transports, challenge) { + const formData = new FormData(); + formData.append('id', id); + formData.append('transports', JSON.stringify(transports)); + formData.append('challenge', challenge); + + // Convert the ArrayBuffer to a Uint8Array + const publicKeyArray = new Uint8Array(publicKey); + + // Create a Blob from the Uint8Array + const publicKeyBlob = new Blob([publicKeyArray], { type: 'application/octet-stream' }); + + formData.append('public_key', publicKeyBlob); + + const response = await fetch('/admin/passkeys/save', { + method: 'POST', + body: formData, + headers: { + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content'), + }, + }); + + return response.ok; } } diff --git a/resources/views/admin/passkeys/index.blade.php b/resources/views/admin/passkeys/index.blade.php new file mode 100644 index 00000000..09602162 --- /dev/null +++ b/resources/views/admin/passkeys/index.blade.php @@ -0,0 +1,18 @@ +@extends('master') + +@section('title')Passkeys « Admin CP « @stop + +@section('content') +

Passkeys

+ @if(count($passkeys) > 0) +

You have the following passkeys saved:

+
    + @foreach($passkeys as $passkey) +
  • {{ $passkey->passkey_id }}
  • + @endforeach +
+ @else +

You have no passkey saved.

+ @endif + +@stop diff --git a/resources/views/admin/welcome.blade.php b/resources/views/admin/welcome.blade.php index 3cce67d7..269ccdc5 100644 --- a/resources/views/admin/welcome.blade.php +++ b/resources/views/admin/welcome.blade.php @@ -54,6 +54,6 @@

Passkeys

- List passkeys here? + Manager your passkeys.

@stop diff --git a/resources/views/master.blade.php b/resources/views/master.blade.php index 944627c9..24eb5665 100644 --- a/resources/views/master.blade.php +++ b/resources/views/master.blade.php @@ -2,6 +2,7 @@ + @yield('title'){{ config('app.name') }} @if (!empty(config('app.font_link'))) diff --git a/routes/web.php b/routes/web.php index e5ace4e1..18a17619 100644 --- a/routes/web.php +++ b/routes/web.php @@ -7,6 +7,7 @@ use App\Http\Controllers\Admin\ContactsController as AdminContactsController; use App\Http\Controllers\Admin\HomeController; use App\Http\Controllers\Admin\LikesController as AdminLikesController; use App\Http\Controllers\Admin\NotesController as AdminNotesController; +use App\Http\Controllers\Admin\PasskeysController; use App\Http\Controllers\Admin\PlacesController as AdminPlacesController; use App\Http\Controllers\Admin\SyndicationTargetsController; use App\Http\Controllers\ArticlesController; @@ -141,6 +142,13 @@ Route::group(['domain' => config('url.longurl')], function () { Route::get('/', [BioController::class, 'show'])->name('admin.bio.show'); Route::put('/', [BioController::class, 'update']); }); + + // Passkeys + Route::group(['prefix' => 'passkeys'], static function () { + Route::get('/', [PasskeysController::class, 'index']); + Route::post('save', [PasskeysController::class, 'save']); + Route::get('/init', [PasskeysController::class, 'init']); + }); }); // Blog pages using ArticlesController From 03c8f20a8c342cd6edad153fd0bb53aefe8f5c92 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 27 Oct 2023 20:22:40 +0100 Subject: [PATCH 3/4] feat: Add Passkey support - Added a button for logging in with Passkeys in `login.blade.php` - Refactored the `register` method and added the `login` method in `auth.js` - Made various modifications and additions to the passkey functionality in `PasskeysController.php` - Added event listener for login-passkey element in `app.js` - Modified the passkeys table schema and made modifications to `Passkey.php` - Changed the redirect route in the `login` method of `AuthController.php` - Made modifications and additions to the routes in `web.php` - Added `"web-auth/webauthn-lib": "^4.7"` to the list of required packages in `composer.json` - Changed the redirect URL in `AdminTest.php` --- .../Controllers/Admin/PasskeysController.php | 276 +++++++-- app/Http/Controllers/AuthController.php | 2 +- app/Models/Passkey.php | 26 +- composer.json | 3 +- composer.lock | 583 +++++++++++++++++- .../2023_08_27_113904_create_passkeys.php | 3 +- public/assets/app.css | 2 +- public/assets/app.css.br | Bin 963 -> 974 bytes public/assets/app.js | 214 +------ public/assets/app.js.br | Bin 20470 -> 935 bytes resources/css/colours.css | 4 + resources/css/layout.css | 6 + resources/js/app.js | 6 + resources/js/auth.js | 198 ++++-- resources/views/login.blade.php | 1 + resources/views/master.blade.php | 13 +- routes/web.php | 6 +- tests/Feature/Admin/AdminTest.php | 2 +- 18 files changed, 982 insertions(+), 363 deletions(-) diff --git a/app/Http/Controllers/Admin/PasskeysController.php b/app/Http/Controllers/Admin/PasskeysController.php index 61388175..e493926e 100644 --- a/app/Http/Controllers/Admin/PasskeysController.php +++ b/app/Http/Controllers/Admin/PasskeysController.php @@ -7,11 +7,37 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\Passkey; use App\Models\User; +use Cose\Algorithm\Manager; +use Cose\Algorithm\Signature\ECDSA\ES256; +use Cose\Algorithm\Signature\EdDSA\Ed25519; +use Cose\Algorithm\Signature\RSA\RS256; +use Cose\Algorithms; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use Illuminate\View\View; +use ParagonIE\ConstantTime\Base64UrlSafe; +use Throwable; +use Webauthn\AttestationStatement\AttestationObjectLoader; +use Webauthn\AttestationStatement\AttestationStatementSupportManager; +use Webauthn\AttestationStatement\NoneAttestationStatementSupport; +use Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler; +use Webauthn\AuthenticatorAssertionResponse; +use Webauthn\AuthenticatorAssertionResponseValidator; +use Webauthn\AuthenticatorAttestationResponse; +use Webauthn\AuthenticatorAttestationResponseValidator; +use Webauthn\AuthenticatorSelectionCriteria; +use Webauthn\Exception\WebauthnException; +use Webauthn\PublicKeyCredentialCreationOptions; +use Webauthn\PublicKeyCredentialLoader; +use Webauthn\PublicKeyCredentialParameters; +use Webauthn\PublicKeyCredentialRequestOptions; +use Webauthn\PublicKeyCredentialRpEntity; +use Webauthn\PublicKeyCredentialSource; +use Webauthn\PublicKeyCredentialUserEntity; /** * @psalm-suppress UnusedClass @@ -20,74 +46,214 @@ class PasskeysController extends Controller { public function index(): View { + /** @var User $user */ $user = auth()->user(); $passkeys = $user->passkey; return view('admin.passkeys.index', compact('passkeys')); } - public function save(Request $request): JsonResponse - { - $validator = Validator::make($request->all(), [ - 'id' => 'required|string|unique:App\Models\Passkey,passkey_id', - 'public_key' => 'required|file', - 'transports' => 'required|json', - 'challenge' => 'required|string', - ]); - - if ($validator->fails()) { - return response()->json([ - 'success' => false, - 'message' => 'Passkey could not be saved (validation failed)', - ]); - } - - $validated = $validator->validated(); - - if ( - !session()->has('challenge') || - $validated['challenge'] !== session('challenge') - ) { - return response()->json([ - 'success' => false, - 'message' => 'Passkey could not be saved (challenge failed)', - ]); - } - - $passkey = new Passkey(); - $passkey->passkey_id = $validated['id']; - $passkey->passkey = $validated['public_key']->get(); - $passkey->transports = json_decode($validated['transports'], true, 512, JSON_THROW_ON_ERROR); - $passkey->user_id = auth()->user()->id; - $passkey->save(); - - return response()->json([ - 'success' => true, - 'message' => 'Passkey saved successfully', - ]); - } - - public function init(): JsonResponse + public function getCreateOptions(): JsonResponse { /** @var User $user */ $user = auth()->user(); - $passkeys = $user->passkey()->get(); - $existing = $passkeys->map(function (Passkey $passkey) { - return [ - 'id' => $passkey->passkey_id, - 'transports' => $passkey->transports, - 'type' => 'public-key', - ]; - })->all(); + // RP Entity i.e. the application + $rpEntity = PublicKeyCredentialRpEntity::create( + config('app.name'), + config('url.longurl'), + ); - $challenge = Hash::make(random_bytes(32)); - session(['challenge' => $challenge]); + // User Entity + $userEntity = PublicKeyCredentialUserEntity::create( + $user->name, + (string) $user->id, + $user->name, + ); + + // Challenge + $challenge = random_bytes(16); + + // List of supported public key parameters + $pubKeyCredParams = collect([ + Algorithms::COSE_ALGORITHM_EDDSA, + Algorithms::COSE_ALGORITHM_ES256, + Algorithms::COSE_ALGORITHM_RS256, + ])->map( + fn ($algorithm) => PublicKeyCredentialParameters::create('public-key', $algorithm) + )->toArray(); + + $authenticatorSelectionCriteria = AuthenticatorSelectionCriteria::create( + userVerification: AuthenticatorSelectionCriteria::USER_VERIFICATION_REQUIREMENT_REQUIRED, + residentKey: AuthenticatorSelectionCriteria::RESIDENT_KEY_REQUIREMENT_REQUIRED, + requireResidentKey: true, + ); + + $options = PublicKeyCredentialCreationOptions::create( + $rpEntity, + $userEntity, + $challenge, + $pubKeyCredParams, + authenticatorSelection: $authenticatorSelectionCriteria, + attestation: PublicKeyCredentialCreationOptions::ATTESTATION_CONVEYANCE_PREFERENCE_NONE + ); + + $options = json_encode($options, JSON_THROW_ON_ERROR); + + session(['create_options' => $options]); + + return JsonResponse::fromJsonString($options); + } + + public function create(Request $request): JsonResponse + { + /** @var User $user */ + $user = auth()->user(); + + $publicKeyCredentialCreationOptionsData = session('create_options'); + if (empty($publicKeyCredentialCreationOptionsData)) { + throw new WebAuthnException('No public key credential request options found'); + } + $publicKeyCredentialCreationOptions = PublicKeyCredentialCreationOptions::createFromString($publicKeyCredentialCreationOptionsData); + + // Unset session data to mitigate replay attacks + session()->forget('create_options'); + + $attestationSupportManager = AttestationStatementSupportManager::create(); + $attestationSupportManager->add(NoneAttestationStatementSupport::create()); + $attestationObjectLoader = AttestationObjectLoader::create($attestationSupportManager); + $publicKeyCredentialLoader = PublicKeyCredentialLoader::create($attestationObjectLoader); + + $publicKeyCredential = $publicKeyCredentialLoader->load(json_encode($request->all(), JSON_THROW_ON_ERROR)); + + if (!$publicKeyCredential->response instanceof AuthenticatorAttestationResponse) { + throw new WebAuthnException('Invalid response type'); + } + + $attestationStatementSupportManager = AttestationStatementSupportManager::create(); + $attestationStatementSupportManager->add(NoneAttestationStatementSupport::create()); + + $authenticatorAttestationResponseValidator = AuthenticatorAttestationResponseValidator::create( + attestationStatementSupportManager: $attestationStatementSupportManager, + publicKeyCredentialSourceRepository: null, + tokenBindingHandler: null, + extensionOutputCheckerHandler: ExtensionOutputCheckerHandler::create(), + ); + + $securedRelyingPartyId = []; + if (App::environment('local', 'development')) { + $securedRelyingPartyId = [config('url.longurl')]; + } + + $publicKeyCredentialSource = $authenticatorAttestationResponseValidator->check( + authenticatorAttestationResponse: $publicKeyCredential->response, + publicKeyCredentialCreationOptions: $publicKeyCredentialCreationOptions, + request: config('url.longurl'), + securedRelyingPartyId: $securedRelyingPartyId, + ); + + $user->passkey()->create([ + 'passkey_id' => Base64UrlSafe::encodeUnpadded($publicKeyCredentialSource->publicKeyCredentialId), + 'passkey' => json_encode($publicKeyCredentialSource, JSON_THROW_ON_ERROR), + ]); return response()->json([ - 'challenge' => $challenge, - 'userId' => $user->name, - 'existing' => $existing, + 'success' => true, + 'message' => 'Passkey created successfully', + ]); + } + + public function getRequestOptions(): JsonResponse + { + $publicKeyCredentialRequestOptions = PublicKeyCredentialRequestOptions::create( + challenge: random_bytes(16), + userVerification: PublicKeyCredentialRequestOptions::USER_VERIFICATION_REQUIREMENT_REQUIRED + ); + + $publicKeyCredentialRequestOptions = json_encode($publicKeyCredentialRequestOptions, JSON_THROW_ON_ERROR); + + session(['request_options' => $publicKeyCredentialRequestOptions]); + + return JsonResponse::fromJsonString($publicKeyCredentialRequestOptions); + } + + public function login(Request $request): JsonResponse + { + $requestOptions = session('request_options'); + session()->forget('request_options'); + + if (empty($requestOptions)) { + return response()->json([ + 'success' => false, + 'message' => 'No request options found', + ], 400); + } + + $publicKeyCredentialRequestOptions = PublicKeyCredentialRequestOptions::createFromString($requestOptions); + + $attestationSupportManager = AttestationStatementSupportManager::create(); + $attestationSupportManager->add(NoneAttestationStatementSupport::create()); + $attestationObjectLoader = AttestationObjectLoader::create($attestationSupportManager); + $publicKeyCredentialLoader = PublicKeyCredentialLoader::create($attestationObjectLoader); + + $publicKeyCredential = $publicKeyCredentialLoader->load(json_encode($request->all(), JSON_THROW_ON_ERROR)); + + if (!$publicKeyCredential->response instanceof AuthenticatorAssertionResponse) { + return response()->json([ + 'success' => false, + 'message' => 'Invalid response type', + ], 400); + } + + $passkey = Passkey::firstWhere('passkey_id', $publicKeyCredential->id); + if (!$passkey) { + return response()->json([ + 'success' => false, + 'message' => 'Passkey not found', + ], 404); + } + + $credential = PublicKeyCredentialSource::createFromArray(json_decode($passkey->passkey, true, 512, JSON_THROW_ON_ERROR)); + + $algorithmManager = Manager::create(); + $algorithmManager->add(new Ed25519()); + $algorithmManager->add(new ES256()); + $algorithmManager->add(new RS256()); + + $authenticatorAssertionResponseValidator = new AuthenticatorAssertionResponseValidator( + publicKeyCredentialSourceRepository: null, + tokenBindingHandler: null, + extensionOutputCheckerHandler: ExtensionOutputCheckerHandler::create(), + algorithmManager: $algorithmManager, + ); + + $securedRelyingPartyId = []; + if (App::environment('local', 'development')) { + $securedRelyingPartyId = [config('url.longurl')]; + } + + try { + $authenticatorAssertionResponseValidator->check( + credentialId: $credential, + authenticatorAssertionResponse: $publicKeyCredential->response, + publicKeyCredentialRequestOptions: $publicKeyCredentialRequestOptions, + request: config('url.longurl'), + userHandle: null, + securedRelyingPartyId: $securedRelyingPartyId, + ); + } catch (Throwable) { + return response()->json([ + 'success' => false, + 'message' => 'Passkey could not be verified', + ], 500); + } + + $user = User::find($passkey->user_id); + Auth::login($user); + + return response()->json([ + 'success' => true, + 'message' => 'Passkey verified successfully', ]); } } diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index fd927644..27f34eab 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -34,7 +34,7 @@ class AuthController extends Controller $credentials = $request->only('name', 'password'); if (Auth::attempt($credentials, true)) { - return redirect()->intended('/'); + return redirect()->intended('/admin'); } return redirect()->route('login'); diff --git a/app/Models/Passkey.php b/app/Models/Passkey.php index 64461eca..343fa40d 100644 --- a/app/Models/Passkey.php +++ b/app/Models/Passkey.php @@ -13,27 +13,11 @@ class Passkey extends Model { use HasFactory; - /** - * Save and access the passkey appropriately. - */ - protected function passkey(): Attribute - { - return Attribute::make( - get: static fn ($value) => stream_get_contents($value), - set: static fn ($value) => pg_escape_bytea($value), - ); - } - - /** - * Save and access the transports appropriately. - */ - protected function transports(): Attribute - { - return Attribute::make( - get: static fn ($value) => json_decode($value, true, 512, JSON_THROW_ON_ERROR), - set: static fn ($value) => json_encode($value, JSON_THROW_ON_ERROR), - ); - } + /** @inerhitDoc */ + protected $fillable = [ + 'passkey_id', + 'passkey', + ]; public function user(): BelongsTo { diff --git a/composer.json b/composer.json index c41e6eff..20a38b42 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,8 @@ "mf2/mf2": "~0.3", "spatie/commonmark-highlighter": "^3.0", "spatie/laravel-ignition": "^2.1", - "symfony/html-sanitizer": "^6.1" + "symfony/html-sanitizer": "^6.1", + "web-auth/webauthn-lib": "^4.7" }, "require-dev": { "barryvdh/laravel-debugbar": "^3.0", diff --git a/composer.lock b/composer.lock index 4b725649..0bf700cd 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a0824739b9d145bf875bf9ae54e89b07", + "content-hash": "d870e46c1890e6dc609f0d1b65340ec4", "packages": [ { "name": "aws/aws-crt-php", @@ -2363,6 +2363,70 @@ }, "time": "2023-02-15T16:40:09+00:00" }, + { + "name": "lcobucci/clock", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/clock.git", + "reference": "30a854ceb22bd87d83a7a4563b3f6312453945fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/30a854ceb22bd87d83a7a4563b3f6312453945fc", + "reference": "30a854ceb22bd87d83a7a4563b3f6312453945fc", + "shasum": "" + }, + "require": { + "php": "~8.2.0", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "infection/infection": "^0.26", + "lcobucci/coding-standard": "^10.0.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^10.0.17" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\Clock\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "LuĂ­s Cobucci", + "email": "lcobucci@gmail.com" + } + ], + "description": "Yet another clock abstraction", + "support": { + "issues": "https://github.com/lcobucci/clock/issues", + "source": "https://github.com/lcobucci/clock/tree/3.1.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2023-03-20T19:12:25+00:00" + }, { "name": "lcobucci/jwt", "version": "5.0.0", @@ -3797,6 +3861,73 @@ }, "time": "2021-10-12T14:12:29+00:00" }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "58c3f47f650c94ec05a151692652a868995d2938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2022-06-14T06:56:20+00:00" + }, { "name": "phpoption/phpoption", "version": "1.9.1", @@ -5024,6 +5155,199 @@ ], "time": "2023-08-23T06:24:34+00:00" }, + { + "name": "spomky-labs/cbor-php", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/Spomky-Labs/cbor-php.git", + "reference": "81d5dff7a1101d680729b5789f4359d01b15e6c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Spomky-Labs/cbor-php/zipball/81d5dff7a1101d680729b5789f4359d01b15e6c5", + "reference": "81d5dff7a1101d680729b5789f4359d01b15e6c5", + "shasum": "" + }, + "require": { + "brick/math": "^0.9|^0.10|^0.11", + "ext-mbstring": "*", + "php": ">=8.0" + }, + "require-dev": { + "ekino/phpstan-banned-code": "^1.0", + "ext-json": "*", + "infection/infection": "^0.26", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-beberlei-assert": "^1.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^10.0", + "qossmic/deptrac-shim": "^1.0", + "rector/rector": "^0.15", + "roave/security-advisories": "dev-latest", + "symfony/var-dumper": "^6.0", + "symplify/easy-coding-standard": "^11.1" + }, + "suggest": { + "ext-bcmath": "GMP or BCMath extensions will drastically improve the library performance. BCMath extension needed to handle the Big Float and Decimal Fraction Tags", + "ext-gmp": "GMP or BCMath extensions will drastically improve the library performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "CBOR\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florent Morselli", + "homepage": "https://github.com/Spomky" + }, + { + "name": "All contributors", + "homepage": "https://github.com/Spomky-Labs/cbor-php/contributors" + } + ], + "description": "CBOR Encoder/Decoder for PHP", + "keywords": [ + "Concise Binary Object Representation", + "RFC7049", + "cbor" + ], + "support": { + "issues": "https://github.com/Spomky-Labs/cbor-php/issues", + "source": "https://github.com/Spomky-Labs/cbor-php/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2023-02-28T21:37:12+00:00" + }, + { + "name": "spomky-labs/pki-framework", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/Spomky-Labs/pki-framework.git", + "reference": "d3ba688bf40e7c6e0dabf065ee18fc210734e760" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/d3ba688bf40e7c6e0dabf065ee18fc210734e760", + "reference": "d3ba688bf40e7c6e0dabf065ee18fc210734e760", + "shasum": "" + }, + "require": { + "brick/math": "^0.10 || ^0.11", + "ext-mbstring": "*", + "php": ">=8.1" + }, + "require-dev": { + "ekino/phpstan-banned-code": "^1.0", + "ext-gmp": "*", + "ext-openssl": "*", + "infection/infection": "^0.26", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-beberlei-assert": "^1.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^10.0", + "rector/rector": "^0.15", + "roave/security-advisories": "dev-latest", + "symfony/phpunit-bridge": "^6.1", + "symfony/var-dumper": "^6.1", + "symplify/easy-coding-standard": "^11.1", + "thecodingmachine/phpstan-safe-rule": "^1.2" + }, + "suggest": { + "ext-bcmath": "For better performance (or GMP)", + "ext-gmp": "For better performance (or BCMath)", + "ext-openssl": "For OpenSSL based cyphering" + }, + "type": "library", + "autoload": { + "psr-4": { + "SpomkyLabs\\Pki\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joni Eskelinen", + "email": "jonieske@gmail.com", + "role": "Original developer" + }, + { + "name": "Florent Morselli", + "email": "florent.morselli@spomky-labs.com", + "role": "Spomky-Labs PKI Framework developer" + } + ], + "description": "A PHP framework for managing Public Key Infrastructures. It comprises X.509 public key certificates, attribute certificates, certification requests and certification path validation.", + "homepage": "https://github.com/spomky-labs/pki-framework", + "keywords": [ + "DER", + "Private Key", + "ac", + "algorithm identifier", + "asn.1", + "asn1", + "attribute certificate", + "certificate", + "certification request", + "cryptography", + "csr", + "decrypt", + "ec", + "encrypt", + "pem", + "pkcs", + "public key", + "rsa", + "sign", + "signature", + "verify", + "x.509", + "x.690", + "x509", + "x690" + ], + "support": { + "issues": "https://github.com/Spomky-Labs/pki-framework/issues", + "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.1.0" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2023-02-13T17:21:24+00:00" + }, { "name": "symfony/console", "version": "v6.3.2", @@ -7552,6 +7876,258 @@ ], "time": "2022-03-08T17:03:00+00:00" }, + { + "name": "web-auth/cose-lib", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/web-auth/cose-lib.git", + "reference": "0ecad86d2d034ea22e2205d81c8cdec13d93a991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/web-auth/cose-lib/zipball/0ecad86d2d034ea22e2205d81c8cdec13d93a991", + "reference": "0ecad86d2d034ea22e2205d81c8cdec13d93a991", + "shasum": "" + }, + "require": { + "brick/math": "^0.9|^0.10|^0.11", + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "php": ">=8.1", + "spomky-labs/pki-framework": "^1.0" + }, + "require-dev": { + "ekino/phpstan-banned-code": "^1.0", + "infection/infection": "^0.27", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.7", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.2", + "phpunit/phpunit": "^10.1", + "qossmic/deptrac-shim": "^1.0", + "rector/rector": "^0.17", + "symfony/phpunit-bridge": "^6.1", + "symplify/easy-coding-standard": "^12.0" + }, + "suggest": { + "ext-bcmath": "For better performance, please install either GMP (recommended) or BCMath extension", + "ext-gmp": "For better performance, please install either GMP (recommended) or BCMath extension" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cose\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florent Morselli", + "homepage": "https://github.com/Spomky" + }, + { + "name": "All contributors", + "homepage": "https://github.com/web-auth/cose/contributors" + } + ], + "description": "CBOR Object Signing and Encryption (COSE) For PHP", + "homepage": "https://github.com/web-auth", + "keywords": [ + "COSE", + "RFC8152" + ], + "support": { + "issues": "https://github.com/web-auth/cose-lib/issues", + "source": "https://github.com/web-auth/cose-lib/tree/4.2.3" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2023-07-26T13:32:03+00:00" + }, + { + "name": "web-auth/metadata-service", + "version": "4.7.3", + "source": { + "type": "git", + "url": "https://github.com/web-auth/webauthn-metadata-service.git", + "reference": "1da1fc6d8055c75af4e46cde169d7b920b8af90a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/web-auth/webauthn-metadata-service/zipball/1da1fc6d8055c75af4e46cde169d7b920b8af90a", + "reference": "1da1fc6d8055c75af4e46cde169d7b920b8af90a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "lcobucci/clock": "^2.2|^3.0", + "paragonie/constant_time_encoding": "^2.6", + "php": ">=8.1", + "psr/clock": "^1.0", + "psr/event-dispatcher": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/log": "^1.0|^2.0|^3.0", + "spomky-labs/pki-framework": "^1.0", + "symfony/deprecation-contracts": "^3.2" + }, + "suggest": { + "psr/clock-implementation": "As of 4.5.x, the PSR Clock implementation will replace lcobucci/clock", + "psr/log-implementation": "Recommended to receive logs from the library", + "web-token/jwt-key-mgmt": "Mandatory for fetching Metadata Statement from distant sources", + "web-token/jwt-signature-algorithm-ecdsa": "Mandatory for fetching Metadata Statement from distant sources" + }, + "type": "library", + "extra": { + "thanks": { + "name": "web-auth/webauthn-framework", + "url": "https://github.com/web-auth/webauthn-framework" + } + }, + "autoload": { + "psr-4": { + "Webauthn\\MetadataService\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florent Morselli", + "homepage": "https://github.com/Spomky" + }, + { + "name": "All contributors", + "homepage": "https://github.com/web-auth/metadata-service/contributors" + } + ], + "description": "Metadata Service for FIDO2/Webauthn", + "homepage": "https://github.com/web-auth", + "keywords": [ + "FIDO2", + "fido", + "webauthn" + ], + "support": { + "source": "https://github.com/web-auth/webauthn-metadata-service/tree/4.7.3" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2023-10-07T13:59:48+00:00" + }, + { + "name": "web-auth/webauthn-lib", + "version": "4.7.3", + "source": { + "type": "git", + "url": "https://github.com/web-auth/webauthn-lib.git", + "reference": "d9b0d0563c561eaec5c24c46a551bf8ff23a030b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/web-auth/webauthn-lib/zipball/d9b0d0563c561eaec5c24c46a551bf8ff23a030b", + "reference": "d9b0d0563c561eaec5c24c46a551bf8ff23a030b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "paragonie/constant_time_encoding": "^2.6", + "php": ">=8.1", + "psr/event-dispatcher": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/log": "^1.0|^2.0|^3.0", + "spomky-labs/cbor-php": "^3.0", + "symfony/uid": "^6.1", + "web-auth/cose-lib": "^4.2.3", + "web-auth/metadata-service": "self.version" + }, + "require-dev": { + "symfony/event-dispatcher": "^6.1" + }, + "suggest": { + "psr/log-implementation": "Recommended to receive logs from the library", + "symfony/event-dispatcher": "Recommended to use dispatched events", + "web-token/jwt-key-mgmt": "Mandatory for the AndroidSafetyNet Attestation Statement support", + "web-token/jwt-signature-algorithm-ecdsa": "Recommended for the AndroidSafetyNet Attestation Statement support", + "web-token/jwt-signature-algorithm-eddsa": "Recommended for the AndroidSafetyNet Attestation Statement support", + "web-token/jwt-signature-algorithm-rsa": "Mandatory for the AndroidSafetyNet Attestation Statement support" + }, + "type": "library", + "extra": { + "thanks": { + "name": "web-auth/webauthn-framework", + "url": "https://github.com/web-auth/webauthn-framework" + } + }, + "autoload": { + "psr-4": { + "Webauthn\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florent Morselli", + "homepage": "https://github.com/Spomky" + }, + { + "name": "All contributors", + "homepage": "https://github.com/web-auth/webauthn-library/contributors" + } + ], + "description": "FIDO2/Webauthn Support For PHP", + "homepage": "https://github.com/web-auth", + "keywords": [ + "FIDO2", + "fido", + "webauthn" + ], + "support": { + "source": "https://github.com/web-auth/webauthn-lib/tree/4.7.3" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2023-10-15T11:54:31+00:00" + }, { "name": "webmozart/assert", "version": "1.11.0", @@ -12851,8 +13427,9 @@ "php": "^8.2", "ext-dom": "*", "ext-intl": "*", - "ext-json": "*" + "ext-json": "*", + "ext-pgsql": "*" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/database/migrations/2023_08_27_113904_create_passkeys.php b/database/migrations/2023_08_27_113904_create_passkeys.php index a2450d65..5341ec9f 100644 --- a/database/migrations/2023_08_27_113904_create_passkeys.php +++ b/database/migrations/2023_08_27_113904_create_passkeys.php @@ -15,8 +15,7 @@ return new class extends Migration $table->id(); $table->unsignedBigInteger('user_id'); $table->string('passkey_id')->unique(); - $table->binary('passkey'); - $table->json('transports'); + $table->text('passkey'); $table->timestamps(); $table->foreign('user_id')->references('id')->on('users'); diff --git a/public/assets/app.css b/public/assets/app.css index 71e197ea..b401b340 100644 --- a/public/assets/app.css +++ b/public/assets/app.css @@ -1 +1 @@ -:root{--font-family-headings:"Archer SSm A","Archer SSm B",serif;--font-family-body:"Verlag A","Verlag B",sans-serif;--font-family-monospace:"Operator Mono SSm A","Operator Mono SSm B",monospace;--font-size-sm:0.75rem;--font-size-base:1rem;--font-size-md:1.25rem;--font-size-lg:1.5rem;--font-size-xl:1.75rem;--font-size-xxl:2rem;--font-size-xxxl:2.25rem;--color-primary:#334700;--color-secondary:#e3ffb7;--color-link:#00649e;--color-link-visited:#bc7aff;--color-primary-shadow:rgba(16,25,0,.4)}@supports (color:color(display-p3 0 0 0)){:root{--color-primary:color(display-p3 0.21567 0.27838 0.03615);--color-secondary:color(display-p3 0.91016 0.99842 0.74082);--color-link:color(display-p3 0.01045 0.38351 0.63618);--color-link-visited:color(display-p3 0.70467 0.47549 0.99958);--color-primary-shadow:color(display-p3 0.06762 0.09646 0.00441/0.4)}}@supports (color:oklch(0% 0 0)){:root{--color-primary:oklch(36.8% 0.1 125.505);--color-secondary:oklch(96.3% 0.1 125.505);--color-link:oklch(48.09% 0.146 241.41);--color-link-visited:oklch(70.44% 0.21 304.41);--color-primary-shadow:oklch(19.56% 0.054 125.505/40%)}}body{background-color:var(--color-secondary);color:var(--color-primary);font-family:var(--font-family-body);font-size:var(--font-size-md)}code{font-family:var(--font-family-monospace)}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-headings)}.grid{display:grid;grid-template-columns:5vw 1fr 5vw;grid-template-rows:-webkit-min-content 1fr -webkit-min-content;grid-template-rows:min-content 1fr min-content;row-gap:1rem}#site-header{grid-column:2/3;grid-row:1/2}main{grid-row:2/3}footer,main{grid-column:2/3}footer{grid-row:3/4}footer .iwc-logo{max-width:85vw}a{color:var(--color-link)}a:visited{color:var(--color-link-visited)}#site-header a:visited{color:var(--color-link)}.hljs{border-radius:.5rem}.p-bridgy-twitter-content{display:none}.h-card .hovercard{-webkit-box-orient:vertical;-webkit-box-direction:normal;background-color:var(--color-secondary);border-radius:1rem;-webkit-box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);display:none;-ms-flex-direction:column;flex-direction:column;gap:.5rem;opacity:0;padding:1rem;position:absolute;-webkit-transition:opacity .5s ease-in-out;transition:opacity .5s ease-in-out;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;z-index:100}.h-card .hovercard .u-photo{max-width:6rem}.h-card .hovercard .social-icon{height:1rem;width:1rem}.h-card:hover .hovercard{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1}.h-entry{-webkit-border-start:1px solid var(--color-primary);-webkit-padding-start:.5rem;border-inline-start:1px solid var(--color-primary);padding-inline-start:.5rem}.h-entry .reply-to{font-style:italic}.h-entry .post-info a{text-decoration:none}.h-entry .note-metadata{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;gap:1rem}.h-entry .note-metadata .syndication-links{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.h-entry .note-metadata .syndication-links a{text-decoration:none}.h-entry .note-metadata .syndication-links a svg{height:1rem;width:1rem} +:root{--font-family-headings:"Archer SSm A","Archer SSm B",serif;--font-family-body:"Verlag A","Verlag B",sans-serif;--font-family-monospace:"Operator Mono SSm A","Operator Mono SSm B",monospace;--font-size-sm:0.75rem;--font-size-base:1rem;--font-size-md:1.25rem;--font-size-lg:1.5rem;--font-size-xl:1.75rem;--font-size-xxl:2rem;--font-size-xxxl:2.25rem;--color-primary:#334700;--color-secondary:#e3ffb7;--color-link:#00649e;--color-link-visited:#bc7aff;--color-primary-shadow:rgba(16,25,0,.4)}@supports (color:color(display-p3 0 0 0)){:root{--color-primary:color(display-p3 0.21567 0.27838 0.03615);--color-secondary:color(display-p3 0.91016 0.99842 0.74082);--color-link:color(display-p3 0.01045 0.38351 0.63618);--color-link-visited:color(display-p3 0.70467 0.47549 0.99958);--color-primary-shadow:color(display-p3 0.06762 0.09646 0.00441/0.4)}}@supports (color:oklch(0% 0 0)){:root{--color-primary:oklch(36.8% 0.1 125.505deg);--color-secondary:oklch(96.3% 0.1 125.505deg);--color-link:oklch(48.09% 0.146 241.41deg);--color-link-visited:oklch(70.44% 0.21 304.41deg);--color-primary-shadow:oklch(19.56% 0.054 125.505deg/40%)}}body{background-color:var(--color-secondary);color:var(--color-primary);font-family:var(--font-family-body);font-size:var(--font-size-md)}code{font-family:var(--font-family-monospace)}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-headings)}.grid{display:grid;grid-template-columns:5vw 1fr 5vw;grid-template-rows:-webkit-min-content 1fr -webkit-min-content;grid-template-rows:min-content 1fr min-content;row-gap:1rem}#site-header{grid-column:2/3;grid-row:1/2}main{grid-row:2/3}footer,main{grid-column:2/3}footer{grid-row:3/4}footer .iwc-logo{max-width:85vw}footer .footer-actions{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;gap:1rem}a{color:var(--color-link)}a:visited{color:var(--color-link-visited)}#site-header a:visited,a.auth:visited{color:var(--color-link)}.hljs{border-radius:.5rem}.h-card .hovercard{-webkit-box-orient:vertical;-webkit-box-direction:normal;background-color:var(--color-secondary);border-radius:1rem;-webkit-box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);display:none;-ms-flex-direction:column;flex-direction:column;gap:.5rem;opacity:0;padding:1rem;position:absolute;-webkit-transition:opacity .5s ease-in-out;transition:opacity .5s ease-in-out;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;z-index:100}.h-card .hovercard .u-photo{max-width:6rem}.h-card .hovercard .social-icon{height:1rem;width:1rem}.h-card:hover .hovercard{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1}.h-entry{-webkit-border-start:1px solid var(--color-primary);-webkit-padding-start:.5rem;border-inline-start:1px solid var(--color-primary);padding-inline-start:.5rem}.h-entry .reply-to{font-style:italic}.h-entry .post-info a{text-decoration:none}.h-entry .note-metadata{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;gap:1rem}.h-entry .note-metadata .syndication-links{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.h-entry .note-metadata .syndication-links a{text-decoration:none}.h-entry .note-metadata .syndication-links a svg{height:1rem;width:1rem} diff --git a/public/assets/app.css.br b/public/assets/app.css.br index f38bc392f07b926686758d024c9952e0b4da0501..26e19ed9c524beb1f2c01de69398134b3d3129c4 100644 GIT binary patch literal 974 zcmb1c;bo9%EqwfW(TQu;EgFXwepqyC*{v;ECgp;fu{HPWPZ^vvJKNjv)~?d^Nu~yE_3i)HaJ_NRU|RgT zW;s`{X)Vw5Me>>k?LzA-+JZQO_dQ(9$n)t_w({Dgr(Uv5_vYXKI{WCqJcCzHdY!~K z-*kCxRho10fy(dA;tHvz_u3VY+;P8lUCsA@yW*Ky9EtTED>b>wYDA9Db9i}w7r)S+ zThn*!D~uPOtnj65o7Z}y{&jBC_N-NGUNLcxk6N?lu5PpFtt?qS+WYgDZa+4~ed6Rl zx#vU={W_Z9^n17Tw5t<)XYyxU`+i}&?#>50^8W1Fb?R>BpBX<_WGGpsb*(XKzpk55 z|Dxnn<>95i3)d(n_S@W>v$QlhW5fJu6OPT#W^=!KC$*^AWXhZhhlNHdXKZy#zd1E` zKM`_090UCV5>(*CdJl(q{`&In(UTxd0Eftc9~!8Pjt_aFXcdT<7ts?Kyp=Up9p zhraxuTXe%siV><`a)srFggUS{dbPyelZtnw~Y%-VC~()&y64Wit_);c*x$W1k> z?eyZ7zF=h^ZolZ|7w0+YAq$*8t$JS&p02F^{a!Jfo8oMd=FE}>8is2`R$k;?@qP0S z?|JI(ncWhXO3%*7{jcT|^Se@I@-b)UJyVqK|LCyrEDEhwVJ&eLOgGn?R#d6%lx>H7%zec}Z;G!OJ`8@Tx^0eu^N&4$7TYhV zyz+vb=kt;SQ|4ssie1K3dF(>>uMbjlinr=l2r}ZhP7xrT$$sR%7C4#mm#)nLJB6k@M+u-cA0zrM#WTnx6z~d&DeQsyAPxamhRZ ze$Av1<%(=`W(!tnCHv{q>q=LA;tHtvq!?#gppY(pm+k+4=|f94UKhS@v$5=q_OHtd s$Dg}OuRP|p{Iy}xqet^Qj_5x4cQ(AVY~!O4k0uenr%?v~qAfYa0p3K{XaE2J literal 963 zcmb2X%)`)gsPO$Fjoc2!M+aO}SL*)GU&T9r=^5cQhikQ7eebCGkrKIfW6-x3jk`Qg zfA&+}{n`HdrLTi&jt2 z^tuqH7FsjaVtRXsAOt_MMKB z)g7^y?AD#h)mzg3^3<#Et2mS0n;mod*P+^!&ywp;eo%bfc}irKXyW$wPLVf1R2Hjv zyGTa1uU@^jyG`}+p>~_UR|L+is=Bo`!7@sJ&*@2ADmF~n+-#XApE-4=3X0fhf8d%w zYbK|iOr<$b>QcFNGrzU9S7!9>}(`ee#B@Z0x#AkALSdzcRrgAW3@}r?WuD zVil$m-%Tv`U{}bw(sj<#XB7DR&KZv^A!*o?6=d{P@#(5uICa$RvC7wMzPZ zIcC0Q>NJ!26Rxor1?(0RNU%Kqzftj#zB+Ni zKq&J{;_ltub$h<09y1E=lSzy{W}`GSNze9~nPs(>AN|& zVNLFpeJ3R)Mc@6fx7?V-peP&aSMkNCFlkTx&zBJ{yWDnWMm^hmRylm(WCQ8yu)oTA zw;p_L+@;sxuEz5{a*NTEWttB4Xd*@;wN){M`BC$Rq1W zx25N!)i3bn*gTehBs4>9r|!~|wNHXxEPEw5eWLu-92v*?&W~0U-G0M9=}qz-ryWK{ z0!M$`IA}8M<>F8C{{^VjwybHBWY6{ST=;NykGAY>i|-px#jw8*VO}eztRQ;WM3zw| zcH#LYa|(}rRkdDOY_ {\n el.addEventListener('click', () => {\n auth.register();\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYXBwLmpzIiwibWFwcGluZ3MiOiI7OztBQUF3QjtBQUVTO0FBRWpDLElBQUlDLElBQUksR0FBRyxJQUFJRCwwQ0FBSSxDQUFDLENBQUM7QUFFckJFLFFBQVEsQ0FBQ0MsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUNDLE9BQU8sQ0FBRUMsRUFBRSxJQUFLO0VBQ3hEQSxFQUFFLENBQUNDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxNQUFNO0lBQ2pDTCxJQUFJLENBQUNNLFFBQVEsQ0FBQyxDQUFDO0VBQ2pCLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2pidWstZnJvbnRlbmQvLi9yZXNvdXJjZXMvanMvYXBwLmpzPzZkNDAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuLi9jc3MvYXBwLmNzcyc7XG5cbmltcG9ydCB7IEF1dGggfSBmcm9tICcuL2F1dGguanMnO1xuXG5sZXQgYXV0aCA9IG5ldyBBdXRoKCk7XG5cbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hZGQtcGFzc2tleScpLmZvckVhY2goKGVsKSA9PiB7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGF1dGgucmVnaXN0ZXIoKTtcbiAgfSk7XG59KTtcbiJdLCJuYW1lcyI6WyJBdXRoIiwiYXV0aCIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJlbCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZWdpc3RlciJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/app.js\n"); - -/***/ }), - -/***/ "./resources/js/auth.js": -/*!******************************!*\ - !*** ./resources/js/auth.js ***! - \******************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Auth: function() { return /* binding */ Auth; }\n/* harmony export */ });\nclass Auth {\n constructor() {}\n async register() {\n const {\n challenge,\n userId,\n existing\n } = await this.getRegisterData();\n const publicKeyCredentialCreationOptions = {\n challenge: new TextEncoder().encode(challenge),\n rp: {\n name: 'JB'\n },\n user: {\n id: new TextEncoder().encode(userId),\n name: 'jonny@jonnybarnes.uk',\n displayName: 'Jonny'\n },\n pubKeyCredParams: [{\n alg: -8,\n type: 'public-key'\n },\n // Ed25519\n {\n alg: -7,\n type: 'public-key'\n },\n // ES256\n {\n alg: -257,\n type: 'public-key'\n } // RS256\n ],\n\n excludeCredentials: existing,\n authenticatorSelection: {\n userVerification: 'preferred',\n residentKey: 'required'\n },\n timeout: 60000\n };\n const publicKeyCredential = await navigator.credentials.create({\n publicKey: publicKeyCredentialCreationOptions\n });\n if (!publicKeyCredential) {\n throw new Error('Error generating a passkey');\n }\n const {\n id // the key id a.k.a. kid\n } = publicKeyCredential;\n const publicKey = publicKeyCredential.response.getPublicKey();\n const transports = publicKeyCredential.response.getTransports();\n const response = publicKeyCredential.response;\n const clientJSONArrayBuffer = response.clientDataJSON;\n const clientJSON = JSON.parse(new TextDecoder().decode(clientJSONArrayBuffer));\n const clientChallenge = clientJSON.challenge;\n // base64 decode the challenge\n const clientChallengeDecoded = atob(clientChallenge);\n const saved = await this.savePasskey(id, publicKey, transports, clientChallengeDecoded);\n if (saved) {\n window.location.reload();\n } else {\n alert('There was an error saving the passkey');\n }\n }\n async getRegisterData() {\n const response = await fetch('/admin/passkeys/init');\n return await response.json();\n }\n async savePasskey(id, publicKey, transports, challenge) {\n const formData = new FormData();\n formData.append('id', id);\n formData.append('transports', JSON.stringify(transports));\n formData.append('challenge', challenge);\n\n // Convert the ArrayBuffer to a Uint8Array\n const publicKeyArray = new Uint8Array(publicKey);\n\n // Create a Blob from the Uint8Array\n const publicKeyBlob = new Blob([publicKeyArray], {\n type: 'application/octet-stream'\n });\n formData.append('public_key', publicKeyBlob);\n const response = await fetch('/admin/passkeys/save', {\n method: 'POST',\n body: formData,\n headers: {\n 'X-CSRF-TOKEN': document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content')\n }\n });\n return response.ok;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQy9CLEVBQUUsRUFBRWMsU0FBUyxFQUFFSSxVQUFVLEVBQUU1QixTQUFTLEVBQUU7SUFDdEQsTUFBTWdELFFBQVEsR0FBRyxJQUFJQyxRQUFRLENBQUMsQ0FBQztJQUMvQkQsUUFBUSxDQUFDRSxNQUFNLENBQUMsSUFBSSxFQUFFeEMsRUFBRSxDQUFDO0lBQ3pCc0MsUUFBUSxDQUFDRSxNQUFNLENBQUMsWUFBWSxFQUFFakIsSUFBSSxDQUFDa0IsU0FBUyxDQUFDdkIsVUFBVSxDQUFDLENBQUM7SUFDekRvQixRQUFRLENBQUNFLE1BQU0sQ0FBQyxXQUFXLEVBQUVsRCxTQUFTLENBQUM7O0lBRXZDO0lBQ0EsTUFBTW9ELGNBQWMsR0FBRyxJQUFJQyxVQUFVLENBQUM3QixTQUFTLENBQUM7O0lBRWhEO0lBQ0EsTUFBTThCLGFBQWEsR0FBRyxJQUFJQyxJQUFJLENBQUMsQ0FBQ0gsY0FBYyxDQUFDLEVBQUU7TUFBRXRDLElBQUksRUFBRTtJQUEyQixDQUFDLENBQUM7SUFFdEZrQyxRQUFRLENBQUNFLE1BQU0sQ0FBQyxZQUFZLEVBQUVJLGFBQWEsQ0FBQztJQUU1QyxNQUFNNUIsUUFBUSxHQUFHLE1BQU1vQixLQUFLLENBQUMsc0JBQXNCLEVBQUU7TUFDbkRVLE1BQU0sRUFBRSxNQUFNO01BQ2RDLElBQUksRUFBRVQsUUFBUTtNQUNkVSxPQUFPLEVBQUU7UUFDUCxjQUFjLEVBQUVDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUNDLFlBQVksQ0FBQyxTQUFTO01BQzFGO0lBQ0YsQ0FBQyxDQUFDO0lBRUYsT0FBT25DLFFBQVEsQ0FBQ29DLEVBQUU7RUFDcEI7QUFDRiIsInNvdXJjZXMiOlsid2VicGFjazovL2pidWstZnJvbnRlbmQvLi9yZXNvdXJjZXMvanMvYXV0aC5qcz84ZjRmIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEF1dGgge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgYXN5bmMgcmVnaXN0ZXIoKSB7XG4gICAgY29uc3QgeyBjaGFsbGVuZ2UsIHVzZXJJZCwgZXhpc3RpbmcgfSA9IGF3YWl0IHRoaXMuZ2V0UmVnaXN0ZXJEYXRhKCk7XG5cbiAgICBjb25zdCBwdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zID0ge1xuICAgICAgY2hhbGxlbmdlOiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoY2hhbGxlbmdlKSxcbiAgICAgIHJwOiB7XG4gICAgICAgIG5hbWU6ICdKQicsXG4gICAgICB9LFxuICAgICAgdXNlcjoge1xuICAgICAgICBpZDogbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHVzZXJJZCksXG4gICAgICAgIG5hbWU6ICdqb25ueUBqb25ueWJhcm5lcy51aycsXG4gICAgICAgIGRpc3BsYXlOYW1lOiAnSm9ubnknLFxuICAgICAgfSxcbiAgICAgIHB1YktleUNyZWRQYXJhbXM6IFtcbiAgICAgICAge2FsZzogLTgsIHR5cGU6ICdwdWJsaWMta2V5J30sIC8vIEVkMjU1MTlcbiAgICAgICAge2FsZzogLTcsIHR5cGU6ICdwdWJsaWMta2V5J30sIC8vIEVTMjU2XG4gICAgICAgIHthbGc6IC0yNTcsIHR5cGU6ICdwdWJsaWMta2V5J30sIC8vIFJTMjU2XG4gICAgICBdLFxuICAgICAgZXhjbHVkZUNyZWRlbnRpYWxzOiBleGlzdGluZyxcbiAgICAgIGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246IHtcbiAgICAgICAgdXNlclZlcmlmaWNhdGlvbjogJ3ByZWZlcnJlZCcsXG4gICAgICAgIHJlc2lkZW50S2V5OiAncmVxdWlyZWQnLFxuICAgICAgfSxcbiAgICAgIHRpbWVvdXQ6IDYwMDAwLFxuICAgIH07XG5cbiAgICBjb25zdCBwdWJsaWNLZXlDcmVkZW50aWFsID0gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSh7XG4gICAgICBwdWJsaWNLZXk6IHB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNcbiAgICB9KTtcbiAgICBpZiAoIXB1YmxpY0tleUNyZWRlbnRpYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgZ2VuZXJhdGluZyBhIHBhc3NrZXknKTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgaWQgLy8gdGhlIGtleSBpZCBhLmsuYS4ga2lkXG4gICAgfSA9IHB1YmxpY0tleUNyZWRlbnRpYWw7XG4gICAgY29uc3QgcHVibGljS2V5ID0gcHVibGljS2V5Q3JlZGVudGlhbC5yZXNwb25zZS5nZXRQdWJsaWNLZXkoKTtcbiAgICBjb25zdCB0cmFuc3BvcnRzID0gcHVibGljS2V5Q3JlZGVudGlhbC5yZXNwb25zZS5nZXRUcmFuc3BvcnRzKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBwdWJsaWNLZXlDcmVkZW50aWFsLnJlc3BvbnNlO1xuICAgIGNvbnN0IGNsaWVudEpTT05BcnJheUJ1ZmZlciA9IHJlc3BvbnNlLmNsaWVudERhdGFKU09OO1xuICAgIGNvbnN0IGNsaWVudEpTT04gPSBKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjbGllbnRKU09OQXJyYXlCdWZmZXIpKTtcbiAgICBjb25zdCBjbGllbnRDaGFsbGVuZ2UgPSBjbGllbnRKU09OLmNoYWxsZW5nZTtcbiAgICAvLyBiYXNlNjQgZGVjb2RlIHRoZSBjaGFsbGVuZ2VcbiAgICBjb25zdCBjbGllbnRDaGFsbGVuZ2VEZWNvZGVkID0gYXRvYihjbGllbnRDaGFsbGVuZ2UpO1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBhd2FpdCB0aGlzLnNhdmVQYXNza2V5KGlkLCBwdWJsaWNLZXksIHRyYW5zcG9ydHMsIGNsaWVudENoYWxsZW5nZURlY29kZWQpO1xuXG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsZXJ0KCdUaGVyZSB3YXMgYW4gZXJyb3Igc2F2aW5nIHRoZSBwYXNza2V5Jyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0UmVnaXN0ZXJEYXRhKCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hZG1pbi9wYXNza2V5cy9pbml0Jyk7XG5cbiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZVBhc3NrZXkoaWQsIHB1YmxpY0tleSwgdHJhbnNwb3J0cywgY2hhbGxlbmdlKSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2lkJywgaWQpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgndHJhbnNwb3J0cycsIEpTT04uc3RyaW5naWZ5KHRyYW5zcG9ydHMpKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2NoYWxsZW5nZScsIGNoYWxsZW5nZSk7XG5cbiAgICAvLyBDb252ZXJ0IHRoZSBBcnJheUJ1ZmZlciB0byBhIFVpbnQ4QXJyYXlcbiAgICBjb25zdCBwdWJsaWNLZXlBcnJheSA9IG5ldyBVaW50OEFycmF5KHB1YmxpY0tleSk7XG5cbiAgICAvLyBDcmVhdGUgYSBCbG9iIGZyb20gdGhlIFVpbnQ4QXJyYXlcbiAgICBjb25zdCBwdWJsaWNLZXlCbG9iID0gbmV3IEJsb2IoW3B1YmxpY0tleUFycmF5XSwgeyB0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9KTtcblxuICAgIGZvcm1EYXRhLmFwcGVuZCgncHVibGljX2tleScsIHB1YmxpY0tleUJsb2IpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FkbWluL3Bhc3NrZXlzL3NhdmUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IGZvcm1EYXRhLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1DU1JGLVRPS0VOJzogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmdldEF0dHJpYnV0ZSgnY29udGVudCcpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXNwb25zZS5vaztcbiAgfVxufVxuXG5leHBvcnQgeyBBdXRoIH07XG4iXSwibmFtZXMiOlsiQXV0aCIsImNvbnN0cnVjdG9yIiwicmVnaXN0ZXIiLCJjaGFsbGVuZ2UiLCJ1c2VySWQiLCJleGlzdGluZyIsImdldFJlZ2lzdGVyRGF0YSIsInB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMiLCJUZXh0RW5jb2RlciIsImVuY29kZSIsInJwIiwibmFtZSIsInVzZXIiLCJpZCIsImRpc3BsYXlOYW1lIiwicHViS2V5Q3JlZFBhcmFtcyIsImFsZyIsInR5cGUiLCJleGNsdWRlQ3JlZGVudGlhbHMiLCJhdXRoZW50aWNhdG9yU2VsZWN0aW9uIiwidXNlclZlcmlmaWNhdGlvbiIsInJlc2lkZW50S2V5IiwidGltZW91dCIsInB1YmxpY0tleUNyZWRlbnRpYWwiLCJuYXZpZ2F0b3IiLCJjcmVkZW50aWFscyIsImNyZWF0ZSIsInB1YmxpY0tleSIsIkVycm9yIiwicmVzcG9uc2UiLCJnZXRQdWJsaWNLZXkiLCJ0cmFuc3BvcnRzIiwiZ2V0VHJhbnNwb3J0cyIsImNsaWVudEpTT05BcnJheUJ1ZmZlciIsImNsaWVudERhdGFKU09OIiwiY2xpZW50SlNPTiIsIkpTT04iLCJwYXJzZSIsIlRleHREZWNvZGVyIiwiZGVjb2RlIiwiY2xpZW50Q2hhbGxlbmdlIiwiY2xpZW50Q2hhbGxlbmdlRGVjb2RlZCIsImF0b2IiLCJzYXZlZCIsInNhdmVQYXNza2V5Iiwid2luZG93IiwibG9jYXRpb24iLCJyZWxvYWQiLCJhbGVydCIsImZldGNoIiwianNvbiIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJhcHBlbmQiLCJzdHJpbmdpZnkiLCJwdWJsaWNLZXlBcnJheSIsIlVpbnQ4QXJyYXkiLCJwdWJsaWNLZXlCbG9iIiwiQmxvYiIsIm1ldGhvZCIsImJvZHkiLCJoZWFkZXJzIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiZ2V0QXR0cmlidXRlIiwib2siXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/auth.js\n"); - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./resources/css/app.css": -/*!***********************************************************************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./resources/css/app.css ***! - \***********************************************************************************************************************************************************************/ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"./node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--font-family-headings:\\\"Archer SSm A\\\",\\\"Archer SSm B\\\",serif;--font-family-body:\\\"Verlag A\\\",\\\"Verlag B\\\",sans-serif;--font-family-monospace:\\\"Operator Mono SSm A\\\",\\\"Operator Mono SSm B\\\",monospace;--font-size-sm:0.75rem;--font-size-base:1rem;--font-size-md:1.25rem;--font-size-lg:1.5rem;--font-size-xl:1.75rem;--font-size-xxl:2rem;--font-size-xxxl:2.25rem;--color-primary:#334700;--color-secondary:#e3ffb7;--color-link:#00649e;--color-link-visited:#bc7aff;--color-primary-shadow:rgba(16,25,0,.4)}@supports (color:color(display-p3 0 0 0)){:root{--color-primary:color(display-p3 0.21567 0.27838 0.03615);--color-secondary:color(display-p3 0.91016 0.99842 0.74082);--color-link:color(display-p3 0.01045 0.38351 0.63618);--color-link-visited:color(display-p3 0.70467 0.47549 0.99958);--color-primary-shadow:color(display-p3 0.06762 0.09646 0.00441/0.4)}}@supports (color:oklch(0% 0 0)){:root{--color-primary:oklch(36.8% 0.1 125.505deg);--color-secondary:oklch(96.3% 0.1 125.505deg);--color-link:oklch(48.09% 0.146 241.41deg);--color-link-visited:oklch(70.44% 0.21 304.41deg);--color-primary-shadow:oklch(19.56% 0.054 125.505deg/40%)}}body{background-color:var(--color-secondary);color:var(--color-primary);font-family:var(--font-family-body);font-size:var(--font-size-md)}code{font-family:var(--font-family-monospace)}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-headings)}.grid{display:grid;grid-template-columns:5vw 1fr 5vw;grid-template-rows:-webkit-min-content 1fr -webkit-min-content;grid-template-rows:min-content 1fr min-content;row-gap:1rem}#site-header{grid-column:2/3;grid-row:1/2}main{grid-row:2/3}footer,main{grid-column:2/3}footer{grid-row:3/4}footer .iwc-logo{max-width:85vw}a{color:var(--color-link)}a:visited{color:var(--color-link-visited)}#site-header a:visited{color:var(--color-link)}.hljs{border-radius:.5rem}.h-card .hovercard{-webkit-box-orient:vertical;-webkit-box-direction:normal;background-color:var(--color-secondary);border-radius:1rem;-webkit-box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);display:none;-ms-flex-direction:column;flex-direction:column;gap:.5rem;opacity:0;padding:1rem;position:absolute;-webkit-transition:opacity .5s ease-in-out;transition:opacity .5s ease-in-out;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;z-index:100}.h-card .hovercard .u-photo{max-width:6rem}.h-card .hovercard .social-icon{height:1rem;width:1rem}.h-card:hover .hovercard{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1}.h-entry{-webkit-border-start:1px solid var(--color-primary);-webkit-padding-start:.5rem;border-inline-start:1px solid var(--color-primary);padding-inline-start:.5rem}.h-entry .reply-to{font-style:italic}.h-entry .post-info a{text-decoration:none}.h-entry .note-metadata{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;gap:1rem}.h-entry .note-metadata .syndication-links{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.h-entry .note-metadata .syndication-links a{text-decoration:none}.h-entry .note-metadata .syndication-links a svg{height:1rem;width:1rem}\", \"\",{\"version\":3,\"sources\":[\"webpack://./resources/css/variables.css\",\"webpack://./resources/css/fonts.css\",\"webpack://./resources/css/colours.css\",\"webpack://./resources/css/layout.css\",\"webpack://./resources/css/code.css\",\"webpack://./resources/css/h-card.css\",\"webpack://./resources/css/content.css\"],\"names\":[],\"mappings\":\"AAAA,MAEE,0DAA6D,CAC7D,mDAAsD,CACtD,6EAAgF,CAGhF,sBAAuB,CACvB,qBAAsB,CACtB,sBAAuB,CACvB,qBAAsB,CACtB,sBAAuB,CACvB,oBAAqB,CACrB,wBAAyB,CAGzB,uBAA4C,CAC5C,yBAA8C,CAC9C,oBAA2C,CAC3C,4BAAkD,CAClD,uCACF,CArBA,0CAAA,MAgBE,yDAA4C,CAC5C,2DAA8C,CAC9C,sDAA2C,CAC3C,8DAAkD,CAClD,oEACF,CAAA,CArBA,gCAAA,MAgBE,2CAA4C,CAC5C,6CAA8C,CAC9C,0CAA2C,CAC3C,iDAAkD,CAClD,yDACF,CAAA,CCrBA,KCCE,uCAAwC,CACxC,0BAA2B,CDD3B,mCAAoC,CACpC,6BACF,CAEA,KACE,wCACF,CAEA,kBAME,uCACF,CEhBA,MACE,YAAa,CACb,iCAAkC,CAClC,8DAA+C,CAA/C,8CAA+C,CAC/C,YACF,CAEA,aACE,eAAkB,CAClB,YACF,CAEA,KAEE,YACF,CAEA,YAJE,eAWF,CAPA,OAEE,YAKF,CAHE,iBACE,cACF,CDlBF,EACE,uBAKF,CAHE,UACE,+BACF,CAIA,uBACE,uBACF,CEhBF,MACE,mBACF,CCDE,mBAWE,2BAAsB,CAAtB,4BAAsB,CAJtB,uCAAwC,CAFxC,kBAAmB,CACnB,kEAA2D,CAA3D,0DAA2D,CAL3D,YAAa,CAUb,yBAAsB,CAAtB,qBAAsB,CACtB,SAAU,CAFV,SAAU,CANV,YAAa,CAFb,iBAAkB,CAOlB,0CAAoC,CAApC,kCAAoC,CADpC,yBAAkB,CAAlB,sBAAkB,CAAlB,iBAAkB,CALlB,WAmBF,CARE,4BACE,cACF,CAEA,gCAEE,WAAY,CADZ,UAEF,CAIA,yBACE,mBAAa,CAAb,mBAAa,CAAb,YAAa,CACb,SACF,CC3BJ,SACE,mDAAmD,CACnD,2BAA2B,CAD3B,kDAAmD,CACnD,0BA8BF,CA5BE,mBACE,iBACF,CAGE,sBACE,oBACF,CAGF,wBAEE,6BAAmB,CAAnB,4BAAmB,CADnB,mBAAa,CAAb,mBAAa,CAAb,YAAa,CACb,sBAAmB,CAAnB,kBAAmB,CACnB,QAcF,CAZE,2CACE,6BAAmB,CAAnB,4BAAmB,CAAnB,sBAAmB,CAAnB,kBAUF,CARE,6CACE,oBAMF,CAJE,iDAEE,WAAY,CADZ,UAEF\",\"sourcesContent\":[\":root {\\n /* Font Family */\\n --font-family-headings: \\\"Archer SSm A\\\", \\\"Archer SSm B\\\", serif;\\n --font-family-body: \\\"Verlag A\\\", \\\"Verlag B\\\", sans-serif;\\n --font-family-monospace: \\\"Operator Mono SSm A\\\", \\\"Operator Mono SSm B\\\", monospace;\\n\\n /* Font Size */\\n --font-size-sm: 0.75rem; /* 12px */\\n --font-size-base: 1rem; /* 16px, base */\\n --font-size-md: 1.25rem; /* 20px */\\n --font-size-lg: 1.5rem; /* 24px */\\n --font-size-xl: 1.75rem; /* 28px */\\n --font-size-xxl: 2rem; /* 32px */\\n --font-size-xxxl: 2.25rem; /* 36px */\\n\\n /* Colours */\\n --color-primary: oklch(36.8% 0.1 125.505deg);\\n --color-secondary: oklch(96.3% 0.1 125.505deg);\\n --color-link: oklch(48.09% 0.146 241.41deg);\\n --color-link-visited: oklch(70.44% 0.21 304.41deg);\\n --color-primary-shadow: oklch(19.56% 0.054 125.505deg / 40%);\\n}\\n\",\"body {\\n font-family: var(--font-family-body);\\n font-size: var(--font-size-md);\\n}\\n\\ncode {\\n font-family: var(--font-family-monospace);\\n}\\n\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n font-family: var(--font-family-headings);\\n}\\n\",\"body {\\n background-color: var(--color-secondary);\\n color: var(--color-primary);\\n}\\n\\na {\\n color: var(--color-link);\\n\\n &:visited {\\n color: var(--color-link-visited);\\n }\\n}\\n\\n#site-header {\\n & a:visited {\\n color: var(--color-link);\\n }\\n}\\n\",\".grid {\\n display: grid;\\n grid-template-columns: 5vw 1fr 5vw;\\n grid-template-rows: min-content 1fr min-content;\\n row-gap: 1rem;\\n}\\n\\n#site-header {\\n grid-column: 2 / 3;\\n grid-row: 1 / 2;\\n}\\n\\nmain {\\n grid-column: 2 / 3;\\n grid-row: 2 / 3;\\n}\\n\\nfooter {\\n grid-column: 2 / 3;\\n grid-row: 3 / 4;\\n\\n & .iwc-logo {\\n max-width: 85vw;\\n }\\n}\\n\",\".hljs {\\n border-radius: .5rem;\\n}\\n\",\".h-card {\\n & .hovercard {\\n display: none;\\n position: absolute;\\n z-index: 100;\\n padding: 1rem;\\n border-radius: 1rem;\\n box-shadow: 0 .5rem .5rem .5rem var(--color-primary-shadow);\\n background-color: var(--color-secondary);\\n width: fit-content;\\n transition: opacity 0.5s ease-in-out;\\n opacity: 0;\\n flex-direction: column;\\n gap: .5rem;\\n\\n & .u-photo {\\n max-width: 6rem;\\n }\\n\\n & .social-icon {\\n width: 1rem;\\n height: 1rem;\\n }\\n }\\n\\n &:hover {\\n & .hovercard {\\n display: flex;\\n opacity: 1;\\n }\\n }\\n}\\n\",\"@import url('h-card.css');\\n\\n.h-entry {\\n border-inline-start: 1px solid var(--color-primary);\\n padding-inline-start: .5rem;\\n\\n & .reply-to {\\n font-style: italic;\\n }\\n\\n & .post-info {\\n & a {\\n text-decoration: none;\\n }\\n }\\n\\n & .note-metadata {\\n display: flex;\\n flex-direction: row;\\n gap: 1rem;\\n\\n & .syndication-links {\\n flex-flow: row wrap;\\n\\n & a {\\n text-decoration: none;\\n\\n & svg {\\n width: 1rem;\\n height: 1rem;\\n }\\n }\\n }\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ __webpack_exports__[\"default\"] = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cnVsZVNldFsxXS5ydWxlc1sxXS51c2VbMV0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P3J1bGVTZXRbMV0ucnVsZXNbMV0udXNlWzJdIS4vcmVzb3VyY2VzL2Nzcy9hcHAuY3NzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDNkc7QUFDakI7QUFDNUYsOEJBQThCLG1GQUEyQixDQUFDLDRGQUFxQztBQUMvRjtBQUNBLGdEQUFnRCwrREFBK0Qsd0RBQXdELGtGQUFrRix1QkFBdUIsc0JBQXNCLHVCQUF1QixzQkFBc0IsdUJBQXVCLHFCQUFxQix5QkFBeUIsd0JBQXdCLDBCQUEwQixxQkFBcUIsNkJBQTZCLHdDQUF3QywwQ0FBMEMsTUFBTSwwREFBMEQsNERBQTRELHVEQUF1RCwrREFBK0Qsc0VBQXNFLGdDQUFnQyxNQUFNLDRDQUE0Qyw4Q0FBOEMsMkNBQTJDLGtEQUFrRCwyREFBMkQsS0FBSyx3Q0FBd0MsMkJBQTJCLG9DQUFvQyw4QkFBOEIsS0FBSyx5Q0FBeUMsa0JBQWtCLHdDQUF3QyxNQUFNLGFBQWEsa0NBQWtDLCtEQUErRCwrQ0FBK0MsYUFBYSxhQUFhLGdCQUFnQixhQUFhLEtBQUssYUFBYSxZQUFZLGdCQUFnQixPQUFPLGFBQWEsaUJBQWlCLGVBQWUsRUFBRSx3QkFBd0IsVUFBVSxnQ0FBZ0MsdUJBQXVCLHdCQUF3QixNQUFNLG9CQUFvQixtQkFBbUIsNEJBQTRCLDZCQUE2Qix3Q0FBd0MsbUJBQW1CLG1FQUFtRSwyREFBMkQsYUFBYSwwQkFBMEIsc0JBQXNCLFVBQVUsVUFBVSxhQUFhLGtCQUFrQiwyQ0FBMkMsbUNBQW1DLDBCQUEwQix1QkFBdUIsa0JBQWtCLFlBQVksNEJBQTRCLGVBQWUsZ0NBQWdDLFlBQVksV0FBVyx5QkFBeUIsb0JBQW9CLG9CQUFvQixhQUFhLFVBQVUsU0FBUyxvREFBb0QsNEJBQTRCLG1EQUFtRCwyQkFBMkIsbUJBQW1CLGtCQUFrQixzQkFBc0IscUJBQXFCLHdCQUF3Qiw4QkFBOEIsNkJBQTZCLG9CQUFvQixvQkFBb0IsYUFBYSx1QkFBdUIsbUJBQW1CLFNBQVMsMkNBQTJDLDhCQUE4Qiw2QkFBNkIsdUJBQXVCLG1CQUFtQiw2Q0FBNkMscUJBQXFCLGlEQUFpRCxZQUFZLFdBQVcsT0FBTyxzbURBQXNtRCwyRkFBMkYsK0RBQStELHlGQUF5RixvREFBb0QseUNBQXlDLCtDQUErQyx5Q0FBeUMseUNBQXlDLHlDQUF5Qyx5Q0FBeUMsOEVBQThFLG1EQUFtRCxnREFBZ0QsdURBQXVELGlFQUFpRSxHQUFHLFdBQVcseUNBQXlDLG1DQUFtQyxHQUFHLFVBQVUsOENBQThDLEdBQUcsaUNBQWlDLDZDQUE2QyxHQUFHLFdBQVcsNkNBQTZDLGdDQUFnQyxHQUFHLE9BQU8sNkJBQTZCLGlCQUFpQix1Q0FBdUMsS0FBSyxHQUFHLGtCQUFrQixpQkFBaUIsK0JBQStCLEtBQUssR0FBRyxZQUFZLGtCQUFrQix1Q0FBdUMsb0RBQW9ELGtCQUFrQixHQUFHLGtCQUFrQix1QkFBdUIsb0JBQW9CLEdBQUcsVUFBVSx1QkFBdUIsb0JBQW9CLEdBQUcsWUFBWSx1QkFBdUIsb0JBQW9CLG1CQUFtQixzQkFBc0IsS0FBSyxHQUFHLFlBQVkseUJBQXlCLEdBQUcsY0FBYyxrQkFBa0Isb0JBQW9CLHlCQUF5QixtQkFBbUIsb0JBQW9CLDBCQUEwQixrRUFBa0UsK0NBQStDLHlCQUF5QiwyQ0FBMkMsaUJBQWlCLDZCQUE2QixpQkFBaUIsb0JBQW9CLHdCQUF3QixPQUFPLHdCQUF3QixvQkFBb0IscUJBQXFCLE9BQU8sS0FBSyxlQUFlLG9CQUFvQixzQkFBc0IsbUJBQW1CLE9BQU8sS0FBSyxHQUFHLCtCQUErQixjQUFjLHdEQUF3RCxnQ0FBZ0MsbUJBQW1CLHlCQUF5QixLQUFLLG9CQUFvQixXQUFXLDhCQUE4QixPQUFPLEtBQUssd0JBQXdCLG9CQUFvQiwwQkFBMEIsZ0JBQWdCLDhCQUE4Qiw0QkFBNEIsZUFBZSxnQ0FBZ0MsbUJBQW1CLHdCQUF3Qix5QkFBeUIsV0FBVyxTQUFTLE9BQU8sS0FBSyxHQUFHLHFCQUFxQjtBQUN6c1A7QUFDQSwrREFBZSx1QkFBdUIsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2pidWstZnJvbnRlbmQvLi9yZXNvdXJjZXMvY3NzL2FwcC5jc3M/MGJhMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIjpyb290ey0tZm9udC1mYW1pbHktaGVhZGluZ3M6XFxcIkFyY2hlciBTU20gQVxcXCIsXFxcIkFyY2hlciBTU20gQlxcXCIsc2VyaWY7LS1mb250LWZhbWlseS1ib2R5OlxcXCJWZXJsYWcgQVxcXCIsXFxcIlZlcmxhZyBCXFxcIixzYW5zLXNlcmlmOy0tZm9udC1mYW1pbHktbW9ub3NwYWNlOlxcXCJPcGVyYXRvciBNb25vIFNTbSBBXFxcIixcXFwiT3BlcmF0b3IgTW9ubyBTU20gQlxcXCIsbW9ub3NwYWNlOy0tZm9udC1zaXplLXNtOjAuNzVyZW07LS1mb250LXNpemUtYmFzZToxcmVtOy0tZm9udC1zaXplLW1kOjEuMjVyZW07LS1mb250LXNpemUtbGc6MS41cmVtOy0tZm9udC1zaXplLXhsOjEuNzVyZW07LS1mb250LXNpemUteHhsOjJyZW07LS1mb250LXNpemUteHh4bDoyLjI1cmVtOy0tY29sb3ItcHJpbWFyeTojMzM0NzAwOy0tY29sb3Itc2Vjb25kYXJ5OiNlM2ZmYjc7LS1jb2xvci1saW5rOiMwMDY0OWU7LS1jb2xvci1saW5rLXZpc2l0ZWQ6I2JjN2FmZjstLWNvbG9yLXByaW1hcnktc2hhZG93OnJnYmEoMTYsMjUsMCwuNCl9QHN1cHBvcnRzIChjb2xvcjpjb2xvcihkaXNwbGF5LXAzIDAgMCAwKSl7OnJvb3R7LS1jb2xvci1wcmltYXJ5OmNvbG9yKGRpc3BsYXktcDMgMC4yMTU2NyAwLjI3ODM4IDAuMDM2MTUpOy0tY29sb3Itc2Vjb25kYXJ5OmNvbG9yKGRpc3BsYXktcDMgMC45MTAxNiAwLjk5ODQyIDAuNzQwODIpOy0tY29sb3ItbGluazpjb2xvcihkaXNwbGF5LXAzIDAuMDEwNDUgMC4zODM1MSAwLjYzNjE4KTstLWNvbG9yLWxpbmstdmlzaXRlZDpjb2xvcihkaXNwbGF5LXAzIDAuNzA0NjcgMC40NzU0OSAwLjk5OTU4KTstLWNvbG9yLXByaW1hcnktc2hhZG93OmNvbG9yKGRpc3BsYXktcDMgMC4wNjc2MiAwLjA5NjQ2IDAuMDA0NDEvMC40KX19QHN1cHBvcnRzIChjb2xvcjpva2xjaCgwJSAwIDApKXs6cm9vdHstLWNvbG9yLXByaW1hcnk6b2tsY2goMzYuOCUgMC4xIDEyNS41MDVkZWcpOy0tY29sb3Itc2Vjb25kYXJ5Om9rbGNoKDk2LjMlIDAuMSAxMjUuNTA1ZGVnKTstLWNvbG9yLWxpbms6b2tsY2goNDguMDklIDAuMTQ2IDI0MS40MWRlZyk7LS1jb2xvci1saW5rLXZpc2l0ZWQ6b2tsY2goNzAuNDQlIDAuMjEgMzA0LjQxZGVnKTstLWNvbG9yLXByaW1hcnktc2hhZG93Om9rbGNoKDE5LjU2JSAwLjA1NCAxMjUuNTA1ZGVnLzQwJSl9fWJvZHl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1jb2xvci1zZWNvbmRhcnkpO2NvbG9yOnZhcigtLWNvbG9yLXByaW1hcnkpO2ZvbnQtZmFtaWx5OnZhcigtLWZvbnQtZmFtaWx5LWJvZHkpO2ZvbnQtc2l6ZTp2YXIoLS1mb250LXNpemUtbWQpfWNvZGV7Zm9udC1mYW1pbHk6dmFyKC0tZm9udC1mYW1pbHktbW9ub3NwYWNlKX1oMSxoMixoMyxoNCxoNSxoNntmb250LWZhbWlseTp2YXIoLS1mb250LWZhbWlseS1oZWFkaW5ncyl9LmdyaWR7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczo1dncgMWZyIDV2dztncmlkLXRlbXBsYXRlLXJvd3M6LXdlYmtpdC1taW4tY29udGVudCAxZnIgLXdlYmtpdC1taW4tY29udGVudDtncmlkLXRlbXBsYXRlLXJvd3M6bWluLWNvbnRlbnQgMWZyIG1pbi1jb250ZW50O3Jvdy1nYXA6MXJlbX0jc2l0ZS1oZWFkZXJ7Z3JpZC1jb2x1bW46Mi8zO2dyaWQtcm93OjEvMn1tYWlue2dyaWQtcm93OjIvM31mb290ZXIsbWFpbntncmlkLWNvbHVtbjoyLzN9Zm9vdGVye2dyaWQtcm93OjMvNH1mb290ZXIgLml3Yy1sb2dve21heC13aWR0aDo4NXZ3fWF7Y29sb3I6dmFyKC0tY29sb3ItbGluayl9YTp2aXNpdGVke2NvbG9yOnZhcigtLWNvbG9yLWxpbmstdmlzaXRlZCl9I3NpdGUtaGVhZGVyIGE6dmlzaXRlZHtjb2xvcjp2YXIoLS1jb2xvci1saW5rKX0uaGxqc3tib3JkZXItcmFkaXVzOi41cmVtfS5oLWNhcmQgLmhvdmVyY2FyZHstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNvbG9yLXNlY29uZGFyeSk7Ym9yZGVyLXJhZGl1czoxcmVtOy13ZWJraXQtYm94LXNoYWRvdzowIC41cmVtIC41cmVtIC41cmVtIHZhcigtLWNvbG9yLXByaW1hcnktc2hhZG93KTtib3gtc2hhZG93OjAgLjVyZW0gLjVyZW0gLjVyZW0gdmFyKC0tY29sb3ItcHJpbWFyeS1zaGFkb3cpO2Rpc3BsYXk6bm9uZTstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6LjVyZW07b3BhY2l0eTowO3BhZGRpbmc6MXJlbTtwb3NpdGlvbjphYnNvbHV0ZTstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlLWluLW91dDt3aWR0aDotd2Via2l0LWZpdC1jb250ZW50O3dpZHRoOi1tb3otZml0LWNvbnRlbnQ7d2lkdGg6Zml0LWNvbnRlbnQ7ei1pbmRleDoxMDB9LmgtY2FyZCAuaG92ZXJjYXJkIC51LXBob3Rve21heC13aWR0aDo2cmVtfS5oLWNhcmQgLmhvdmVyY2FyZCAuc29jaWFsLWljb257aGVpZ2h0OjFyZW07d2lkdGg6MXJlbX0uaC1jYXJkOmhvdmVyIC5ob3ZlcmNhcmR7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtvcGFjaXR5OjF9LmgtZW50cnl7LXdlYmtpdC1ib3JkZXItc3RhcnQ6MXB4IHNvbGlkIHZhcigtLWNvbG9yLXByaW1hcnkpOy13ZWJraXQtcGFkZGluZy1zdGFydDouNXJlbTtib3JkZXItaW5saW5lLXN0YXJ0OjFweCBzb2xpZCB2YXIoLS1jb2xvci1wcmltYXJ5KTtwYWRkaW5nLWlubGluZS1zdGFydDouNXJlbX0uaC1lbnRyeSAucmVwbHktdG97Zm9udC1zdHlsZTppdGFsaWN9LmgtZW50cnkgLnBvc3QtaW5mbyBhe3RleHQtZGVjb3JhdGlvbjpub25lfS5oLWVudHJ5IC5ub3RlLW1ldGFkYXRhey13ZWJraXQtYm94LW9yaWVudDpob3Jpem9udGFsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvdztnYXA6MXJlbX0uaC1lbnRyeSAubm90ZS1tZXRhZGF0YSAuc3luZGljYXRpb24tbGlua3N7LXdlYmtpdC1ib3gtb3JpZW50Omhvcml6b250YWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1mbG93OnJvdyB3cmFwO2ZsZXgtZmxvdzpyb3cgd3JhcH0uaC1lbnRyeSAubm90ZS1tZXRhZGF0YSAuc3luZGljYXRpb24tbGlua3MgYXt0ZXh0LWRlY29yYXRpb246bm9uZX0uaC1lbnRyeSAubm90ZS1tZXRhZGF0YSAuc3luZGljYXRpb24tbGlua3MgYSBzdmd7aGVpZ2h0OjFyZW07d2lkdGg6MXJlbX1cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9yZXNvdXJjZXMvY3NzL3ZhcmlhYmxlcy5jc3NcIixcIndlYnBhY2s6Ly8uL3Jlc291cmNlcy9jc3MvZm9udHMuY3NzXCIsXCJ3ZWJwYWNrOi8vLi9yZXNvdXJjZXMvY3NzL2NvbG91cnMuY3NzXCIsXCJ3ZWJwYWNrOi8vLi9yZXNvdXJjZXMvY3NzL2xheW91dC5jc3NcIixcIndlYnBhY2s6Ly8uL3Jlc291cmNlcy9jc3MvY29kZS5jc3NcIixcIndlYnBhY2s6Ly8uL3Jlc291cmNlcy9jc3MvaC1jYXJkLmNzc1wiLFwid2VicGFjazovLy4vcmVzb3VyY2VzL2Nzcy9jb250ZW50LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxNQUVFLDBEQUE2RCxDQUM3RCxtREFBc0QsQ0FDdEQsNkVBQWdGLENBR2hGLHNCQUF1QixDQUN2QixxQkFBc0IsQ0FDdEIsc0JBQXVCLENBQ3ZCLHFCQUFzQixDQUN0QixzQkFBdUIsQ0FDdkIsb0JBQXFCLENBQ3JCLHdCQUF5QixDQUd6Qix1QkFBNEMsQ0FDNUMseUJBQThDLENBQzlDLG9CQUEyQyxDQUMzQyw0QkFBa0QsQ0FDbEQsdUNBQ0YsQ0FyQkEsMENBQUEsTUFnQkUseURBQTRDLENBQzVDLDJEQUE4QyxDQUM5QyxzREFBMkMsQ0FDM0MsOERBQWtELENBQ2xELG9FQUNGLENBQUEsQ0FyQkEsZ0NBQUEsTUFnQkUsMkNBQTRDLENBQzVDLDZDQUE4QyxDQUM5QywwQ0FBMkMsQ0FDM0MsaURBQWtELENBQ2xELHlEQUNGLENBQUEsQ0NyQkEsS0NDRSx1Q0FBd0MsQ0FDeEMsMEJBQTJCLENERDNCLG1DQUFvQyxDQUNwQyw2QkFDRixDQUVBLEtBQ0Usd0NBQ0YsQ0FFQSxrQkFNRSx1Q0FDRixDRWhCQSxNQUNFLFlBQWEsQ0FDYixpQ0FBa0MsQ0FDbEMsOERBQStDLENBQS9DLDhDQUErQyxDQUMvQyxZQUNGLENBRUEsYUFDRSxlQUFrQixDQUNsQixZQUNGLENBRUEsS0FFRSxZQUNGLENBRUEsWUFKRSxlQVdGLENBUEEsT0FFRSxZQUtGLENBSEUsaUJBQ0UsY0FDRixDRGxCRixFQUNFLHVCQUtGLENBSEUsVUFDRSwrQkFDRixDQUlBLHVCQUNFLHVCQUNGLENFaEJGLE1BQ0UsbUJBQ0YsQ0NERSxtQkFXRSwyQkFBc0IsQ0FBdEIsNEJBQXNCLENBSnRCLHVDQUF3QyxDQUZ4QyxrQkFBbUIsQ0FDbkIsa0VBQTJELENBQTNELDBEQUEyRCxDQUwzRCxZQUFhLENBVWIseUJBQXNCLENBQXRCLHFCQUFzQixDQUN0QixTQUFVLENBRlYsU0FBVSxDQU5WLFlBQWEsQ0FGYixpQkFBa0IsQ0FPbEIsMENBQW9DLENBQXBDLGtDQUFvQyxDQURwQyx5QkFBa0IsQ0FBbEIsc0JBQWtCLENBQWxCLGlCQUFrQixDQUxsQixXQW1CRixDQVJFLDRCQUNFLGNBQ0YsQ0FFQSxnQ0FFRSxXQUFZLENBRFosVUFFRixDQUlBLHlCQUNFLG1CQUFhLENBQWIsbUJBQWEsQ0FBYixZQUFhLENBQ2IsU0FDRixDQzNCSixTQUNFLG1EQUFtRCxDQUNuRCwyQkFBMkIsQ0FEM0Isa0RBQW1ELENBQ25ELDBCQThCRixDQTVCRSxtQkFDRSxpQkFDRixDQUdFLHNCQUNFLG9CQUNGLENBR0Ysd0JBRUUsNkJBQW1CLENBQW5CLDRCQUFtQixDQURuQixtQkFBYSxDQUFiLG1CQUFhLENBQWIsWUFBYSxDQUNiLHNCQUFtQixDQUFuQixrQkFBbUIsQ0FDbkIsUUFjRixDQVpFLDJDQUNFLDZCQUFtQixDQUFuQiw0QkFBbUIsQ0FBbkIsc0JBQW1CLENBQW5CLGtCQVVGLENBUkUsNkNBQ0Usb0JBTUYsQ0FKRSxpREFFRSxXQUFZLENBRFosVUFFRlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI6cm9vdCB7XFxuICAvKiBGb250IEZhbWlseSAqL1xcbiAgLS1mb250LWZhbWlseS1oZWFkaW5nczogXFxcIkFyY2hlciBTU20gQVxcXCIsIFxcXCJBcmNoZXIgU1NtIEJcXFwiLCBzZXJpZjtcXG4gIC0tZm9udC1mYW1pbHktYm9keTogXFxcIlZlcmxhZyBBXFxcIiwgXFxcIlZlcmxhZyBCXFxcIiwgc2Fucy1zZXJpZjtcXG4gIC0tZm9udC1mYW1pbHktbW9ub3NwYWNlOiBcXFwiT3BlcmF0b3IgTW9ubyBTU20gQVxcXCIsIFxcXCJPcGVyYXRvciBNb25vIFNTbSBCXFxcIiwgbW9ub3NwYWNlO1xcblxcbiAgLyogRm9udCBTaXplICovXFxuICAtLWZvbnQtc2l6ZS1zbTogMC43NXJlbTsgICAvKiAxMnB4ICovXFxuICAtLWZvbnQtc2l6ZS1iYXNlOiAxcmVtOyAgICAvKiAxNnB4LCBiYXNlICovXFxuICAtLWZvbnQtc2l6ZS1tZDogMS4yNXJlbTsgICAvKiAyMHB4ICovXFxuICAtLWZvbnQtc2l6ZS1sZzogMS41cmVtOyAgICAvKiAyNHB4ICovXFxuICAtLWZvbnQtc2l6ZS14bDogMS43NXJlbTsgICAvKiAyOHB4ICovXFxuICAtLWZvbnQtc2l6ZS14eGw6IDJyZW07ICAgICAvKiAzMnB4ICovXFxuICAtLWZvbnQtc2l6ZS14eHhsOiAyLjI1cmVtOyAvKiAzNnB4ICovXFxuXFxuICAvKiBDb2xvdXJzICovXFxuICAtLWNvbG9yLXByaW1hcnk6IG9rbGNoKDM2LjglIDAuMSAxMjUuNTA1ZGVnKTtcXG4gIC0tY29sb3Itc2Vjb25kYXJ5OiBva2xjaCg5Ni4zJSAwLjEgMTI1LjUwNWRlZyk7XFxuICAtLWNvbG9yLWxpbms6IG9rbGNoKDQ4LjA5JSAwLjE0NiAyNDEuNDFkZWcpO1xcbiAgLS1jb2xvci1saW5rLXZpc2l0ZWQ6IG9rbGNoKDcwLjQ0JSAwLjIxIDMwNC40MWRlZyk7XFxuICAtLWNvbG9yLXByaW1hcnktc2hhZG93OiBva2xjaCgxOS41NiUgMC4wNTQgMTI1LjUwNWRlZyAvIDQwJSk7XFxufVxcblwiLFwiYm9keSB7XFxuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYm9keSk7XFxuICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS1tZCk7XFxufVxcblxcbmNvZGUge1xcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5LW1vbm9zcGFjZSk7XFxufVxcblxcbmgxLFxcbmgyLFxcbmgzLFxcbmg0LFxcbmg1LFxcbmg2IHtcXG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1oZWFkaW5ncyk7XFxufVxcblwiLFwiYm9keSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1zZWNvbmRhcnkpO1xcbiAgY29sb3I6IHZhcigtLWNvbG9yLXByaW1hcnkpO1xcbn1cXG5cXG5hIHtcXG4gIGNvbG9yOiB2YXIoLS1jb2xvci1saW5rKTtcXG5cXG4gICY6dmlzaXRlZCB7XFxuICAgIGNvbG9yOiB2YXIoLS1jb2xvci1saW5rLXZpc2l0ZWQpO1xcbiAgfVxcbn1cXG5cXG4jc2l0ZS1oZWFkZXIge1xcbiAgJiBhOnZpc2l0ZWQge1xcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItbGluayk7XFxuICB9XFxufVxcblwiLFwiLmdyaWQge1xcbiAgZGlzcGxheTogZ3JpZDtcXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNXZ3IDFmciA1dnc7XFxuICBncmlkLXRlbXBsYXRlLXJvd3M6IG1pbi1jb250ZW50IDFmciBtaW4tY29udGVudDtcXG4gIHJvdy1nYXA6IDFyZW07XFxufVxcblxcbiNzaXRlLWhlYWRlciB7XFxuICBncmlkLWNvbHVtbjogMiAvIDM7XFxuICBncmlkLXJvdzogMSAvIDI7XFxufVxcblxcbm1haW4ge1xcbiAgZ3JpZC1jb2x1bW46IDIgLyAzO1xcbiAgZ3JpZC1yb3c6IDIgLyAzO1xcbn1cXG5cXG5mb290ZXIge1xcbiAgZ3JpZC1jb2x1bW46IDIgLyAzO1xcbiAgZ3JpZC1yb3c6IDMgLyA0O1xcblxcbiAgJiAuaXdjLWxvZ28ge1xcbiAgICBtYXgtd2lkdGg6IDg1dnc7XFxuICB9XFxufVxcblwiLFwiLmhsanMge1xcbiAgYm9yZGVyLXJhZGl1czogLjVyZW07XFxufVxcblwiLFwiLmgtY2FyZCB7XFxuICAmIC5ob3ZlcmNhcmQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHotaW5kZXg6IDEwMDtcXG4gICAgcGFkZGluZzogMXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogMXJlbTtcXG4gICAgYm94LXNoYWRvdzogMCAuNXJlbSAuNXJlbSAuNXJlbSB2YXIoLS1jb2xvci1wcmltYXJ5LXNoYWRvdyk7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLXNlY29uZGFyeSk7XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzIGVhc2UtaW4tb3V0O1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBnYXA6IC41cmVtO1xcblxcbiAgICAmIC51LXBob3RvIHtcXG4gICAgICBtYXgtd2lkdGg6IDZyZW07XFxuICAgIH1cXG5cXG4gICAgJiAuc29jaWFsLWljb24ge1xcbiAgICAgIHdpZHRoOiAxcmVtO1xcbiAgICAgIGhlaWdodDogMXJlbTtcXG4gICAgfVxcbiAgfVxcblxcbiAgJjpob3ZlciB7XFxuICAgICYgLmhvdmVyY2FyZCB7XFxuICAgICAgZGlzcGxheTogZmxleDtcXG4gICAgICBvcGFjaXR5OiAxO1xcbiAgICB9XFxuICB9XFxufVxcblwiLFwiQGltcG9ydCB1cmwoJ2gtY2FyZC5jc3MnKTtcXG5cXG4uaC1lbnRyeSB7XFxuICBib3JkZXItaW5saW5lLXN0YXJ0OiAxcHggc29saWQgdmFyKC0tY29sb3ItcHJpbWFyeSk7XFxuICBwYWRkaW5nLWlubGluZS1zdGFydDogLjVyZW07XFxuXFxuICAmIC5yZXBseS10byB7XFxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIH1cXG5cXG4gICYgLnBvc3QtaW5mbyB7XFxuICAgICYgYSB7XFxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICB9XFxuICB9XFxuXFxuICAmIC5ub3RlLW1ldGFkYXRhIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgZ2FwOiAxcmVtO1xcblxcbiAgICAmIC5zeW5kaWNhdGlvbi1saW5rcyB7XFxuICAgICAgZmxleC1mbG93OiByb3cgd3JhcDtcXG5cXG4gICAgICAmIGEge1xcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcblxcbiAgICAgICAgJiBzdmcge1xcbiAgICAgICAgICB3aWR0aDogMXJlbTtcXG4gICAgICAgICAgaGVpZ2h0OiAxcmVtO1xcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./resources/css/app.css\n"); - -/***/ }), - -/***/ "./node_modules/css-loader/dist/runtime/api.js": -/*!*****************************************************!*\ - !*** ./node_modules/css-loader/dist/runtime/api.js ***! - \*****************************************************/ -/***/ (function(module) { - -eval("\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHFCQUFxQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixzRkFBc0YscUJBQXFCO0FBQzNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixpREFBaUQscUJBQXFCO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixzREFBc0QscUJBQXFCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qYnVrLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcz8yNGZiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/api.js\n"); - -/***/ }), - -/***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js": -/*!************************************************************!*\ - !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***! - \************************************************************/ -/***/ (function(module) { - -eval("\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELGNBQWM7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2pidWstZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcz9hZjEyIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/sourceMaps.js\n"); - -/***/ }), - -/***/ "./resources/css/app.css": -/*!*******************************!*\ - !*** ./resources/css/app.css ***! - \*******************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ \"./node_modules/style-loader/dist/runtime/styleDomAPI.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ \"./node_modules/style-loader/dist/runtime/insertBySelector.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ \"./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ \"./node_modules/style-loader/dist/runtime/insertStyleElement.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ \"./node_modules/style-loader/dist/runtime/styleTagTransform.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_1_use_1_node_modules_postcss_loader_dist_cjs_js_ruleSet_1_rules_1_use_2_app_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./app.css */ \"./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./resources/css/app.css\");\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());\noptions.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());\n\n options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, \"head\");\n \noptions.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());\noptions.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_1_use_1_node_modules_postcss_loader_dist_cjs_js_ruleSet_1_rules_1_use_2_app_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"], options);\n\n\n\n\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_1_use_1_node_modules_postcss_loader_dist_cjs_js_ruleSet_1_rules_1_use_2_app_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"] && _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_1_use_1_node_modules_postcss_loader_dist_cjs_js_ruleSet_1_rules_1_use_2_app_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals ? _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_1_use_1_node_modules_postcss_loader_dist_cjs_js_ruleSet_1_rules_1_use_2_app_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals : undefined);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvY3NzL2FwcC5jc3MiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsTUFBa0c7QUFDbEcsTUFBd0Y7QUFDeEYsTUFBK0Y7QUFDL0YsTUFBa0g7QUFDbEgsTUFBMkc7QUFDM0csTUFBMkc7QUFDM0csTUFBME07QUFDMU07QUFDQTs7QUFFQTs7QUFFQSw0QkFBNEIscUdBQW1CO0FBQy9DLHdCQUF3QixrSEFBYTs7QUFFckMsdUJBQXVCLHVHQUFhO0FBQ3BDO0FBQ0EsaUJBQWlCLCtGQUFNO0FBQ3ZCLDZCQUE2QixzR0FBa0I7O0FBRS9DLGFBQWEsMEdBQUcsQ0FBQyw0S0FBTzs7OztBQUlvSjtBQUM1SyxPQUFPLCtEQUFlLDRLQUFPLElBQUksNEtBQU8sVUFBVSw0S0FBTyxtQkFBbUIsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2pidWstZnJvbnRlbmQvLi9yZXNvdXJjZXMvY3NzL2FwcC5jc3M/ODNmOCJdLCJzb3VyY2VzQ29udGVudCI6WyJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9ydWxlU2V0WzFdLnJ1bGVzWzFdLnVzZVsxXSEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P3J1bGVTZXRbMV0ucnVsZXNbMV0udXNlWzJdIS4vYXBwLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9ydWxlU2V0WzFdLnJ1bGVzWzFdLnVzZVsxXSEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P3J1bGVTZXRbMV0ucnVsZXNbMV0udXNlWzJdIS4vYXBwLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/css/app.css\n"); - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js": -/*!****************************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***! - \****************************************************************************/ -/***/ (function(module) { - -eval("\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHdCQUF3QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiw2QkFBNkI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qYnVrLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzPzJkYmEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzdHlsZXNJbkRPTSA9IFtdO1xuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuICAgIGlmIChpbmRleEJ5SWRlbnRpZmllciAhPT0gLTEpIHtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS5yZWZlcmVuY2VzKys7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0udXBkYXRlcihvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdXBkYXRlciA9IGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5ieUluZGV4ID0gaTtcbiAgICAgIHN0eWxlc0luRE9NLnNwbGljZShpLCAwLCB7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIHVwZGF0ZXI6IHVwZGF0ZXIsXG4gICAgICAgIHJlZmVyZW5jZXM6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cbmZ1bmN0aW9uIGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpIHtcbiAgdmFyIGFwaSA9IG9wdGlvbnMuZG9tQVBJKG9wdGlvbnMpO1xuICBhcGkudXBkYXRlKG9iaik7XG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZXI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cbiAgICB2YXIgbmV3TGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKG5ld0xpc3QsIG9wdGlvbnMpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcbiAgICAgIGlmIChzdHlsZXNJbkRPTVtfaW5kZXhdLnJlZmVyZW5jZXMgPT09IDApIHtcbiAgICAgICAgc3R5bGVzSW5ET01bX2luZGV4XS51cGRhdGVyKCk7XG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\n"); - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js": -/*!********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***! - \********************************************************************/ -/***/ (function(module) { - -eval("\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2pidWstZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzP2IyMTQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/insertBySelector.js\n"); - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js": -/*!**********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***! - \**********************************************************************/ -/***/ (function(module) { - -eval("\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2pidWstZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanM/ZGU2YyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/insertStyleElement.js\n"); - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***! - \**********************************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -eval("\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = true ? __webpack_require__.nc : 0;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLGNBQWMsS0FBd0MsR0FBRyxzQkFBaUIsR0FBRyxDQUFJO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qYnVrLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzP2RkY2UiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\n"); - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js": -/*!***************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***! - \***************************************************************/ -/***/ (function(module) { - -eval("\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2pidWstZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcz9lNDc5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBcIlwiO1xuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwiQG1lZGlhIFwiLmNvbmNhdChvYmoubWVkaWEsIFwiIHtcIik7XG4gIH1cbiAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBvYmoubGF5ZXIgIT09IFwidW5kZWZpbmVkXCI7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cbiAgY3NzICs9IG9iai5jc3M7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH1cblxuICAvLyBGb3Igb2xkIElFXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cbiAgb3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGRvbUFQSShvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7fSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICB9O1xuICB9XG4gIHZhciBzdHlsZUVsZW1lbnQgPSBvcHRpb25zLmluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/styleDomAPI.js\n"); - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js": -/*!*********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***! - \*********************************************************************/ -/***/ (function(module) { - -eval("\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2pidWstZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcz8xZGRlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50KSB7XG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/styleTagTransform.js\n"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ id: moduleId, -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ !function() { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function() { return module['default']; } : -/******/ function() { return module; }; -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ !function() { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = function(exports, definition) { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ !function() { -/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } -/******/ }(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ !function() { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/nonce */ -/******/ !function() { -/******/ __webpack_require__.nc = undefined; -/******/ }(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module can't be inlined because the eval-source-map devtool is used. -/******/ var __webpack_exports__ = __webpack_require__("./resources/js/app.js"); -/******/ -/******/ })() -; \ No newline at end of file +!function(){"use strict";let e=new class{constructor(){}async register(){const e=await this.getCreateOptions(),t={challenge:this.base64URLStringToBuffer(e.challenge),rp:{id:e.rp.id,name:e.rp.name},user:{id:(new TextEncoder).encode(window.atob(e.user.id)),name:e.user.name,displayName:e.user.displayName},pubKeyCredParams:e.pubKeyCredParams,excludeCredentials:[],authenticatorSelection:e.authenticatorSelection,timeout:6e4},a=await navigator.credentials.create({publicKey:t});if(!a)throw new Error("Error generating a passkey");const n={id:a.id?a.id:null,type:a.type?a.type:null,rawId:a.rawId?this.bufferToBase64URLString(a.rawId):null,response:{attestationObject:a.response.attestationObject?this.bufferToBase64URLString(a.response.attestationObject):null,clientDataJSON:a.response.clientDataJSON?this.bufferToBase64URLString(a.response.clientDataJSON):null}};if(!(await window.fetch("/admin/passkeys/register",{method:"POST",body:JSON.stringify(n),cache:"no-cache",headers:{"Content-Type":"application/json","X-CSRF-TOKEN":document.querySelector('meta[name="csrf-token"]').getAttribute("content")}})).ok)throw new Error("Error saving the passkey");window.location.reload()}async getCreateOptions(){const e=await fetch("/admin/passkeys/register",{method:"GET"});return await e.json()}async login(){const e=await this.getLoginData(),t=await navigator.credentials.get({publicKey:{challenge:this.base64URLStringToBuffer(e.challenge),userVerification:e.userVerification,timeout:6e4}});if(!t)throw new Error("Authentication failed");const a={id:t.id?t.id:"",type:t.type?t.type:"",rawId:t.rawId?this.bufferToBase64URLString(t.rawId):"",response:{authenticatorData:t.response.authenticatorData?this.bufferToBase64URLString(t.response.authenticatorData):"",clientDataJSON:t.response.clientDataJSON?this.bufferToBase64URLString(t.response.clientDataJSON):"",signature:t.response.signature?this.bufferToBase64URLString(t.response.signature):"",userHandle:t.response.userHandle?this.bufferToBase64URLString(t.response.userHandle):""}};if(!(await window.fetch("/login/passkey",{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json","X-CSRF-TOKEN":document.querySelector('meta[name="csrf-token"]').getAttribute("content")}})).ok)throw new Error("Login failed");window.location.assign("/admin")}async getLoginData(){const e=await fetch("/login/passkey",{method:"GET"});return await e.json()}base64URLStringToBuffer(e){const t=e.replace(/-/g,"+").replace(/_/g,"/"),a=(4-t.length%4)%4,n=t.padEnd(t.length+a,"="),r=window.atob(n),i=new ArrayBuffer(r.length),s=new Uint8Array(i);for(let e=0;e{t.addEventListener("click",(()=>{e.register()}))})),document.querySelectorAll(".login-passkey").forEach((t=>{t.addEventListener("click",(()=>{e.login()}))}))}(); \ No newline at end of file diff --git a/public/assets/app.js.br b/public/assets/app.js.br index ed35c5c40262388d1ecc3d17265dd7ef77644d23..bbaa2f49a9ee82590a2841778b48a8b8d189dcb9 100644 GIT binary patch literal 935 zcmb2X!_AO#`}OPV>lc?S*xX~SrYBph?ItJrflvGL@%!tyR>fJzNk;9ee*ga6OzjQw zhWx#XnIisDQOA!J)UvP0Ir1|6%>APM`iCAWU0qc9PIOo8MX#DEk8kVntY)4S73qzg z_uWoOZ$Edi^Q^Qr`>R~1hSr@EtPCdJDlxuu{^TE(Z%HbPryBQg-qy*!WtjB&$r~8~ zZ)c^v(j{Ae=2uQW$uD+G=G~r2m)#=|eU9mUc|__3?~GZ^KKCZAFn+K9?z;RV=ec67 z^Gu)au9H37nOf&&CGTMsQtrG?H0iFN(c3+7P1kPS%?gta-!mzAx$3#w+a*d*z1(q$ zw@$G{%3|euyVLD6wcUB&oz#4yJk7*?eSq?9;YHO_;%@|$xvX+jzjNr%`T4_@&1UW1 z^l+2Mit{f!|9<7;q??vDch|ACYqT7_Yh=4pf^_oKjVBntz0*@5w5CAafWLV;#Oh@$LU$K!6+8H3^O=>M z9tl$l1%ivuakcE*cyw)p#H?kvZaq+V^Uzbpnsc9dzg=z3t(x{jZ0sEz(~mGWYtHUA zUjIp7;OrM~IjIwS8S3>OUFTcWp7na(1`(Ip-)he7{V;L=+v}dsOeB=*FZ0PN@rXLV z@G$n)YQ1$L;KQsb31X{7{gj$Md^y0Q&9T9V;pP@*A)^mvoBJypZ1?Q$&?>Vrl2xA3 zA@5Mi&(M~l!oTNnQ|uWf(UqbJYJr`%7}A`>X0BtO@v)JwWaqh;9rF^{4re}RyLd%G zo>6vAlgxXg{!#;fmg6(#UfLNGU~p@m&1%K`vxRAyXHyS<{qiy6N}W`CpA*x+?GEgR zr+zN8y0AgN|FqKa8U`7?b1yv%bZgJbBrOyFx@Jl3tEH|LzL)!0Ocg@E_+PjtR9(FG zV)vSJpRa#-;n@}Uw(am_37*Rl#e56zPpCbtE;R9(nC!iSb6;}Bo>P0?J^jpd%U5e% zV$+W0dEDH>@_4${&dLAI&%I)*xBp51`EBzp?7bZ2RtWOur0dyP?OeW6h?VJ*(i=t> zW3da6r;XvVvb(LmK>pWIkWKSF9CNBp2*$6 F3;=X!$jSf! literal 20470 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 G%mx5QE~(Q1 diff --git a/resources/css/colours.css b/resources/css/colours.css index 65b95212..0374fbe8 100644 --- a/resources/css/colours.css +++ b/resources/css/colours.css @@ -9,6 +9,10 @@ a { &:visited { color: var(--color-link-visited); } + + &.auth:visited { + color: var(--color-link); + } } #site-header { diff --git a/resources/css/layout.css b/resources/css/layout.css index f0a40dd6..18cb9448 100644 --- a/resources/css/layout.css +++ b/resources/css/layout.css @@ -22,4 +22,10 @@ footer { & .iwc-logo { max-width: 85vw; } + + & .footer-actions { + display: flex; + flex-direction: row; + gap: 1rem; + } } diff --git a/resources/js/app.js b/resources/js/app.js index 06c635a9..7411e06e 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -9,3 +9,9 @@ document.querySelectorAll('.add-passkey').forEach((el) => { auth.register(); }); }); + +document.querySelectorAll('.login-passkey').forEach((el) => { + el.addEventListener('click', () => { + auth.login(); + }); +}); diff --git a/resources/js/auth.js b/resources/js/auth.js index 905db945..15d71ac1 100644 --- a/resources/js/auth.js +++ b/resources/js/auth.js @@ -2,87 +2,165 @@ class Auth { constructor() {} async register() { - const { challenge, userId, existing } = await this.getRegisterData(); + const createOptions = await this.getCreateOptions(); const publicKeyCredentialCreationOptions = { - challenge: new TextEncoder().encode(challenge), + challenge: this.base64URLStringToBuffer(createOptions.challenge), rp: { - name: 'JB', + id: createOptions.rp.id, + name: createOptions.rp.name, }, user: { - id: new TextEncoder().encode(userId), - name: 'jonny@jonnybarnes.uk', - displayName: 'Jonny', - }, - pubKeyCredParams: [ - {alg: -8, type: 'public-key'}, // Ed25519 - {alg: -7, type: 'public-key'}, // ES256 - {alg: -257, type: 'public-key'}, // RS256 - ], - excludeCredentials: existing, - authenticatorSelection: { - userVerification: 'preferred', - residentKey: 'required', + id: new TextEncoder().encode(window.atob(createOptions.user.id)), + name: createOptions.user.name, + displayName: createOptions.user.displayName, }, + pubKeyCredParams: createOptions.pubKeyCredParams, + excludeCredentials: [], + authenticatorSelection: createOptions.authenticatorSelection, timeout: 60000, }; - const publicKeyCredential = await navigator.credentials.create({ + const credential = await navigator.credentials.create({ publicKey: publicKeyCredentialCreationOptions }); - if (!publicKeyCredential) { + if (!credential) { throw new Error('Error generating a passkey'); } - const { - id // the key id a.k.a. kid - } = publicKeyCredential; - const publicKey = publicKeyCredential.response.getPublicKey(); - const transports = publicKeyCredential.response.getTransports(); - const response = publicKeyCredential.response; - const clientJSONArrayBuffer = response.clientDataJSON; - const clientJSON = JSON.parse(new TextDecoder().decode(clientJSONArrayBuffer)); - const clientChallenge = clientJSON.challenge; - // base64 decode the challenge - const clientChallengeDecoded = atob(clientChallenge); - const saved = await this.savePasskey(id, publicKey, transports, clientChallengeDecoded); + const authenticatorAttestationResponse = { + id: credential.id ? credential.id : null, + type: credential.type ? credential.type : null, + rawId: credential.rawId ? this.bufferToBase64URLString(credential.rawId) : null, + response: { + attestationObject: credential.response.attestationObject ? this.bufferToBase64URLString(credential.response.attestationObject) : null, + clientDataJSON: credential.response.clientDataJSON ? this.bufferToBase64URLString(credential.response.clientDataJSON) : null, + } + }; - if (saved) { - window.location.reload(); - } else { - alert('There was an error saving the passkey'); - } - } - - async getRegisterData() { - const response = await fetch('/admin/passkeys/init'); - - return await response.json(); - } - - async savePasskey(id, publicKey, transports, challenge) { - const formData = new FormData(); - formData.append('id', id); - formData.append('transports', JSON.stringify(transports)); - formData.append('challenge', challenge); - - // Convert the ArrayBuffer to a Uint8Array - const publicKeyArray = new Uint8Array(publicKey); - - // Create a Blob from the Uint8Array - const publicKeyBlob = new Blob([publicKeyArray], { type: 'application/octet-stream' }); - - formData.append('public_key', publicKeyBlob); - - const response = await fetch('/admin/passkeys/save', { + const registerCredential = await window.fetch('/admin/passkeys/register', { method: 'POST', - body: formData, + body: JSON.stringify(authenticatorAttestationResponse), + cache: 'no-cache', headers: { + 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content'), }, }); - return response.ok; + if (!registerCredential.ok) { + throw new Error('Error saving the passkey'); + } + + window.location.reload(); + } + + async getCreateOptions() { + const response = await fetch('/admin/passkeys/register', { + method: 'GET', + }); + + return await response.json(); + } + + async login() { + const loginData = await this.getLoginData(); + + const publicKeyCredential = await navigator.credentials.get({ + publicKey: { + challenge: this.base64URLStringToBuffer(loginData.challenge), + userVerification: loginData.userVerification, + timeout: 60000, + } + }); + + if (!publicKeyCredential) { + throw new Error('Authentication failed'); + } + + const authenticatorAttestationResponse = { + id: publicKeyCredential.id ? publicKeyCredential.id : '', + type: publicKeyCredential.type ? publicKeyCredential.type : '', + rawId: publicKeyCredential.rawId ? this.bufferToBase64URLString(publicKeyCredential.rawId) : '', + response: { + authenticatorData: publicKeyCredential.response.authenticatorData ? this.bufferToBase64URLString(publicKeyCredential.response.authenticatorData) : '', + clientDataJSON: publicKeyCredential.response.clientDataJSON ? this.bufferToBase64URLString(publicKeyCredential.response.clientDataJSON) : '', + signature: publicKeyCredential.response.signature ? this.bufferToBase64URLString(publicKeyCredential.response.signature) : '', + userHandle: publicKeyCredential.response.userHandle ? this.bufferToBase64URLString(publicKeyCredential.response.userHandle) : '', + }, + }; + + const loginAttempt = await window.fetch('/login/passkey', { + method: 'POST', + body: JSON.stringify(authenticatorAttestationResponse), + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content'), + }, + }); + + if (!loginAttempt.ok) { + throw new Error('Login failed'); + } + + window.location.assign('/admin'); + } + + async getLoginData() { + const response = await fetch('/login/passkey', { + method: 'GET', + }); + + return await response.json(); + } + + /** + * Convert a base64 URL string to a buffer. + * + * Sourced from https://github.com/MasterKale/SimpleWebAuthn/blob/master/packages/browser/src/helpers/base64URLStringToBuffer.ts#L8 + * + * @param {string} base64URLString + * @returns {ArrayBuffer} + */ + base64URLStringToBuffer(base64URLString) { + // Convert from Base64URL to Base64 + const base64 = base64URLString.replace(/-/g, '+').replace(/_/g, '/'); + /** + * Pad with '=' until it's a multiple of four + * (4 - (85 % 4 = 1) = 3) % 4 = 3 padding + * (4 - (86 % 4 = 2) = 2) % 4 = 2 padding + * (4 - (87 % 4 = 3) = 1) % 4 = 1 padding + * (4 - (88 % 4 = 0) = 4) % 4 = 0 padding + */ + const padLength = (4 - (base64.length % 4)) % 4; + const padded = base64.padEnd(base64.length + padLength, '='); + // Convert to a binary string + const binary = window.atob(padded); + // Convert binary string to buffer + const buffer = new ArrayBuffer(binary.length); + const bytes = new Uint8Array(buffer); + for (let i = 0; i < binary.length; i++) { + bytes[i] = binary.charCodeAt(i); + } + return buffer; + } + + /** + * Convert a buffer to a base64 URL string. + * + * Sourced from https://github.com/MasterKale/SimpleWebAuthn/blob/master/packages/browser/src/helpers/bufferToBase64URLString.ts#L7 + * + * @param {ArrayBuffer} buffer + * @returns {string} + */ + bufferToBase64URLString(buffer) { + const bytes = new Uint8Array(buffer); + let str = ''; + for (const charCode of bytes) { + str += String.fromCharCode(charCode); + } + const base64String = btoa(str); + return base64String.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); } } diff --git a/resources/views/login.blade.php b/resources/views/login.blade.php index e3c3839b..b80bd147 100644 --- a/resources/views/login.blade.php +++ b/resources/views/login.blade.php @@ -9,4 +9,5 @@ +

@stop diff --git a/resources/views/master.blade.php b/resources/views/master.blade.php index 24eb5665..d983821e 100644 --- a/resources/views/master.blade.php +++ b/resources/views/master.blade.php @@ -54,9 +54,16 @@
-
- -
+

Built with love: Colophon

diff --git a/routes/web.php b/routes/web.php index 18a17619..fbc6e129 100644 --- a/routes/web.php +++ b/routes/web.php @@ -50,6 +50,8 @@ Route::group(['domain' => config('url.longurl')], function () { // The login routes to get auth’d for admin Route::get('login', [AuthController::class, 'showLogin'])->name('login'); Route::post('login', [AuthController::class, 'login']); + Route::get('login/passkey', [PasskeysController::class, 'getRequestOptions']); + Route::post('login/passkey', [PasskeysController::class, 'login']); // And the logout routes Route::get('logout', [AuthController::class, 'showLogout'])->name('logout'); @@ -146,8 +148,8 @@ Route::group(['domain' => config('url.longurl')], function () { // Passkeys Route::group(['prefix' => 'passkeys'], static function () { Route::get('/', [PasskeysController::class, 'index']); - Route::post('save', [PasskeysController::class, 'save']); - Route::get('/init', [PasskeysController::class, 'init']); + Route::get('register', [PasskeysController::class, 'getCreateOptions']); + Route::post('register', [PasskeysController::class, 'create']); }); }); diff --git a/tests/Feature/Admin/AdminTest.php b/tests/Feature/Admin/AdminTest.php index 77c0ab08..d69d59a4 100644 --- a/tests/Feature/Admin/AdminTest.php +++ b/tests/Feature/Admin/AdminTest.php @@ -46,7 +46,7 @@ class AdminTest extends TestCase 'password' => 'password', ]); - $response->assertRedirect('/'); + $response->assertRedirect('/admin'); } /** @test */ From 483b3016ba0941699d6712327d5963d60016d68a Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 27 Oct 2023 20:33:43 +0100 Subject: [PATCH 4/4] refactor: Refactor PasskeysController and Passkey model - Remove unused `use` statements and imports in `PasskeysController.php` and `Passkey.php` - Improve code cleanliness and remove unnecessary dependencies --- app/Http/Controllers/Admin/PasskeysController.php | 12 +++++------- app/Models/Passkey.php | 1 - 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Admin/PasskeysController.php b/app/Http/Controllers/Admin/PasskeysController.php index e493926e..5fdca622 100644 --- a/app/Http/Controllers/Admin/PasskeysController.php +++ b/app/Http/Controllers/Admin/PasskeysController.php @@ -16,8 +16,6 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\Hash; -use Illuminate\Support\Facades\Validator; use Illuminate\View\View; use ParagonIE\ConstantTime\Base64UrlSafe; use Throwable; @@ -121,12 +119,12 @@ class PasskeysController extends Controller $attestationSupportManager = AttestationStatementSupportManager::create(); $attestationSupportManager->add(NoneAttestationStatementSupport::create()); - $attestationObjectLoader = AttestationObjectLoader::create($attestationSupportManager); + $attestationObjectLoader = AttestationObjectLoader::create($attestationSupportManager); $publicKeyCredentialLoader = PublicKeyCredentialLoader::create($attestationObjectLoader); $publicKeyCredential = $publicKeyCredentialLoader->load(json_encode($request->all(), JSON_THROW_ON_ERROR)); - if (!$publicKeyCredential->response instanceof AuthenticatorAttestationResponse) { + if (! $publicKeyCredential->response instanceof AuthenticatorAttestationResponse) { throw new WebAuthnException('Invalid response type'); } @@ -193,12 +191,12 @@ class PasskeysController extends Controller $attestationSupportManager = AttestationStatementSupportManager::create(); $attestationSupportManager->add(NoneAttestationStatementSupport::create()); - $attestationObjectLoader = AttestationObjectLoader::create($attestationSupportManager); + $attestationObjectLoader = AttestationObjectLoader::create($attestationSupportManager); $publicKeyCredentialLoader = PublicKeyCredentialLoader::create($attestationObjectLoader); $publicKeyCredential = $publicKeyCredentialLoader->load(json_encode($request->all(), JSON_THROW_ON_ERROR)); - if (!$publicKeyCredential->response instanceof AuthenticatorAssertionResponse) { + if (! $publicKeyCredential->response instanceof AuthenticatorAssertionResponse) { return response()->json([ 'success' => false, 'message' => 'Invalid response type', @@ -206,7 +204,7 @@ class PasskeysController extends Controller } $passkey = Passkey::firstWhere('passkey_id', $publicKeyCredential->id); - if (!$passkey) { + if (! $passkey) { return response()->json([ 'success' => false, 'message' => 'Passkey not found', diff --git a/app/Models/Passkey.php b/app/Models/Passkey.php index 343fa40d..041a1b87 100644 --- a/app/Models/Passkey.php +++ b/app/Models/Passkey.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace App\Models; -use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo;