From 31e7c60289181022992c58afe29ad48978e742b4 Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Mon, 6 Feb 2023 15:59:52 -0500 Subject: [PATCH 01/41] starting the conversion --- controllers/printers_controller.js | 102 +++ controllers/prints_controller.js | 0 models/print_model.js | 0 models/printer_model.js | 0 package-lock.json | 1310 ++++++++++++++++++++++++++++ 5 files changed, 1412 insertions(+) create mode 100644 controllers/printers_controller.js create mode 100644 controllers/prints_controller.js create mode 100644 models/print_model.js create mode 100644 models/printer_model.js create mode 100644 package-lock.json diff --git a/controllers/printers_controller.js b/controllers/printers_controller.js new file mode 100644 index 0000000..396458f --- /dev/null +++ b/controllers/printers_controller.js @@ -0,0 +1,102 @@ +app.get('/printer/allprinters', function(request, response){ + let printerList = JSON.parse(fs.readFileSync('data/printers.json')) + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("allPrinters", { + printers: printerList + }) +}); + +//Used to be /report +app.get('/printer/report', function(request, response){ + printerList = JSON.parse(fs.readFileSync('data/printers.json')) + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("report", { + printers:printerList + }) +}); + +//used to be /report +app.post('/printer/allprints', function(request, response){ + printerList = JSON.parse(fs.readFileSync('data/printers.json')) + let name = request.body.printer; + console.log("name = " + name); + console.log(printerList[name]) + + printerList[name]["errors"].push(request.body.errormsg) + fs.writeFileSync('data/printers.json', JSON.stringify(printerList)) + + let noSpaceName = name.split(' ').join('') + + response.status(200) + response.setHeader('Content-Type', "text/html"); + response.render("printerDetails", { + printer : printerList[name] + }) + response.redirect("/printer/"+noSpaceName) +}); + +app.get('/printer/new', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("addPrinter") + }); + + +//used to be /printer/addprinter +app.post('/printer', function(request, response){ + let printers = JSON.parse(fs.readFileSync("data/printers.json")) + let printerName = request.body.printName; + let stats = request.body.status; + let serv = request.body.service; + let pho = request.body.photo; + let location = request.body.local; + let err = request.body.err; + let prints = request.body.prints; + let printTime = request.body.printTime; + + if(printerName && stats && serv && pho && location && err && prints){ + let newPrinter = { + "name":printerName, + "Status":stats, + "errors":[err], + "prints":[prints], + "printingTime":printTime, + "lastService":serv, + "photo":pho, + "location":location + } + printers[printerName] = newPrinter; + fs.writeFileSync('data/printers.json', JSON.stringify(printers)) + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("/printerDetails", { + printer:printerName.split(' ').join(''), + }) + response.redirect("printerDetails/"+printerName) + } + }); + +app.get('/printer/:id', function(request, response){ + let printers = JSON.parse(fs.readFileSync("data/printers.json")) + console.log("/printer/:printerName") + let printerName = request.params.id; + console.log("printerName = "+printerName) + console.log("printer = "+printers[printerName]) + if(printers[printerName]){ + console.log("This is a real print") + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("printerDetails", { + printer: printers[printerName] + }); + } else{ + response.status(404); + response.setHeader('Content-Type', 'text/html') + response.render("error", { + "errorCode":"404" + }); + } + }); + diff --git a/controllers/prints_controller.js b/controllers/prints_controller.js new file mode 100644 index 0000000..e69de29 diff --git a/models/print_model.js b/models/print_model.js new file mode 100644 index 0000000..e69de29 diff --git a/models/printer_model.js b/models/printer_model.js new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ac5bf9e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1310 @@ +{ + "name": "express-servers-GET", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "express-servers-GET", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "ejs": "^3.1.6", + "express": "^4.17.1", + "moment": "^2.29.4" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + } + }, + "dependencies": { + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "requires": { + "jake": "^10.8.5" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + } + } +} From 4b4db7d01fcdc3bc6a611bb16dec530f8dcacd94 Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Wed, 8 Feb 2023 09:03:16 -0500 Subject: [PATCH 02/41] adding Hall of Fame Prints --- controllers/hofprints_controller.js | 41 +++++++++++++ controllers/printers_controller.js | 2 +- controllers/prints_controller.js | 92 +++++++++++++++++++++++++++++ models/hofprint_model.js | 0 server.js | 5 -- 5 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 controllers/hofprints_controller.js create mode 100644 models/hofprint_model.js diff --git a/controllers/hofprints_controller.js b/controllers/hofprints_controller.js new file mode 100644 index 0000000..0f9e560 --- /dev/null +++ b/controllers/hofprints_controller.js @@ -0,0 +1,41 @@ +app.get('/hofprints', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("halloffame", { + hofPrints : JSON.parse(fs.readFileSync("data/hofprints.json")) + }) + }); + + app.get('/hofprints/hofsubmit', function(request,response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("hofSubmit") + }); + + app.post('/hofprints', function(request, response){ + let hofPrints = JSON.parse(fs.readFileSync('data/hofprints.json')); + let printName = request.body.printName; + let desc = request.body.description; + let printer = request.body.printer; + let stName = request.body.studentName; + let ph = request.body.photo; + + if(ph && stName && desc && printer && printName){ + newPrint = { + "name":printName, + "printer":printer, + "student":stName, + "description":desc, + "photo":ph + } + hofPrints[printName] = newPrint; + fs.writeFileSync('data/hofprints.json', JSON.stringify(hofPrints)) + + response.status(200); + response.setHeader('Content-Type', "text/html"); + response.render('halloffame') + response.redirect('/halloffame') + } else { + alert("Please fill out every field") + } + }) diff --git a/controllers/printers_controller.js b/controllers/printers_controller.js index 396458f..282b1d7 100644 --- a/controllers/printers_controller.js +++ b/controllers/printers_controller.js @@ -8,7 +8,7 @@ app.get('/printer/allprinters', function(request, response){ }); //Used to be /report -app.get('/printer/report', function(request, response){ +app.get('/printer/allprint/report', function(request, response){ printerList = JSON.parse(fs.readFileSync('data/printers.json')) response.status(200); response.setHeader('Content-Type', 'text/html') diff --git a/controllers/prints_controller.js b/controllers/prints_controller.js index e69de29..0f50e0c 100644 --- a/controllers/prints_controller.js +++ b/controllers/prints_controller.js @@ -0,0 +1,92 @@ +app.get('/print/allprints', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("allPrints", { + prints : JSON.parse(fs.readFileSync("data/prints.json")) + }) + }); + + + app.get('/printcreate', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("printCreate") + }); + + app.get('/print/:printName', function(request, response){ + let prints = JSON.parse(fs.readFileSync("data/prints.JSON")) + console.log("/print/:printName") + let printName = request.params.printName; + // console.log("printName = "+printName) + // console.log("prints = "+prints[printName]["description"]) + if(prints[printName]){ + console.log("it's the if statement") + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("printDetails", { + print: prints[printName] + }); + + } else{ + response.status(404); + response.setHeader('Content-Type', 'text/html') + response.render("error", { + "errorCode":"404" + }); + } + + response.status(200); + + + }); + app.post('/printcreate', function(request,response){ + let prints = JSON.parse(fs.readFileSync("data/prints.json")); + let printName = request.body.printName; + + // console.log(prints); + // console.log("PrintName = "+ printName); + // console.log(request.body.width) + if(request.body.printName && request.body.description && request.body.link && request.body.infill && request.body.width && request.body.time && request.body.printer && request.body.photo){ + let newPrint = { + "name":printName, + "description":request.body.description, + "link":request.body.link, + "time":request.body.time, + "infill":request.body.infill, + "width":request.body.width, + "studentName":request.body.studentName, + "date":request.body.date, + "printer":request.body.printer, + "photo":request.body.photo, + }; + console.log("newPrint = "); + console.log(newPrint) + prints[printName] = newPrint; + fs.writeFileSync("data/prints.json", JSON.stringify(prints)) + console.log(JSON.parse(fs.readFileSync('data/prints.json'))) + + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("printDetails", { + print : newPrint + }) + response.redirect("/print/"+printName) + } else { + alert("Please fill out all information before saving"); + } + }); + + + + + // // test Details + app.get('/printDetails', function(request, response){ + response.status(200) + response.setHeader('Content-Type', 'text/html') + response.render("printDetails", { + print: { + "name":"tempTower_mini-IK","description":"An automated temp tower from Prusa itself to test the new filament on the minis","link":"https://www.printables.com/model/20652-temp-tower-pla-petg-absasa-for-prusa-mini-mk3s-and","time":"229","infill":"20","width":"0.3","studentName":"Ian_Kopke","printer":"MK3Z", "date":"1/13/23/12:05/red" + } + }) + }); + \ No newline at end of file diff --git a/models/hofprint_model.js b/models/hofprint_model.js new file mode 100644 index 0000000..e69de29 diff --git a/server.js b/server.js index 3440c42..2a419be 100644 --- a/server.js +++ b/server.js @@ -293,11 +293,6 @@ app.get('/printDetails', function(request, response){ }) }); - -//------------------- DEMO CODE BELOW ------------------------------ -// Because routes/middleware are applied in order, -// this will act as a default error route in case of -// a request fot an invalid route app.use("", function(request, response){ response.status(404); response.setHeader('Content-Type', 'text/html') From 0db8bfc7022190c05dac1d4b3d5e4542bf4ccd99 Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Wed, 8 Feb 2023 09:15:20 -0500 Subject: [PATCH 03/41] MVC attempt so that I don't break the main branch --- controllers/index.js | 28 +++ controllers/printers_controller.js | 6 +- server.js | 292 +--------------------- serverOld.js | 309 ++++++++++++++++++++++++ views/{ => hofprint}/halloffame.ejs | 0 views/{ => hofprint}/hofSubmit.ejs | 0 views/{ => printers}/addPrinter.ejs | 0 views/{ => printers}/allPrinters.ejs | 0 views/{ => printers}/printerDetails.ejs | 0 views/{ => printers}/report.ejs | 0 views/{ => printers}/status.ejs | 0 views/{ => prints}/allPrints.ejs | 0 views/{ => prints}/printCreate.ejs | 0 views/{ => prints}/printDetails.ejs | 0 14 files changed, 346 insertions(+), 289 deletions(-) create mode 100644 controllers/index.js create mode 100644 serverOld.js rename views/{ => hofprint}/halloffame.ejs (100%) rename views/{ => hofprint}/hofSubmit.ejs (100%) rename views/{ => printers}/addPrinter.ejs (100%) rename views/{ => printers}/allPrinters.ejs (100%) rename views/{ => printers}/printerDetails.ejs (100%) rename views/{ => printers}/report.ejs (100%) rename views/{ => printers}/status.ejs (100%) rename views/{ => prints}/allPrints.ejs (100%) rename views/{ => prints}/printCreate.ejs (100%) rename views/{ => prints}/printDetails.ejs (100%) diff --git a/controllers/index.js b/controllers/index.js new file mode 100644 index 0000000..7e84825 --- /dev/null +++ b/controllers/index.js @@ -0,0 +1,28 @@ +const express = require('express'), + router = express.Router(); + +router.get('/', function(request, response) { + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("index"); +}); + +router.get('/error', function(request, response) { + const errorCode = request.query.code; + if (!errorCode) errorCode = 400; + const errors = { + '400': "Unknown Client Error", + '401': "Invlaid Login", + '404': "Resource Not Found", + '500': "Server problem" + } + + response.status(errorCode); + response.setHeader('Content-Type', 'text/html') + response.render("error", { + "errorCode": errorCode, + "details": errors[errorCode] + }); +}); + +module.exports = router diff --git a/controllers/printers_controller.js b/controllers/printers_controller.js index 282b1d7..de7283a 100644 --- a/controllers/printers_controller.js +++ b/controllers/printers_controller.js @@ -77,10 +77,10 @@ app.post('/printer', function(request, response){ response.redirect("printerDetails/"+printerName) } }); - +//used to be printer/printerName app.get('/printer/:id', function(request, response){ let printers = JSON.parse(fs.readFileSync("data/printers.json")) - console.log("/printer/:printerName") + console.log("/printer/:id") let printerName = request.params.id; console.log("printerName = "+printerName) console.log("printer = "+printers[printerName]) @@ -88,7 +88,7 @@ app.get('/printer/:id', function(request, response){ console.log("This is a real print") response.status(200); response.setHeader('Content-Type', 'text/html') - response.render("printerDetails", { + response.render("printers/printerDetails", { printer: printers[printerName] }); } else{ diff --git a/server.js b/server.js index 2a419be..3f32b2d 100644 --- a/server.js +++ b/server.js @@ -1,8 +1,6 @@ //..............Include Express..................................// const express = require('express'); -const fs = require('fs'); const ejs = require('ejs'); -const { application } = require('express'); //..............Create an Express server object..................// const app = express(); @@ -14,291 +12,13 @@ app.use(express.static('public')); //specify location of static assests app.set('views', __dirname + '/views'); //specify location of templates app.set('view engine', 'ejs'); //specify templating library -//.............Define server routes..............................// -//Express checks routes in the order in which they are defined +app.use(require('./controllers/index')); +app.use(require('./controllers/prints_controller')); +app.use(require('./controllers/printers_controller')); +app.use(require('./controllers/hofprints_controller')); - - -app.get('/', function(request, response) { - let hofPrints = JSON.parse(fs.readFileSync('data/hofprints.json')); - let keys = Object.keys(hofPrints) - let randomKey = Math.floor(Math.random()*keys.length); - let print = hofPrints[keys[randomKey]] - console.log(print) - const date = new Date(); - console.log(date) - - response.status(200); - response.setHeader('Content-Type', 'text/html'); - response.render("index", { - hofPrint :print, - printers: JSON.parse(fs.readFileSync('data/printers.json')) - - }) -}); - -app.get('/guide', function(request, response) { - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("guide") -}); - -app.get('/advtips', function(request, response){ - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("advTips") -}) - -app.get('/schedule', function(request, response){ - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("schedule") -}); - -app.get('/status', function(request, response){ - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("status") -}); - -app.get('/allprinters', function(request, response){ - let printerList = JSON.parse(fs.readFileSync('data/printers.json')) - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("allPrinters", { - printers: printerList - }) -}); - - -app.get('/report', function(request, response){ - printerList = JSON.parse(fs.readFileSync('data/printers.json')) - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("report", { - printers:printerList - }) -}); - -app.post('/report', function(request, response){ - printerList = JSON.parse(fs.readFileSync('data/printers.json')) - let name = request.body.printer; - console.log("name = " + name); - console.log(printerList[name]) - - printerList[name]["errors"].push(request.body.errormsg) - fs.writeFileSync('data/printers.json', JSON.stringify(printerList)) - - let noSpaceName = name.split(' ').join('') - - response.status(200) - response.setHeader('Content-Type', "text/html"); - response.render("printerDetails", { - printer : printerList[name] - }) - response.redirect("/printer/"+noSpaceName) -}); - -app.get('/addprinter', function(request, response){ - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("addPrinter") -}); - -app.post('/addprinter', function(request, response){ - let printers = JSON.parse(fs.readFileSync("data/printers.json")) - let printerName = request.body.printName; - let stats = request.body.status; - let serv = request.body.service; - let pho = request.body.photo; - let location = request.body.local; - let err = request.body.err; - let prints = request.body.prints; - let printTime = request.body.printTime; - - if(printerName && stats && serv && pho && location && err && prints){ - let newPrinter = { - "name":printerName, - "Status":stats, - "errors":[err], - "prints":[prints], - "printingTime":printTime, - "lastService":serv, - "photo":pho, - "location":location - } - printers[printerName] = newPrinter; - fs.writeFileSync('data/printers.json', JSON.stringify(printers)) - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("/printerDetails", { - printer:printerName.split(' ').join(''), - }) - response.redirect("printerDetails/"+printerName) - } -}); - -app.get('/printer/:printerName', function(request, response){ - let printers = JSON.parse(fs.readFileSync("data/printers.json")) - console.log("/printer/:printerName") - let printerName = request.params.printerName; - console.log("printerName = "+printerName) - console.log("printer = "+printers[printerName]) - if(printers[printerName]){ - console.log("This is a real print") - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("printerDetails", { - printer: printers[printerName] - }); - } else{ - response.status(404); - response.setHeader('Content-Type', 'text/html') - response.render("error", { - "errorCode":"404" - }); - } -}); - -app.get('/allprints', function(request, response){ - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("allPrints", { - prints : JSON.parse(fs.readFileSync("data/prints.json")) - }) -}); - -app.get('/halloffame', function(request, response){ - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("halloffame", { - hofPrints : JSON.parse(fs.readFileSync("data/hofprints.json")) - }) -}); - -app.get('/hofsubmit', function(request,response){ - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("hofSubmit") -}); - -app.post('/hofsubmit', function(request, response){ - let hofPrints = JSON.parse(fs.readFileSync('data/hofprints.json')); - let printName = request.body.printName; - let desc = request.body.description; - let printer = request.body.printer; - let stName = request.body.studentName; - let ph = request.body.photo; - - if(ph && stName && desc && printer && printName){ - newPrint = { - "name":printName, - "printer":printer, - "student":stName, - "description":desc, - "photo":ph - } - hofPrints[printName] = newPrint; - fs.writeFileSync('data/hofprints.json', JSON.stringify(hofPrints)) - - response.status(200); - response.setHeader('Content-Type', "text/html"); - response.render('halloffame') - response.redirect('/halloffame') - } else { - alert("Please fill out every field") - } -}) - -app.get('/printcreate', function(request, response){ - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("printCreate") -}); - -app.get('/print/:printName', function(request, response){ - let prints = JSON.parse(fs.readFileSync("data/prints.JSON")) - console.log("/print/:printName") - let printName = request.params.printName; - // console.log("printName = "+printName) - // console.log("prints = "+prints[printName]["description"]) - if(prints[printName]){ - console.log("it's the if statement") - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("printDetails", { - print: prints[printName] - }); - - } else{ - response.status(404); - response.setHeader('Content-Type', 'text/html') - response.render("error", { - "errorCode":"404" - }); - } - - response.status(200); - - -}); -app.post('/printcreate', function(request,response){ - let prints = JSON.parse(fs.readFileSync("data/prints.json")); - let printName = request.body.printName; - - // console.log(prints); - // console.log("PrintName = "+ printName); - // console.log(request.body.width) - if(request.body.printName && request.body.description && request.body.link && request.body.infill && request.body.width && request.body.time && request.body.printer && request.body.photo){ - let newPrint = { - "name":printName, - "description":request.body.description, - "link":request.body.link, - "time":request.body.time, - "infill":request.body.infill, - "width":request.body.width, - "studentName":request.body.studentName, - "date":request.body.date, - "printer":request.body.printer, - "photo":request.body.photo, - }; - console.log("newPrint = "); - console.log(newPrint) - prints[printName] = newPrint; - fs.writeFileSync("data/prints.json", JSON.stringify(prints)) - console.log(JSON.parse(fs.readFileSync('data/prints.json'))) - - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("printDetails", { - print : newPrint - }) - response.redirect("/print/"+printName) - } else { - alert("Please fill out all information before saving"); - } -}); - - - - -// // test Details -app.get('/printDetails', function(request, response){ - response.status(200) - response.setHeader('Content-Type', 'text/html') - response.render("printDetails", { - print: { - "name":"tempTower_mini-IK","description":"An automated temp tower from Prusa itself to test the new filament on the minis","link":"https://www.printables.com/model/20652-temp-tower-pla-petg-absasa-for-prusa-mini-mk3s-and","time":"229","infill":"20","width":"0.3","studentName":"Ian_Kopke","printer":"MK3Z", "date":"1/13/23/12:05/red" - } - }) -}); - -app.use("", function(request, response){ - response.status(404); - response.setHeader('Content-Type', 'text/html') - response.render("error", { - "errorCode":"404" - }); +app.use("", function(request, response) { + response.redirect('/error?code=400'); }); //..............Start the server...............................// diff --git a/serverOld.js b/serverOld.js new file mode 100644 index 0000000..939fa3d --- /dev/null +++ b/serverOld.js @@ -0,0 +1,309 @@ + +//..............Include Express..................................// +const express = require('express'); +const fs = require('fs'); +const ejs = require('ejs'); +const { application } = require('express'); + +//..............Create an Express server object..................// +const app = express(); + +//..............Apply Express middleware to the server object....// +app.use(express.json()); //Used to parse JSON bodies (needed for POST requests) +app.use(express.urlencoded()); +app.use(express.static('public')); //specify location of static assests +app.set('views', __dirname + '/views'); //specify location of templates +app.set('view engine', 'ejs'); //specify templating library + +//.............Define server routes..............................// +//Express checks routes in the order in which they are defined + + + +app.get('/', function(request, response) { + let hofPrints = JSON.parse(fs.readFileSync('data/hofprints.json')); + let keys = Object.keys(hofPrints) + let randomKey = Math.floor(Math.random()*keys.length); + let print = hofPrints[keys[randomKey]] + console.log(print) + const date = new Date(); + console.log(date) + + response.status(200); + response.setHeader('Content-Type', 'text/html'); + response.render("index", { + hofPrint :print, + printers: JSON.parse(fs.readFileSync('data/printers.json')) + + }) +}); + +app.get('/guide', function(request, response) { + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("guide") +}); + +app.get('/advtips', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("advTips") +}) + +app.get('/schedule', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("schedule") +}); + +app.get('/status', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("status") +}); + +app.get('/allprinters', function(request, response){ + let printerList = JSON.parse(fs.readFileSync('data/printers.json')) + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("allPrinters", { + printers: printerList + }) +}); + + +app.get('/report', function(request, response){ + printerList = JSON.parse(fs.readFileSync('data/printers.json')) + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("report", { + printers:printerList + }) +}); + +app.post('/report', function(request, response){ + printerList = JSON.parse(fs.readFileSync('data/printers.json')) + let name = request.body.printer; + console.log("name = " + name); + console.log(printerList[name]) + + printerList[name]["errors"].push(request.body.errormsg) + fs.writeFileSync('data/printers.json', JSON.stringify(printerList)) + + let noSpaceName = name.split(' ').join('') + + response.status(200) + response.setHeader('Content-Type', "text/html"); + response.render("printerDetails", { + printer : printerList[name] + }) + response.redirect("/printer/"+noSpaceName) +}); + +app.get('/addprinter', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("addPrinter") +}); + +app.post('/addprinter', function(request, response){ + let printers = JSON.parse(fs.readFileSync("data/printers.json")) + let printerName = request.body.printName; + let stats = request.body.status; + let serv = request.body.service; + let pho = request.body.photo; + let location = request.body.local; + let err = request.body.err; + let prints = request.body.prints; + let printTime = request.body.printTime; + + if(printerName && stats && serv && pho && location && err && prints){ + let newPrinter = { + "name":printerName, + "Status":stats, + "errors":[err], + "prints":[prints], + "printingTime":printTime, + "lastService":serv, + "photo":pho, + "location":location + } + printers[printerName] = newPrinter; + fs.writeFileSync('data/printers.json', JSON.stringify(printers)) + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("/printerDetails", { + printer:printerName.split(' ').join(''), + }) + response.redirect("printerDetails/"+printerName) + } +}); + +app.get('/printer/:printerName', function(request, response){ + let printers = JSON.parse(fs.readFileSync("data/printers.json")) + console.log("/printer/:printerName") + let printerName = request.params.printerName; + console.log("printerName = "+printerName) + console.log("printer = "+printers[printerName]) + if(printers[printerName]){ + console.log("This is a real print") + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("printerDetails", { + printer: printers[printerName] + }); + } else{ + response.status(404); + response.setHeader('Content-Type', 'text/html') + response.render("error", { + "errorCode":"404" + }); + } +}); + +app.get('/allprints', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("allPrints", { + prints : JSON.parse(fs.readFileSync("data/prints.json")) + }) +}); + +app.get('/halloffame', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("halloffame", { + hofPrints : JSON.parse(fs.readFileSync("data/hofprints.json")) + }) +}); + +app.get('/hofsubmit', function(request,response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("hofSubmit") +}); + +app.post('/hofsubmit', function(request, response){ + let hofPrints = JSON.parse(fs.readFileSync('data/hofprints.json')); + let printName = request.body.printName; + let desc = request.body.description; + let printer = request.body.printer; + let stName = request.body.studentName; + let ph = request.body.photo; + + if(ph && stName && desc && printer && printName){ + newPrint = { + "name":printName, + "printer":printer, + "student":stName, + "description":desc, + "photo":ph + } + hofPrints[printName] = newPrint; + fs.writeFileSync('data/hofprints.json', JSON.stringify(hofPrints)) + + response.status(200); + response.setHeader('Content-Type', "text/html"); + response.render('halloffame') + response.redirect('/halloffame') + } else { + alert("Please fill out every field") + } +}) + +app.get('/printcreate', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("printCreate") +}); + +app.get('/print/:printName', function(request, response){ + let prints = JSON.parse(fs.readFileSync("data/prints.JSON")) + console.log("/print/:printName") + let printName = request.params.printName; + // console.log("printName = "+printName) + // console.log("prints = "+prints[printName]["description"]) + if(prints[printName]){ + console.log("it's the if statement") + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("printDetails", { + print: prints[printName] + }); + + } else{ + response.status(404); + response.setHeader('Content-Type', 'text/html') + response.render("error", { + "errorCode":"404" + }); + } + + response.status(200); + + +}); +app.post('/printcreate', function(request,response){ + let prints = JSON.parse(fs.readFileSync("data/prints.json")); + let printName = request.body.printName; + + // console.log(prints); + // console.log("PrintName = "+ printName); + // console.log(request.body.width) + if(request.body.printName && request.body.description && request.body.link && request.body.infill && request.body.width && request.body.time && request.body.printer && request.body.photo){ + let newPrint = { + "name":printName, + "description":request.body.description, + "link":request.body.link, + "time":request.body.time, + "infill":request.body.infill, + "width":request.body.width, + "studentName":request.body.studentName, + "date":request.body.date, + "printer":request.body.printer, + "photo":request.body.photo, + }; + console.log("newPrint = "); + console.log(newPrint) + prints[printName] = newPrint; + fs.writeFileSync("data/prints.json", JSON.stringify(prints)) + console.log(JSON.parse(fs.readFileSync('data/prints.json'))) + + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("printDetails", { + print : newPrint + }) + response.redirect("/print/"+printName) + } else { + alert("Please fill out all information before saving"); + } +}); + + + + +// // test Details +app.get('/printDetails', function(request, response){ + response.status(200) + response.setHeader('Content-Type', 'text/html') + response.render("printDetails", { + print: { + "name":"tempTower_mini-IK","description":"An automated temp tower from Prusa itself to test the new filament on the minis","link":"https://www.printables.com/model/20652-temp-tower-pla-petg-absasa-for-prusa-mini-mk3s-and","time":"229","infill":"20","width":"0.3","studentName":"Ian_Kopke","printer":"MK3Z", "date":"1/13/23/12:05/red" + } + }) +}); + +app.use("", function(request, response){ + response.status(404); + response.setHeader('Content-Type', 'text/html') + response.render("error", { + "errorCode":"404" + }); +}); + +//..............Start the server...............................// +const port = process.env.PORT || 3000; +app.listen(port, function() { + console.log('Server started at http://localhost:'+port+'.') +}); diff --git a/views/halloffame.ejs b/views/hofprint/halloffame.ejs similarity index 100% rename from views/halloffame.ejs rename to views/hofprint/halloffame.ejs diff --git a/views/hofSubmit.ejs b/views/hofprint/hofSubmit.ejs similarity index 100% rename from views/hofSubmit.ejs rename to views/hofprint/hofSubmit.ejs diff --git a/views/addPrinter.ejs b/views/printers/addPrinter.ejs similarity index 100% rename from views/addPrinter.ejs rename to views/printers/addPrinter.ejs diff --git a/views/allPrinters.ejs b/views/printers/allPrinters.ejs similarity index 100% rename from views/allPrinters.ejs rename to views/printers/allPrinters.ejs diff --git a/views/printerDetails.ejs b/views/printers/printerDetails.ejs similarity index 100% rename from views/printerDetails.ejs rename to views/printers/printerDetails.ejs diff --git a/views/report.ejs b/views/printers/report.ejs similarity index 100% rename from views/report.ejs rename to views/printers/report.ejs diff --git a/views/status.ejs b/views/printers/status.ejs similarity index 100% rename from views/status.ejs rename to views/printers/status.ejs diff --git a/views/allPrints.ejs b/views/prints/allPrints.ejs similarity index 100% rename from views/allPrints.ejs rename to views/prints/allPrints.ejs diff --git a/views/printCreate.ejs b/views/prints/printCreate.ejs similarity index 100% rename from views/printCreate.ejs rename to views/prints/printCreate.ejs diff --git a/views/printDetails.ejs b/views/prints/printDetails.ejs similarity index 100% rename from views/printDetails.ejs rename to views/prints/printDetails.ejs From 84bae764815407cfe842b216bc28ddf2ccd13f76 Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Wed, 8 Feb 2023 09:42:21 -0500 Subject: [PATCH 04/41] Update index.js --- controllers/index.js | 47 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/controllers/index.js b/controllers/index.js index 7e84825..35c6388 100644 --- a/controllers/index.js +++ b/controllers/index.js @@ -1,12 +1,49 @@ const express = require('express'), router = express.Router(); -router.get('/', function(request, response) { - response.status(200); - response.setHeader('Content-Type', 'text/html') - response.render("index"); -}); + router.get('/', function(request, response) { + let hofPrints = JSON.parse(fs.readFileSync('data/hofprints.json')); + let keys = Object.keys(hofPrints) + let randomKey = Math.floor(Math.random()*keys.length); + let print = hofPrints[keys[randomKey]] + console.log(print) + const date = new Date(); + console.log(date) + + response.status(200); + response.setHeader('Content-Type', 'text/html'); + response.render("index", { + hofPrint :print, + printers: JSON.parse(fs.readFileSync('data/printers.json')) + + }) + }); + + router.get('/guide', function(request, response) { + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("guide") + }); + + router.get('/advtips', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("advTips") + }) + + router.get('/schedule', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("schedule") + }); + + router.get('/status', function(request, response){ + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("status") + }); + router.get('/error', function(request, response) { const errorCode = request.query.code; if (!errorCode) errorCode = 400; From 48362170d5c3d235bcc6c052e20c07fe4b8f4d3f Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Sat, 11 Feb 2023 14:31:35 -0500 Subject: [PATCH 05/41] halfway through updating Routes Majority of routes are changed and working --- controllers/hofprints_controller.js | 19 +++++++---- controllers/index.js | 1 + controllers/printers_controller.js | 32 +++++++++++------- controllers/prints_controller.js | 35 ++++++++++++-------- data/hofprints.json | 2 +- package.json | 6 ++-- server.js | 2 ++ views/{hofprint => hofprints}/halloffame.ejs | 6 ++-- views/{hofprint => hofprints}/hofSubmit.ejs | 4 +-- views/partials/navbar.ejs | 16 ++++----- views/printers/addPrinter.ejs | 4 +-- views/printers/allPrinters.ejs | 4 +-- views/printers/printerDetails.ejs | 4 +-- views/printers/report.ejs | 4 +-- views/printers/status.ejs | 4 +-- views/prints/allPrints.ejs | 4 +-- views/prints/printCreate.ejs | 6 ++-- views/prints/printDetails.ejs | 2 +- 18 files changed, 91 insertions(+), 64 deletions(-) rename views/{hofprint => hofprints}/halloffame.ejs (87%) rename views/{hofprint => hofprints}/hofSubmit.ejs (85%) diff --git a/controllers/hofprints_controller.js b/controllers/hofprints_controller.js index 0f9e560..6ac12b1 100644 --- a/controllers/hofprints_controller.js +++ b/controllers/hofprints_controller.js @@ -1,18 +1,23 @@ -app.get('/hofprints', function(request, response){ +const express = require('express'), + router = express.Router(); +const fs = require('fs'); + + +router.get('/hofprints', function(request, response){ response.status(200); response.setHeader('Content-Type', 'text/html') - response.render("halloffame", { + response.render("hofprints/halloffame", { hofPrints : JSON.parse(fs.readFileSync("data/hofprints.json")) }) }); - app.get('/hofprints/hofsubmit', function(request,response){ + router.get('/hofprints/hofsubmit', function(request,response){ response.status(200); response.setHeader('Content-Type', 'text/html') - response.render("hofSubmit") + response.render("hofprints/hofSubmit") }); - app.post('/hofprints', function(request, response){ + router.post('/hofprints', function(request, response){ let hofPrints = JSON.parse(fs.readFileSync('data/hofprints.json')); let printName = request.body.printName; let desc = request.body.description; @@ -33,9 +38,11 @@ app.get('/hofprints', function(request, response){ response.status(200); response.setHeader('Content-Type', "text/html"); - response.render('halloffame') + response.render('hofprints/halloffame') response.redirect('/halloffame') } else { alert("Please fill out every field") } }) + + module.exports = router; \ No newline at end of file diff --git a/controllers/index.js b/controllers/index.js index 35c6388..66250e4 100644 --- a/controllers/index.js +++ b/controllers/index.js @@ -1,6 +1,7 @@ const express = require('express'), router = express.Router(); +const fs = require('fs'); router.get('/', function(request, response) { let hofPrints = JSON.parse(fs.readFileSync('data/hofprints.json')); diff --git a/controllers/printers_controller.js b/controllers/printers_controller.js index de7283a..672d3a3 100644 --- a/controllers/printers_controller.js +++ b/controllers/printers_controller.js @@ -1,24 +1,30 @@ -app.get('/printer/allprinters', function(request, response){ +const express = require('express'), + router = express.Router(); + const fs = require('fs'); + + +//used to be printers/allPrinters +router.get('/printer', function(request, response){ let printerList = JSON.parse(fs.readFileSync('data/printers.json')) response.status(200); response.setHeader('Content-Type', 'text/html') - response.render("allPrinters", { + response.render("printers/allPrinters", { printers: printerList }) }); //Used to be /report -app.get('/printer/allprint/report', function(request, response){ +router.get('/printer/allprints/report', function(request, response){ printerList = JSON.parse(fs.readFileSync('data/printers.json')) response.status(200); response.setHeader('Content-Type', 'text/html') - response.render("report", { + response.render("printers/report", { printers:printerList }) }); //used to be /report -app.post('/printer/allprints', function(request, response){ +router.post('/printer/allprints', function(request, response){ printerList = JSON.parse(fs.readFileSync('data/printers.json')) let name = request.body.printer; console.log("name = " + name); @@ -31,21 +37,21 @@ app.post('/printer/allprints', function(request, response){ response.status(200) response.setHeader('Content-Type', "text/html"); - response.render("printerDetails", { + response.render("printers/printerDetails", { printer : printerList[name] }) response.redirect("/printer/"+noSpaceName) }); - -app.get('/printer/new', function(request, response){ +//used to be /printer/addPrinter +router.get('/printer/new', function(request, response){ response.status(200); response.setHeader('Content-Type', 'text/html') - response.render("addPrinter") + response.render("printers/addPrinter") }); //used to be /printer/addprinter -app.post('/printer', function(request, response){ +router.post('/printer', function(request, response){ let printers = JSON.parse(fs.readFileSync("data/printers.json")) let printerName = request.body.printName; let stats = request.body.status; @@ -71,14 +77,14 @@ app.post('/printer', function(request, response){ fs.writeFileSync('data/printers.json', JSON.stringify(printers)) response.status(200); response.setHeader('Content-Type', 'text/html') - response.render("/printerDetails", { + response.render("printers/printerDetails", { printer:printerName.split(' ').join(''), }) response.redirect("printerDetails/"+printerName) } }); //used to be printer/printerName -app.get('/printer/:id', function(request, response){ +router.get('/printer/:id', function(request, response){ let printers = JSON.parse(fs.readFileSync("data/printers.json")) console.log("/printer/:id") let printerName = request.params.id; @@ -100,3 +106,5 @@ app.get('/printer/:id', function(request, response){ } }); + + module.exports = router; \ No newline at end of file diff --git a/controllers/prints_controller.js b/controllers/prints_controller.js index 0f50e0c..961edbe 100644 --- a/controllers/prints_controller.js +++ b/controllers/prints_controller.js @@ -1,21 +1,27 @@ -app.get('/print/allprints', function(request, response){ +const express = require('express'), + router = express.Router(); + const fs = require('fs'); + +//used to be prints/allprints +router.get('/prints', function(request, response){ response.status(200); response.setHeader('Content-Type', 'text/html') - response.render("allPrints", { + response.render("prints/allPrints", { prints : JSON.parse(fs.readFileSync("data/prints.json")) }) }); - - app.get('/printcreate', function(request, response){ +//used to be prints/printcreate + router.get('/print/new', function(request, response){ response.status(200); response.setHeader('Content-Type', 'text/html') - response.render("printCreate") + response.render("prints/printCreate") }); - app.get('/print/:printName', function(request, response){ + //used to be prints/:printname + router.get('/prints/:id', function(request, response){ let prints = JSON.parse(fs.readFileSync("data/prints.JSON")) - console.log("/print/:printName") + console.log("/prints/:printName") let printName = request.params.printName; // console.log("printName = "+printName) // console.log("prints = "+prints[printName]["description"]) @@ -23,7 +29,7 @@ app.get('/print/allprints', function(request, response){ console.log("it's the if statement") response.status(200); response.setHeader('Content-Type', 'text/html') - response.render("printDetails", { + response.render("prints/printDetails", { print: prints[printName] }); @@ -39,7 +45,8 @@ app.get('/print/allprints', function(request, response){ }); - app.post('/printcreate', function(request,response){ +//used to be prints/printcreate + router.post('/print', function(request,response){ let prints = JSON.parse(fs.readFileSync("data/prints.json")); let printName = request.body.printName; @@ -67,7 +74,7 @@ app.get('/print/allprints', function(request, response){ response.status(200); response.setHeader('Content-Type', 'text/html') - response.render("printDetails", { + response.render("prints/printDetails", { print : newPrint }) response.redirect("/print/"+printName) @@ -80,13 +87,15 @@ app.get('/print/allprints', function(request, response){ // // test Details - app.get('/printDetails', function(request, response){ + router.get('/printDetails', function(request, response){ response.status(200) response.setHeader('Content-Type', 'text/html') - response.render("printDetails", { + response.render("prints/printDetails", { print: { "name":"tempTower_mini-IK","description":"An automated temp tower from Prusa itself to test the new filament on the minis","link":"https://www.printables.com/model/20652-temp-tower-pla-petg-absasa-for-prusa-mini-mk3s-and","time":"229","infill":"20","width":"0.3","studentName":"Ian_Kopke","printer":"MK3Z", "date":"1/13/23/12:05/red" } }) }); - \ No newline at end of file + + + module.exports = router; \ No newline at end of file diff --git a/data/hofprints.json b/data/hofprints.json index e024fd0..a7c5e1d 100644 --- a/data/hofprints.json +++ b/data/hofprints.json @@ -1 +1 @@ -{"GOWcog_grub_coin-IK":{"name":"GearsOfWarCoin","printer":"MK3 C","student":"Ian Kopke","description":"This was a christmas present for my brother where I put the logo of the COG and the Locust on opposite sides of a coin. Then I switched colors in the middle to make it cooler","photo":"gearscoin.png"},"Pasta Roller":{"name":"Pasta Roller","printer":"All of them","student":"Ian Kopke","description":"A totally innocent pasta roller. Mr. Rose had me print this.","photo":"pastaRoller.jpg"}} \ No newline at end of file +{"GOWcog_grub_coin-IK":{"name":"GearsOfWarCoin","printer":"MK3 C","student":"Ian Kopke","description":"This was a christmas present for my brother where I put the logo of the COG and the Locust on opposite sides of a coin. Then I switched colors in the middle to make it cooler","photo":"gearscoin.png"},"Pasta Roller":{"name":"Pasta Roller","printer":"All of them","student":"Ian Kopke","description":"A totally innocent pasta roller. Mr. Rose had me print this.","photo":"pastaRoller.JPG"}} \ No newline at end of file diff --git a/package.json b/package.json index 03ff6d1..86fb679 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "express-servers-GET", - "version": "1.0.0", - "description": "A basic Paper, Rock, Scissors game with multiple opponents", + "name": "design Lab 2.0", + "version": "2.0.0", + "description": "Organization system for the Trinity School's Design lab", "main": "server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", diff --git a/server.js b/server.js index 3f32b2d..9ad28bd 100644 --- a/server.js +++ b/server.js @@ -26,3 +26,5 @@ const port = process.env.PORT || 3000; app.listen(port, function() { console.log('Server started at http://localhost:'+port+'.') }); + + diff --git a/views/hofprint/halloffame.ejs b/views/hofprints/halloffame.ejs similarity index 87% rename from views/hofprint/halloffame.ejs rename to views/hofprints/halloffame.ejs index df65a07..d5aa18c 100644 --- a/views/hofprint/halloffame.ejs +++ b/views/hofprints/halloffame.ejs @@ -1,8 +1,8 @@ -<%- include('partials/header', {title:"Hall of Fame"}) -%> +<%- include('../partials/header', {title:"Hall of Fame"}) -%>

Hall of Fame!!!

-

Want to submit to the Hall of Fame?

You can do so here! +

Want to submit to the Hall of Fame?

You can do so here! <%for(print in hofPrints){%>
@@ -27,4 +27,4 @@ <%}%> -<%- include('partials/footer') -%> +<%- include('../partials/footer') -%> diff --git a/views/hofprint/hofSubmit.ejs b/views/hofprints/hofSubmit.ejs similarity index 85% rename from views/hofprint/hofSubmit.ejs rename to views/hofprints/hofSubmit.ejs index 5ef2f4c..7c07921 100644 --- a/views/hofprint/hofSubmit.ejs +++ b/views/hofprints/hofSubmit.ejs @@ -1,4 +1,4 @@ -<%- include('partials/header', {title:"Hall of Fame Submission"}) -%> +<%- include('../partials/header', {title:"Hall of Fame Submission"}) -%>

Submit any print you feel Proud of!

@@ -17,4 +17,4 @@
-<%- include('partials/footer') -%> \ No newline at end of file +<%- include('../partials/footer') -%> \ No newline at end of file diff --git a/views/partials/navbar.ejs b/views/partials/navbar.ejs index 73e78be..88c43d2 100644 --- a/views/partials/navbar.ejs +++ b/views/partials/navbar.ejs @@ -14,28 +14,28 @@ schedule
diff --git a/views/printers/addPrinter.ejs b/views/printers/addPrinter.ejs index cd6cfc0..9e362f4 100644 --- a/views/printers/addPrinter.ejs +++ b/views/printers/addPrinter.ejs @@ -1,4 +1,4 @@ -<%- include('partials/header', {title:"Add Printer!"})-%> +<%- include('../partials/header', {title:"Add Printer!"})-%>

Add Printers!

@@ -25,4 +25,4 @@
-<%- include('partials/footer') -%> \ No newline at end of file +<%- include('../partials/footer') -%> \ No newline at end of file diff --git a/views/printers/allPrinters.ejs b/views/printers/allPrinters.ejs index 6e75909..3040450 100644 --- a/views/printers/allPrinters.ejs +++ b/views/printers/allPrinters.ejs @@ -1,4 +1,4 @@ -<%- include('partials/header', {title:"3D Printing Signups!"})-%> +<%- include('../partials/header', {title:"3D Printing Signups!"})-%>

Every Printer is stored Here!

<%for(printer in printers){%> @@ -30,4 +30,4 @@ <%}%> -<%- include('partials/footer') -%> +<%- include('../partials/footer') -%> diff --git a/views/printers/printerDetails.ejs b/views/printers/printerDetails.ejs index 1a257f6..d7077d3 100644 --- a/views/printers/printerDetails.ejs +++ b/views/printers/printerDetails.ejs @@ -1,4 +1,4 @@ -<%- include('partials/header', {title:"Printer Details"})-%> +<%- include('../partials/header', {title:"Printer Details"})-%>

<%=printer["name"]%>

@@ -63,4 +63,4 @@ -<%- include('partials/footer') -%> +<%- include('../partials/footer') -%> diff --git a/views/printers/report.ejs b/views/printers/report.ejs index 6f12125..334d3ad 100644 --- a/views/printers/report.ejs +++ b/views/printers/report.ejs @@ -1,4 +1,4 @@ -<%- include('partials/header', {title:"Status"})-%> +<%- include('../partials/header', {title:"Status"})-%>

Please Report the error below
The error will added to the printer's error list

@@ -19,4 +19,4 @@

Thank you for Reporting!
We will get working on the error as soon as possible.

-<%- include('partials/footer') -%> \ No newline at end of file +<%- include('../partials/footer') -%> \ No newline at end of file diff --git a/views/printers/status.ejs b/views/printers/status.ejs index 30e1510..8b5639c 100644 --- a/views/printers/status.ejs +++ b/views/printers/status.ejs @@ -1,4 +1,4 @@ -<%- include('partials/header', {title:"Status"})-%> +<%- include('../partials/header', {title:"Status"})-%>

Welcome to the Status page

You can see all the printers and the errors that they have had.

@@ -28,4 +28,4 @@ -<%- include('partials/footer') -%> \ No newline at end of file +<%- include('../partials/footer') -%> \ No newline at end of file diff --git a/views/prints/allPrints.ejs b/views/prints/allPrints.ejs index e2f3850..5596e02 100644 --- a/views/prints/allPrints.ejs +++ b/views/prints/allPrints.ejs @@ -1,4 +1,4 @@ -<%- include('partials/header', {title:"3D Printing Signups!"})-%> +<%- include('../partials/header', {title:"3D Printing Signups!"})-%>

Every Print is stored Here!

<%for(print in prints){%> @@ -27,5 +27,5 @@ <%}%> -<%- include('partials/footer') -%> +<%- include('../partials/footer') -%> diff --git a/views/prints/printCreate.ejs b/views/prints/printCreate.ejs index 37b21d8..6579b8c 100644 --- a/views/prints/printCreate.ejs +++ b/views/prints/printCreate.ejs @@ -1,4 +1,4 @@ -<%- include('partials/header', {title:"Add Prints"}) -%> +<%- include('../partials/header', {title:"Add Prints"}) -%>

Create New Print!

Please remember the rules for creating a print

-
-
- Administered By General Rose +
+
+ Admined By General Rose +
+
+ + +
+
+
+
+

Design Lab 2.0!

+
+ +
+ +
+
+
-
- - - + + \ No newline at end of file diff --git a/HiFiViews/sb-admin-2.min.css b/HiFiViews/sb-admin-2.min.css new file mode 100644 index 0000000..ecd25c9 --- /dev/null +++ b/HiFiViews/sb-admin-2.min.css @@ -0,0 +1,11519 @@ +/*! + * Start Bootstrap - SB Admin 2 v4.1.3 (https://startbootstrap.com/theme/sb-admin-2) + * Copyright 2013-2021 Start Bootstrap + * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin-2/blob/master/LICENSE) + */ +/*! + * Bootstrap v4.6.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ + :root { + --blue: #4e73df; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #e74a3b; + --orange: #fd7e14; + --yellow: #f6c23e; + --green: #1cc88a; + --teal: #20c9a6; + --cyan: #36b9cc; + --white: #fff; + --gray: #858796; + --gray-dark: #5a5c69; + --primary: #4e73df; + --secondary: #858796; + --success: #1cc88a; + --info: #36b9cc; + --warning: #f6c23e; + --danger: #e74a3b; + --light: #f8f9fc; + --dark: #5a5c69; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: "Nunito",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; + --font-family-monospace: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace +} + +*,::after,::before { + box-sizing: border-box +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent +} + +article,aside,figcaption,figure,footer,header,hgroup,main,nav,section { + display: block +} + +body { + margin: 0; + font-family: Nunito,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #858796; + text-align: left; + background-color: #fff +} + +[tabindex="-1"]:focus:not(:focus-visible) { + outline: 0!important +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +h1,h2,h3,h4,h5,h6 { + margin-top: 0; + margin-bottom: .5rem +} + +p { + margin-top: 0; + margin-bottom: 1rem +} + +abbr[data-original-title],abbr[title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit +} + +dl,ol,ul { + margin-top: 0; + margin-bottom: 1rem +} + +ol ol,ol ul,ul ol,ul ul { + margin-bottom: 0 +} + +dt { + font-weight: 700 +} + +dd { + margin-bottom: .5rem; + margin-left: 0 +} + +blockquote { + margin: 0 0 1rem +} + +b,strong { + font-weight: bolder +} + +small { + font-size: 80% +} + +sub,sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +a { + color: #4e73df; + text-decoration: none; + background-color: transparent +} + +a:hover { + color: #224abe; + text-decoration: underline +} + +a:not([href]):not([class]) { + color: inherit; + text-decoration: none +} + +a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none +} + +code,kbd,pre,samp { + font-family: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; + font-size: 1em +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + -ms-overflow-style: scrollbar +} + +figure { + margin: 0 0 1rem +} + +img { + vertical-align: middle; + border-style: none +} + +svg { + overflow: hidden; + vertical-align: middle +} + +table { + border-collapse: collapse +} + +caption { + padding-top: .75rem; + padding-bottom: .75rem; + color: #858796; + text-align: left; + caption-side: bottom +} + +th { + text-align: inherit; + text-align: -webkit-match-parent +} + +label { + display: inline-block; + margin-bottom: .5rem +} + +button { + border-radius: 0 +} + +button:focus:not(:focus-visible) { + outline: 0 +} + +button,input,optgroup,select,textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit +} + +button,input { + overflow: visible +} + +button,select { + text-transform: none +} + +[role=button] { + cursor: pointer +} + +select { + word-wrap: normal +} + +[type=button],[type=reset],[type=submit],button { + -webkit-appearance: button +} + +[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled) { + cursor: pointer +} + +[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner { + padding: 0; + border-style: none +} + +input[type=checkbox],input[type=radio] { + box-sizing: border-box; + padding: 0 +} + +textarea { + overflow: auto; + resize: vertical +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0 +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal +} + +progress { + vertical-align: baseline +} + +[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: none +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button +} + +output { + display: inline-block +} + +summary { + display: list-item; + cursor: pointer +} + +template { + display: none +} + +[hidden] { + display: none!important +} + +.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6 { + margin-bottom: .5rem; + font-weight: 400; + line-height: 1.2 +} + +.h1,h1 { + font-size: 2.5rem +} + +.h2,h2 { + font-size: 2rem +} + +.h3,h3 { + font-size: 1.75rem +} + +.h4,h4 { + font-size: 1.5rem +} + +.h5,h5 { + font-size: 1.25rem +} + +.h6,h6 { + font-size: 1rem +} + +.lead { + font-size: 1.25rem; + font-weight: 300 +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2 +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2 +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2 +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2 +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(255, 255, 255, 0.889) +} + +.small,small { + font-size: 80%; + font-weight: 400 +} + +.mark,mark { + padding: .2em; + background-color: #fcf8e3 +} + +.list-unstyled { + padding-left: 0; + list-style: none +} + +.list-inline { + padding-left: 0; + list-style: none +} + +.list-inline-item { + display: inline-block +} + +.list-inline-item:not(:last-child) { + margin-right: .5rem +} + +.initialism { + font-size: 90%; + text-transform: uppercase +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #858796 +} + +.blockquote-footer::before { + content: "\2014\00A0" +} + +.img-fluid { + max-width: 100%; + height: auto +} + +.img-thumbnail { + padding: .25rem; + background-color: #fff; + border: 1px solid #dddfeb; + border-radius: .35rem; + max-width: 100%; + height: auto +} + +.figure { + display: inline-block +} + +.figure-img { + margin-bottom: .5rem; + line-height: 1 +} + +.figure-caption { + font-size: 90%; + color: #858796 +} + +code { + font-size: 87.5%; + color: #e83e8c; + word-wrap: break-word +} + +a>code { + color: inherit +} + +kbd { + padding: .2rem .4rem; + font-size: 87.5%; + color: #fff; + background-color: #3a3b45; + border-radius: .2rem +} + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700 +} + +pre { + display: block; + font-size: 87.5%; + color: #3a3b45 +} + +pre code { + font-size: inherit; + color: inherit; + word-break: normal +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll +} + +.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl { + width: 100%; + padding-right: .75rem; + padding-left: .75rem; + margin-right: auto; + margin-left: auto +} + +@media (min-width: 576px) { + .container,.container-sm { + max-width:540px + } +} + +@media (min-width: 768px) { + .container,.container-md,.container-sm { + max-width:720px + } +} + +@media (min-width: 992px) { + .container,.container-lg,.container-md,.container-sm { + max-width:960px + } +} + +@media (min-width: 1200px) { + .container,.container-lg,.container-md,.container-sm,.container-xl { + max-width:1140px + } +} + +.row { + display: flex; + flex-wrap: wrap; + margin-right: -.75rem; + margin-left: -.75rem +} + +.no-gutters { + margin-right: 0; + margin-left: 0 +} + +.no-gutters>.col,.no-gutters>[class*=col-] { + padding-right: 0; + padding-left: 0 +} + +.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto { + position: relative; + width: 100%; + padding-right: .75rem; + padding-left: .75rem +} + +.col { + flex-basis: 0; + flex-grow: 1; + max-width: 100% +} + +.row-cols-1>* { + flex: 0 0 100%; + max-width: 100% +} + +.row-cols-2>* { + flex: 0 0 50%; + max-width: 50% +} + +.row-cols-3>* { + flex: 0 0 33.33333%; + max-width: 33.33333% +} + +.row-cols-4>* { + flex: 0 0 25%; + max-width: 25% +} + +.row-cols-5>* { + flex: 0 0 20%; + max-width: 20% +} + +.row-cols-6>* { + flex: 0 0 16.66667%; + max-width: 16.66667% +} + +.col-auto { + flex: 0 0 auto; + width: auto; + max-width: 100% +} + +.col-1 { + flex: 0 0 8.33333%; + max-width: 8.33333% +} + +.col-2 { + flex: 0 0 16.66667%; + max-width: 16.66667% +} + +.col-3 { + flex: 0 0 25%; + max-width: 25% +} + +.col-4 { + flex: 0 0 33.33333%; + max-width: 33.33333% +} + +.col-5 { + flex: 0 0 41.66667%; + max-width: 41.66667% +} + +.col-6 { + flex: 0 0 50%; + max-width: 50% +} + +.col-7 { + flex: 0 0 58.33333%; + max-width: 58.33333% +} + +.col-8 { + flex: 0 0 66.66667%; + max-width: 66.66667% +} + +.col-9 { + flex: 0 0 75%; + max-width: 75% +} + +.col-10 { + flex: 0 0 83.33333%; + max-width: 83.33333% +} + +.col-11 { + flex: 0 0 91.66667%; + max-width: 91.66667% +} + +.col-12 { + flex: 0 0 100%; + max-width: 100% +} + +.order-first { + order: -1 +} + +.order-last { + order: 13 +} + +.order-0 { + order: 0 +} + +.order-1 { + order: 1 +} + +.order-2 { + order: 2 +} + +.order-3 { + order: 3 +} + +.order-4 { + order: 4 +} + +.order-5 { + order: 5 +} + +.order-6 { + order: 6 +} + +.order-7 { + order: 7 +} + +.order-8 { + order: 8 +} + +.order-9 { + order: 9 +} + +.order-10 { + order: 10 +} + +.order-11 { + order: 11 +} + +.order-12 { + order: 12 +} + +.offset-1 { + margin-left: 8.33333% +} + +.offset-2 { + margin-left: 16.66667% +} + +.offset-3 { + margin-left: 25% +} + +.offset-4 { + margin-left: 33.33333% +} + +.offset-5 { + margin-left: 41.66667% +} + +.offset-6 { + margin-left: 50% +} + +.offset-7 { + margin-left: 58.33333% +} + +.offset-8 { + margin-left: 66.66667% +} + +.offset-9 { + margin-left: 75% +} + +.offset-10 { + margin-left: 83.33333% +} + +.offset-11 { + margin-left: 91.66667% +} + +@media (min-width: 576px) { + .col-sm { + flex-basis:0; + flex-grow: 1; + max-width: 100% + } + + .row-cols-sm-1>* { + flex: 0 0 100%; + max-width: 100% + } + + .row-cols-sm-2>* { + flex: 0 0 50%; + max-width: 50% + } + + .row-cols-sm-3>* { + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .row-cols-sm-4>* { + flex: 0 0 25%; + max-width: 25% + } + + .row-cols-sm-5>* { + flex: 0 0 20%; + max-width: 20% + } + + .row-cols-sm-6>* { + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto; + max-width: 100% + } + + .col-sm-1 { + flex: 0 0 8.33333%; + max-width: 8.33333% + } + + .col-sm-2 { + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-sm-3 { + flex: 0 0 25%; + max-width: 25% + } + + .col-sm-4 { + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .col-sm-5 { + flex: 0 0 41.66667%; + max-width: 41.66667% + } + + .col-sm-6 { + flex: 0 0 50%; + max-width: 50% + } + + .col-sm-7 { + flex: 0 0 58.33333%; + max-width: 58.33333% + } + + .col-sm-8 { + flex: 0 0 66.66667%; + max-width: 66.66667% + } + + .col-sm-9 { + flex: 0 0 75%; + max-width: 75% + } + + .col-sm-10 { + flex: 0 0 83.33333%; + max-width: 83.33333% + } + + .col-sm-11 { + flex: 0 0 91.66667%; + max-width: 91.66667% + } + + .col-sm-12 { + flex: 0 0 100%; + max-width: 100% + } + + .order-sm-first { + order: -1 + } + + .order-sm-last { + order: 13 + } + + .order-sm-0 { + order: 0 + } + + .order-sm-1 { + order: 1 + } + + .order-sm-2 { + order: 2 + } + + .order-sm-3 { + order: 3 + } + + .order-sm-4 { + order: 4 + } + + .order-sm-5 { + order: 5 + } + + .order-sm-6 { + order: 6 + } + + .order-sm-7 { + order: 7 + } + + .order-sm-8 { + order: 8 + } + + .order-sm-9 { + order: 9 + } + + .order-sm-10 { + order: 10 + } + + .order-sm-11 { + order: 11 + } + + .order-sm-12 { + order: 12 + } + + .offset-sm-0 { + margin-left: 0 + } + + .offset-sm-1 { + margin-left: 8.33333% + } + + .offset-sm-2 { + margin-left: 16.66667% + } + + .offset-sm-3 { + margin-left: 25% + } + + .offset-sm-4 { + margin-left: 33.33333% + } + + .offset-sm-5 { + margin-left: 41.66667% + } + + .offset-sm-6 { + margin-left: 50% + } + + .offset-sm-7 { + margin-left: 58.33333% + } + + .offset-sm-8 { + margin-left: 66.66667% + } + + .offset-sm-9 { + margin-left: 75% + } + + .offset-sm-10 { + margin-left: 83.33333% + } + + .offset-sm-11 { + margin-left: 91.66667% + } +} + +@media (min-width: 768px) { + .col-md { + flex-basis:0; + flex-grow: 1; + max-width: 100% + } + + .row-cols-md-1>* { + flex: 0 0 100%; + max-width: 100% + } + + .row-cols-md-2>* { + flex: 0 0 50%; + max-width: 50% + } + + .row-cols-md-3>* { + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .row-cols-md-4>* { + flex: 0 0 25%; + max-width: 25% + } + + .row-cols-md-5>* { + flex: 0 0 20%; + max-width: 20% + } + + .row-cols-md-6>* { + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-md-auto { + flex: 0 0 auto; + width: auto; + max-width: 100% + } + + .col-md-1 { + flex: 0 0 8.33333%; + max-width: 8.33333% + } + + .col-md-2 { + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-md-3 { + flex: 0 0 25%; + max-width: 25% + } + + .col-md-4 { + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .col-md-5 { + flex: 0 0 41.66667%; + max-width: 41.66667% + } + + .col-md-6 { + flex: 0 0 50%; + max-width: 50% + } + + .col-md-7 { + flex: 0 0 58.33333%; + max-width: 58.33333% + } + + .col-md-8 { + flex: 0 0 66.66667%; + max-width: 66.66667% + } + + .col-md-9 { + flex: 0 0 75%; + max-width: 75% + } + + .col-md-10 { + flex: 0 0 83.33333%; + max-width: 83.33333% + } + + .col-md-11 { + flex: 0 0 91.66667%; + max-width: 91.66667% + } + + .col-md-12 { + flex: 0 0 100%; + max-width: 100% + } + + .order-md-first { + order: -1 + } + + .order-md-last { + order: 13 + } + + .order-md-0 { + order: 0 + } + + .order-md-1 { + order: 1 + } + + .order-md-2 { + order: 2 + } + + .order-md-3 { + order: 3 + } + + .order-md-4 { + order: 4 + } + + .order-md-5 { + order: 5 + } + + .order-md-6 { + order: 6 + } + + .order-md-7 { + order: 7 + } + + .order-md-8 { + order: 8 + } + + .order-md-9 { + order: 9 + } + + .order-md-10 { + order: 10 + } + + .order-md-11 { + order: 11 + } + + .order-md-12 { + order: 12 + } + + .offset-md-0 { + margin-left: 0 + } + + .offset-md-1 { + margin-left: 8.33333% + } + + .offset-md-2 { + margin-left: 16.66667% + } + + .offset-md-3 { + margin-left: 25% + } + + .offset-md-4 { + margin-left: 33.33333% + } + + .offset-md-5 { + margin-left: 41.66667% + } + + .offset-md-6 { + margin-left: 50% + } + + .offset-md-7 { + margin-left: 58.33333% + } + + .offset-md-8 { + margin-left: 66.66667% + } + + .offset-md-9 { + margin-left: 75% + } + + .offset-md-10 { + margin-left: 83.33333% + } + + .offset-md-11 { + margin-left: 91.66667% + } +} + +@media (min-width: 992px) { + .col-lg { + flex-basis:0; + flex-grow: 1; + max-width: 100% + } + + .row-cols-lg-1>* { + flex: 0 0 100%; + max-width: 100% + } + + .row-cols-lg-2>* { + flex: 0 0 50%; + max-width: 50% + } + + .row-cols-lg-3>* { + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .row-cols-lg-4>* { + flex: 0 0 25%; + max-width: 25% + } + + .row-cols-lg-5>* { + flex: 0 0 20%; + max-width: 20% + } + + .row-cols-lg-6>* { + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto; + max-width: 100% + } + + .col-lg-1 { + flex: 0 0 8.33333%; + max-width: 8.33333% + } + + .col-lg-2 { + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-lg-3 { + flex: 0 0 25%; + max-width: 25% + } + + .col-lg-4 { + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .col-lg-5 { + flex: 0 0 41.66667%; + max-width: 41.66667% + } + + .col-lg-6 { + flex: 0 0 50%; + max-width: 50% + } + + .col-lg-7 { + flex: 0 0 58.33333%; + max-width: 58.33333% + } + + .col-lg-8 { + flex: 0 0 66.66667%; + max-width: 66.66667% + } + + .col-lg-9 { + flex: 0 0 75%; + max-width: 75% + } + + .col-lg-10 { + flex: 0 0 83.33333%; + max-width: 83.33333% + } + + .col-lg-11 { + flex: 0 0 91.66667%; + max-width: 91.66667% + } + + .col-lg-12 { + flex: 0 0 100%; + max-width: 100% + } + + .order-lg-first { + order: -1 + } + + .order-lg-last { + order: 13 + } + + .order-lg-0 { + order: 0 + } + + .order-lg-1 { + order: 1 + } + + .order-lg-2 { + order: 2 + } + + .order-lg-3 { + order: 3 + } + + .order-lg-4 { + order: 4 + } + + .order-lg-5 { + order: 5 + } + + .order-lg-6 { + order: 6 + } + + .order-lg-7 { + order: 7 + } + + .order-lg-8 { + order: 8 + } + + .order-lg-9 { + order: 9 + } + + .order-lg-10 { + order: 10 + } + + .order-lg-11 { + order: 11 + } + + .order-lg-12 { + order: 12 + } + + .offset-lg-0 { + margin-left: 0 + } + + .offset-lg-1 { + margin-left: 8.33333% + } + + .offset-lg-2 { + margin-left: 16.66667% + } + + .offset-lg-3 { + margin-left: 25% + } + + .offset-lg-4 { + margin-left: 33.33333% + } + + .offset-lg-5 { + margin-left: 41.66667% + } + + .offset-lg-6 { + margin-left: 50% + } + + .offset-lg-7 { + margin-left: 58.33333% + } + + .offset-lg-8 { + margin-left: 66.66667% + } + + .offset-lg-9 { + margin-left: 75% + } + + .offset-lg-10 { + margin-left: 83.33333% + } + + .offset-lg-11 { + margin-left: 91.66667% + } +} + +@media (min-width: 1200px) { + .col-xl { + flex-basis:0; + flex-grow: 1; + max-width: 100% + } + + .row-cols-xl-1>* { + flex: 0 0 100%; + max-width: 100% + } + + .row-cols-xl-2>* { + flex: 0 0 50%; + max-width: 50% + } + + .row-cols-xl-3>* { + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .row-cols-xl-4>* { + flex: 0 0 25%; + max-width: 25% + } + + .row-cols-xl-5>* { + flex: 0 0 20%; + max-width: 20% + } + + .row-cols-xl-6>* { + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100% + } + + .col-xl-1 { + flex: 0 0 8.33333%; + max-width: 8.33333% + } + + .col-xl-2 { + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-xl-3 { + flex: 0 0 25%; + max-width: 25% + } + + .col-xl-4 { + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .col-xl-5 { + flex: 0 0 41.66667%; + max-width: 41.66667% + } + + .col-xl-6 { + flex: 0 0 50%; + max-width: 50% + } + + .col-xl-7 { + flex: 0 0 58.33333%; + max-width: 58.33333% + } + + .col-xl-8 { + flex: 0 0 66.66667%; + max-width: 66.66667% + } + + .col-xl-9 { + flex: 0 0 75%; + max-width: 75% + } + + .col-xl-10 { + flex: 0 0 83.33333%; + max-width: 83.33333% + } + + .col-xl-11 { + flex: 0 0 91.66667%; + max-width: 91.66667% + } + + .col-xl-12 { + flex: 0 0 100%; + max-width: 100% + } + + .order-xl-first { + order: -1 + } + + .order-xl-last { + order: 13 + } + + .order-xl-0 { + order: 0 + } + + .order-xl-1 { + order: 1 + } + + .order-xl-2 { + order: 2 + } + + .order-xl-3 { + order: 3 + } + + .order-xl-4 { + order: 4 + } + + .order-xl-5 { + order: 5 + } + + .order-xl-6 { + order: 6 + } + + .order-xl-7 { + order: 7 + } + + .order-xl-8 { + order: 8 + } + + .order-xl-9 { + order: 9 + } + + .order-xl-10 { + order: 10 + } + + .order-xl-11 { + order: 11 + } + + .order-xl-12 { + order: 12 + } + + .offset-xl-0 { + margin-left: 0 + } + + .offset-xl-1 { + margin-left: 8.33333% + } + + .offset-xl-2 { + margin-left: 16.66667% + } + + .offset-xl-3 { + margin-left: 25% + } + + .offset-xl-4 { + margin-left: 33.33333% + } + + .offset-xl-5 { + margin-left: 41.66667% + } + + .offset-xl-6 { + margin-left: 50% + } + + .offset-xl-7 { + margin-left: 58.33333% + } + + .offset-xl-8 { + margin-left: 66.66667% + } + + .offset-xl-9 { + margin-left: 75% + } + + .offset-xl-10 { + margin-left: 83.33333% + } + + .offset-xl-11 { + margin-left: 91.66667% + } +} + +.table { + width: 100%; + margin-bottom: 1rem; + color: #858796 +} + +.table td,.table th { + padding: .75rem; + vertical-align: top; + border-top: 1px solid #e3e6f0 +} + +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #e3e6f0 +} + +.table tbody+tbody { + border-top: 2px solid #e3e6f0 +} + +.table-sm td,.table-sm th { + padding: .3rem +} + +.table-bordered { + border: 1px solid #e3e6f0 +} + +.table-bordered td,.table-bordered th { + border: 1px solid #e3e6f0 +} + +.table-bordered thead td,.table-bordered thead th { + border-bottom-width: 2px +} + +.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th { + border: 0 +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0,0,0,.05) +} + +.table-hover tbody tr:hover { + color: #858796; + background-color: rgba(0,0,0,.075) +} + +.table-primary,.table-primary>td,.table-primary>th { + background-color: #cdd8f6 +} + +.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th { + border-color: #a3b6ee +} + +.table-hover .table-primary:hover { + background-color: #b7c7f2 +} + +.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th { + background-color: #b7c7f2 +} + +.table-secondary,.table-secondary>td,.table-secondary>th { + background-color: #dddde2 +} + +.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th { + border-color: #c0c1c8 +} + +.table-hover .table-secondary:hover { + background-color: #cfcfd6 +} + +.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th { + background-color: #cfcfd6 +} + +.table-success,.table-success>td,.table-success>th { + background-color: #bff0de +} + +.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th { + border-color: #89e2c2 +} + +.table-hover .table-success:hover { + background-color: #aaebd3 +} + +.table-hover .table-success:hover>td,.table-hover .table-success:hover>th { + background-color: #aaebd3 +} + +.table-info,.table-info>td,.table-info>th { + background-color: #c7ebf1 +} + +.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th { + border-color: #96dbe4 +} + +.table-hover .table-info:hover { + background-color: #b3e4ec +} + +.table-hover .table-info:hover>td,.table-hover .table-info:hover>th { + background-color: #b3e4ec +} + +.table-warning,.table-warning>td,.table-warning>th { + background-color: #fceec9 +} + +.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th { + border-color: #fadf9b +} + +.table-hover .table-warning:hover { + background-color: #fbe6b1 +} + +.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th { + background-color: #fbe6b1 +} + +.table-danger,.table-danger>td,.table-danger>th { + background-color: #f8ccc8 +} + +.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th { + border-color: #f3a199 +} + +.table-hover .table-danger:hover { + background-color: #f5b7b1 +} + +.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th { + background-color: #f5b7b1 +} + +.table-light,.table-light>td,.table-light>th { + background-color: #fdfdfe +} + +.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th { + border-color: #fbfcfd +} + +.table-hover .table-light:hover { + background-color: #ececf6 +} + +.table-hover .table-light:hover>td,.table-hover .table-light:hover>th { + background-color: #ececf6 +} + +.table-dark,.table-dark>td,.table-dark>th { + background-color: #d1d1d5 +} + +.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th { + border-color: #a9aab1 +} + +.table-hover .table-dark:hover { + background-color: #c4c4c9 +} + +.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th { + background-color: #c4c4c9 +} + +.table-active,.table-active>td,.table-active>th { + background-color: rgba(0,0,0,.075) +} + +.table-hover .table-active:hover { + background-color: rgba(0,0,0,.075) +} + +.table-hover .table-active:hover>td,.table-hover .table-active:hover>th { + background-color: rgba(0,0,0,.075) +} + +.table .thead-dark th { + color: #fff; + background-color: #5a5c69; + border-color: #6c6e7e +} + +.table .thead-light th { + color: #6e707e; + background-color: #eaecf4; + border-color: #e3e6f0 +} + +.table-dark { + color: #fff; + background-color: #5a5c69 +} + +.table-dark td,.table-dark th,.table-dark thead th { + border-color: #6c6e7e +} + +.table-dark.table-bordered { + border: 0 +} + +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255,255,255,.05) +} + +.table-dark.table-hover tbody tr:hover { + color: #fff; + background-color: rgba(255,255,255,.075) +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display:block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch + } + + .table-responsive-sm>.table-bordered { + border: 0 + } +} + +@media (max-width: 767.98px) { + .table-responsive-md { + display:block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch + } + + .table-responsive-md>.table-bordered { + border: 0 + } +} + +@media (max-width: 991.98px) { + .table-responsive-lg { + display:block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch + } + + .table-responsive-lg>.table-bordered { + border: 0 + } +} + +@media (max-width: 1199.98px) { + .table-responsive-xl { + display:block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch + } + + .table-responsive-xl>.table-bordered { + border: 0 + } +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch +} + +.table-responsive>.table-bordered { + border: 0 +} + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + .75rem + 2px); + padding: .375rem .75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #6e707e; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #d1d3e2; + border-radius: .35rem; + transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .form-control { + transition: none + } +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0 +} + +.form-control:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #6e707e +} + +.form-control:focus { + color: #6e707e; + background-color: #fff; + border-color: #bac8f3; + outline: 0; + box-shadow: 0 0 0 .2rem rgba(78,115,223,.25) +} + +.form-control::-webkit-input-placeholder { + color: #858796; + opacity: 1 +} + +.form-control::-moz-placeholder { + color: #858796; + opacity: 1 +} + +.form-control:-ms-input-placeholder { + color: #858796; + opacity: 1 +} + +.form-control::-ms-input-placeholder { + color: #858796; + opacity: 1 +} + +.form-control::placeholder { + color: #858796; + opacity: 1 +} + +.form-control:disabled,.form-control[readonly] { + background-color: #eaecf4; + opacity: 1 +} + +input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +select.form-control:focus::-ms-value { + color: #6e707e; + background-color: #fff +} + +.form-control-file,.form-control-range { + display: block; + width: 100% +} + +.col-form-label { + padding-top: calc(.375rem + 1px); + padding-bottom: calc(.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5 +} + +.col-form-label-lg { + padding-top: calc(.5rem + 1px); + padding-bottom: calc(.5rem + 1px); + font-size: 1.5rem; + line-height: 1.5 +} + +.col-form-label-sm { + padding-top: calc(.25rem + 1px); + padding-bottom: calc(.25rem + 1px); + font-size: .875rem; + line-height: 1.5 +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: .375rem 0; + margin-bottom: 0; + font-size: 1rem; + line-height: 1.5; + color: #858796; + background-color: transparent; + border: solid transparent; + border-width: 1px 0 +} + +.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm { + padding-right: 0; + padding-left: 0 +} + +.form-control-sm { + height: calc(1.5em + .5rem + 2px); + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5; + border-radius: .2rem +} + +.form-control-lg { + height: calc(1.5em + 1rem + 2px); + padding: .5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: .3rem +} + +select.form-control[multiple],select.form-control[size] { + height: auto +} + +textarea.form-control { + height: auto +} + +.form-group { + margin-bottom: 1rem +} + +.form-text { + display: block; + margin-top: .25rem +} + +.form-row { + display: flex; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px +} + +.form-row>.col,.form-row>[class*=col-] { + padding-right: 5px; + padding-left: 5px +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem +} + +.form-check-input { + position: absolute; + margin-top: .3rem; + margin-left: -1.25rem +} + +.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label { + color: #858796 +} + +.form-check-label { + margin-bottom: 0 +} + +.form-check-inline { + display: inline-flex; + align-items: center; + padding-left: 0; + margin-right: .75rem +} + +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: .3125rem; + margin-left: 0 +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: .25rem; + font-size: 80%; + color: #1cc88a +} + +.valid-tooltip { + position: absolute; + top: 100%; + left: 0; + z-index: 5; + display: none; + max-width: 100%; + padding: .25rem .5rem; + margin-top: .1rem; + font-size: .875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(28,200,138,.9); + border-radius: .35rem +} + +.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip { + left: 5px +} + +.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip { + display: block +} + +.form-control.is-valid,.was-validated .form-control:valid { + border-color: #1cc88a; + padding-right: calc(1.5em + .75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%231cc88a' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(.375em + .1875rem) center; + background-size: calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-control.is-valid:focus,.was-validated .form-control:valid:focus { + border-color: #1cc88a; + box-shadow: 0 0 0 .2rem rgba(28,200,138,.25) +} + +.was-validated textarea.form-control:valid,textarea.form-control.is-valid { + padding-right: calc(1.5em + .75rem); + background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) +} + +.custom-select.is-valid,.was-validated .custom-select:valid { + border-color: #1cc88a; + padding-right: calc(.75em + 2.3125rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%235a5c69' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%231cc88a' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat +} + +.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus { + border-color: #1cc88a; + box-shadow: 0 0 0 .2rem rgba(28,200,138,.25) +} + +.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label { + color: #1cc88a +} + +.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip { + display: block +} + +.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label { + color: #1cc88a +} + +.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before { + border-color: #1cc88a +} + +.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before { + border-color: #34e3a4; + background-color: #34e3a4 +} + +.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before { + box-shadow: 0 0 0 .2rem rgba(28,200,138,.25) +} + +.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before { + border-color: #1cc88a +} + +.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label { + border-color: #1cc88a +} + +.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label { + border-color: #1cc88a; + box-shadow: 0 0 0 .2rem rgba(28,200,138,.25) +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: .25rem; + font-size: 80%; + color: #e74a3b +} + +.invalid-tooltip { + position: absolute; + top: 100%; + left: 0; + z-index: 5; + display: none; + max-width: 100%; + padding: .25rem .5rem; + margin-top: .1rem; + font-size: .875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(231,74,59,.9); + border-radius: .35rem +} + +.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip { + left: 5px +} + +.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip { + display: block +} + +.form-control.is-invalid,.was-validated .form-control:invalid { + border-color: #e74a3b; + padding-right: calc(1.5em + .75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e74a3b' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74a3b' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(.375em + .1875rem) center; + background-size: calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus { + border-color: #e74a3b; + box-shadow: 0 0 0 .2rem rgba(231,74,59,.25) +} + +.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid { + padding-right: calc(1.5em + .75rem); + background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) +} + +.custom-select.is-invalid,.was-validated .custom-select:invalid { + border-color: #e74a3b; + padding-right: calc(.75em + 2.3125rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%235a5c69' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e74a3b' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74a3b' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat +} + +.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus { + border-color: #e74a3b; + box-shadow: 0 0 0 .2rem rgba(231,74,59,.25) +} + +.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label { + color: #e74a3b +} + +.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip { + display: block +} + +.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label { + color: #e74a3b +} + +.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before { + border-color: #e74a3b +} + +.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before { + border-color: #ed7468; + background-color: #ed7468 +} + +.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before { + box-shadow: 0 0 0 .2rem rgba(231,74,59,.25) +} + +.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before { + border-color: #e74a3b +} + +.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label { + border-color: #e74a3b +} + +.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label { + border-color: #e74a3b; + box-shadow: 0 0 0 .2rem rgba(231,74,59,.25) +} + +.form-inline { + display: flex; + flex-flow: row wrap; + align-items: center +} + +.form-inline .form-check { + width: 100% +} + +@media (min-width: 576px) { + .form-inline label { + display:flex; + align-items: center; + justify-content: center; + margin-bottom: 0 + } + + .form-inline .form-group { + display: flex; + flex: 0 0 auto; + flex-flow: row wrap; + align-items: center; + margin-bottom: 0 + } + + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle + } + + .form-inline .form-control-plaintext { + display: inline-block + } + + .form-inline .custom-select,.form-inline .input-group { + width: auto + } + + .form-inline .form-check { + display: flex; + align-items: center; + justify-content: center; + width: auto; + padding-left: 0 + } + + .form-inline .form-check-input { + position: relative; + flex-shrink: 0; + margin-top: 0; + margin-right: .25rem; + margin-left: 0 + } + + .form-inline .custom-control { + align-items: center; + justify-content: center + } + + .form-inline .custom-control-label { + margin-bottom: 0 + } +} + +.btn { + display: inline-block; + font-weight: 400; + color: #858796; + text-align: center; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: .375rem .75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: .35rem; + transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .btn { + transition: none + } +} + +.btn:hover { + color: #858796; + text-decoration: none +} + +.btn.focus,.btn:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(78,115,223,.25) +} + +.btn.disabled,.btn:disabled { + opacity: .65 +} + +.btn:not(:disabled):not(.disabled) { + cursor: pointer +} + +a.btn.disabled,fieldset:disabled a.btn { + pointer-events: none +} + +.btn-primary { + color: #fff; + background-color: #4e73df; + border-color: #4e73df +} + +.btn-primary:hover { + color: #fff; + background-color: #2e59d9; + border-color: #2653d4 +} + +.btn-primary.focus,.btn-primary:focus { + color: #fff; + background-color: #2e59d9; + border-color: #2653d4; + box-shadow: 0 0 0 .2rem rgba(105,136,228,.5) +} + +.btn-primary.disabled,.btn-primary:disabled { + color: #fff; + background-color: #4e73df; + border-color: #4e73df +} + +.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle { + color: #fff; + background-color: #2653d4; + border-color: #244ec9 +} + +.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(105,136,228,.5) +} + +.btn-secondary { + color: #fff; + background-color: #858796; + border-color: #858796 +} + +.btn-secondary:hover { + color: #fff; + background-color: #717384; + border-color: #6b6d7d +} + +.btn-secondary.focus,.btn-secondary:focus { + color: #fff; + background-color: #717384; + border-color: #6b6d7d; + box-shadow: 0 0 0 .2rem rgba(151,153,166,.5) +} + +.btn-secondary.disabled,.btn-secondary:disabled { + color: #fff; + background-color: #858796; + border-color: #858796 +} + +.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle { + color: #fff; + background-color: #6b6d7d; + border-color: #656776 +} + +.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(151,153,166,.5) +} + +.btn-success { + color: #fff; + background-color: #1cc88a; + border-color: #1cc88a +} + +.btn-success:hover { + color: #fff; + background-color: #17a673; + border-color: #169b6b +} + +.btn-success.focus,.btn-success:focus { + color: #fff; + background-color: #17a673; + border-color: #169b6b; + box-shadow: 0 0 0 .2rem rgba(62,208,156,.5) +} + +.btn-success.disabled,.btn-success:disabled { + color: #fff; + background-color: #1cc88a; + border-color: #1cc88a +} + +.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle { + color: #fff; + background-color: #169b6b; + border-color: #149063 +} + +.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(62,208,156,.5) +} + +.btn-info { + color: #fff; + background-color: #36b9cc; + border-color: #36b9cc +} + +.btn-info:hover { + color: #fff; + background-color: #2c9faf; + border-color: #2a96a5 +} + +.btn-info.focus,.btn-info:focus { + color: #fff; + background-color: #2c9faf; + border-color: #2a96a5; + box-shadow: 0 0 0 .2rem rgba(84,196,212,.5) +} + +.btn-info.disabled,.btn-info:disabled { + color: #fff; + background-color: #36b9cc; + border-color: #36b9cc +} + +.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle { + color: #fff; + background-color: #2a96a5; + border-color: #278c9b +} + +.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(84,196,212,.5) +} + +.btn-warning { + color: #fff; + background-color: #f6c23e; + border-color: #f6c23e +} + +.btn-warning:hover { + color: #fff; + background-color: #f4b619; + border-color: #f4b30d +} + +.btn-warning.focus,.btn-warning:focus { + color: #fff; + background-color: #f4b619; + border-color: #f4b30d; + box-shadow: 0 0 0 .2rem rgba(247,203,91,.5) +} + +.btn-warning.disabled,.btn-warning:disabled { + color: #fff; + background-color: #f6c23e; + border-color: #f6c23e +} + +.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle { + color: #fff; + background-color: #f4b30d; + border-color: #e9aa0b +} + +.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(247,203,91,.5) +} + +.btn-danger { + color: #fff; + background-color: #e74a3b; + border-color: #e74a3b +} + +.btn-danger:hover { + color: #fff; + background-color: #e02d1b; + border-color: #d52a1a +} + +.btn-danger.focus,.btn-danger:focus { + color: #fff; + background-color: #e02d1b; + border-color: #d52a1a; + box-shadow: 0 0 0 .2rem rgba(235,101,88,.5) +} + +.btn-danger.disabled,.btn-danger:disabled { + color: #fff; + background-color: #e74a3b; + border-color: #e74a3b +} + +.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle { + color: #fff; + background-color: #d52a1a; + border-color: #ca2819 +} + +.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(235,101,88,.5) +} + +.btn-light { + color: #3a3b45; + background-color: #f8f9fc; + border-color: #f8f9fc +} + +.btn-light:hover { + color: #3a3b45; + background-color: #dde2f1; + border-color: #d4daed +} + +.btn-light.focus,.btn-light:focus { + color: #3a3b45; + background-color: #dde2f1; + border-color: #d4daed; + box-shadow: 0 0 0 .2rem rgba(220,221,225,.5) +} + +.btn-light.disabled,.btn-light:disabled { + color: #3a3b45; + background-color: #f8f9fc; + border-color: #f8f9fc +} + +.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle { + color: #3a3b45; + background-color: #d4daed; + border-color: #cbd3e9 +} + +.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(220,221,225,.5) +} + +.btn-dark { + color: #fff; + background-color: #5a5c69; + border-color: #5a5c69 +} + +.btn-dark:hover { + color: #fff; + background-color: #484a54; + border-color: #42444e +} + +.btn-dark.focus,.btn-dark:focus { + color: #fff; + background-color: #484a54; + border-color: #42444e; + box-shadow: 0 0 0 .2rem rgba(115,116,128,.5) +} + +.btn-dark.disabled,.btn-dark:disabled { + color: #fff; + background-color: #5a5c69; + border-color: #5a5c69 +} + +.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle { + color: #fff; + background-color: #42444e; + border-color: #3d3e47 +} + +.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(115,116,128,.5) +} + +.btn-outline-primary { + color: #4e73df; + border-color: #4e73df +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #4e73df; + border-color: #4e73df +} + +.btn-outline-primary.focus,.btn-outline-primary:focus { + box-shadow: 0 0 0 .2rem rgba(78,115,223,.5) +} + +.btn-outline-primary.disabled,.btn-outline-primary:disabled { + color: #4e73df; + background-color: transparent +} + +.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #4e73df; + border-color: #4e73df +} + +.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(78,115,223,.5) +} + +.btn-outline-secondary { + color: #858796; + border-color: #858796 +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #858796; + border-color: #858796 +} + +.btn-outline-secondary.focus,.btn-outline-secondary:focus { + box-shadow: 0 0 0 .2rem rgba(133,135,150,.5) +} + +.btn-outline-secondary.disabled,.btn-outline-secondary:disabled { + color: #858796; + background-color: transparent +} + +.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: #858796; + border-color: #858796 +} + +.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(133,135,150,.5) +} + +.btn-outline-success { + color: #1cc88a; + border-color: #1cc88a +} + +.btn-outline-success:hover { + color: #fff; + background-color: #1cc88a; + border-color: #1cc88a +} + +.btn-outline-success.focus,.btn-outline-success:focus { + box-shadow: 0 0 0 .2rem rgba(28,200,138,.5) +} + +.btn-outline-success.disabled,.btn-outline-success:disabled { + color: #1cc88a; + background-color: transparent +} + +.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #1cc88a; + border-color: #1cc88a +} + +.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(28,200,138,.5) +} + +.btn-outline-info { + color: #36b9cc; + border-color: #36b9cc +} + +.btn-outline-info:hover { + color: #fff; + background-color: #36b9cc; + border-color: #36b9cc +} + +.btn-outline-info.focus,.btn-outline-info:focus { + box-shadow: 0 0 0 .2rem rgba(54,185,204,.5) +} + +.btn-outline-info.disabled,.btn-outline-info:disabled { + color: #36b9cc; + background-color: transparent +} + +.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #36b9cc; + border-color: #36b9cc +} + +.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(54,185,204,.5) +} + +.btn-outline-warning { + color: #f6c23e; + border-color: #f6c23e +} + +.btn-outline-warning:hover { + color: #fff; + background-color: #f6c23e; + border-color: #f6c23e +} + +.btn-outline-warning.focus,.btn-outline-warning:focus { + box-shadow: 0 0 0 .2rem rgba(246,194,62,.5) +} + +.btn-outline-warning.disabled,.btn-outline-warning:disabled { + color: #f6c23e; + background-color: transparent +} + +.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle { + color: #fff; + background-color: #f6c23e; + border-color: #f6c23e +} + +.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(246,194,62,.5) +} + +.btn-outline-danger { + color: #e74a3b; + border-color: #e74a3b +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #e74a3b; + border-color: #e74a3b +} + +.btn-outline-danger.focus,.btn-outline-danger:focus { + box-shadow: 0 0 0 .2rem rgba(231,74,59,.5) +} + +.btn-outline-danger.disabled,.btn-outline-danger:disabled { + color: #e74a3b; + background-color: transparent +} + +.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #e74a3b; + border-color: #e74a3b +} + +.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(231,74,59,.5) +} + +.btn-outline-light { + color: #f8f9fc; + border-color: #f8f9fc +} + +.btn-outline-light:hover { + color: #3a3b45; + background-color: #f8f9fc; + border-color: #f8f9fc +} + +.btn-outline-light.focus,.btn-outline-light:focus { + box-shadow: 0 0 0 .2rem rgba(248,249,252,.5) +} + +.btn-outline-light.disabled,.btn-outline-light:disabled { + color: #f8f9fc; + background-color: transparent +} + +.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle { + color: #3a3b45; + background-color: #f8f9fc; + border-color: #f8f9fc +} + +.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(248,249,252,.5) +} + +.btn-outline-dark { + color: #5a5c69; + border-color: #5a5c69 +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #5a5c69; + border-color: #5a5c69 +} + +.btn-outline-dark.focus,.btn-outline-dark:focus { + box-shadow: 0 0 0 .2rem rgba(90,92,105,.5) +} + +.btn-outline-dark.disabled,.btn-outline-dark:disabled { + color: #5a5c69; + background-color: transparent +} + +.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #5a5c69; + border-color: #5a5c69 +} + +.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(90,92,105,.5) +} + +.btn-link { + font-weight: 400; + color: #4e73df; + text-decoration: none +} + +.btn-link:hover { + color: #224abe; + text-decoration: underline +} + +.btn-link.focus,.btn-link:focus { + text-decoration: underline +} + +.btn-link.disabled,.btn-link:disabled { + color: #858796; + pointer-events: none +} + +.btn-group-lg>.btn,.btn-lg { + padding: .5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: .3rem +} + +.btn-group-sm>.btn,.btn-sm { + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5; + border-radius: .2rem +} + +.btn-block { + display: block; + width: 100% +} + +.btn-block+.btn-block { + margin-top: .5rem +} + +input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block { + width: 100% +} + +.fade { + transition: opacity .15s linear +} + +@media (prefers-reduced-motion:reduce) { + .fade { + transition: none + } +} + +.fade:not(.show) { + opacity: 0 +} + +.collapse:not(.show) { + display: none +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height .15s ease +} + +@media (prefers-reduced-motion:reduce) { + .collapsing { + transition: none + } +} + +.dropdown,.dropleft,.dropright,.dropup { + position: relative +} + +.dropdown-toggle { + white-space: nowrap +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: ""; + border-top: .3em solid; + border-right: .3em solid transparent; + border-bottom: 0; + border-left: .3em solid transparent +} + +.dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: .5rem 0; + margin: .125rem 0 0; + font-size: .85rem; + color: #858796; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #e3e6f0; + border-radius: .35rem +} + +.dropdown-menu-left { + right: auto; + left: 0 +} + +.dropdown-menu-right { + right: 0; + left: auto +} + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right:auto; + left: 0 + } + + .dropdown-menu-sm-right { + right: 0; + left: auto + } +} + +@media (min-width: 768px) { + .dropdown-menu-md-left { + right:auto; + left: 0 + } + + .dropdown-menu-md-right { + right: 0; + left: auto + } +} + +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right:auto; + left: 0 + } + + .dropdown-menu-lg-right { + right: 0; + left: auto + } +} + +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right:auto; + left: 0 + } + + .dropdown-menu-xl-right { + right: 0; + left: auto + } +} + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: .125rem +} + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: ""; + border-top: 0; + border-right: .3em solid transparent; + border-bottom: .3em solid; + border-left: .3em solid transparent +} + +.dropup .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: .125rem +} + +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: ""; + border-top: .3em solid transparent; + border-right: 0; + border-bottom: .3em solid transparent; + border-left: .3em solid +} + +.dropright .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropright .dropdown-toggle::after { + vertical-align: 0 +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: .125rem +} + +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: "" +} + +.dropleft .dropdown-toggle::after { + display: none +} + +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: .255em; + vertical-align: .255em; + content: ""; + border-top: .3em solid transparent; + border-right: .3em solid; + border-bottom: .3em solid transparent +} + +.dropleft .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropleft .dropdown-toggle::before { + vertical-align: 0 +} + +.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top] { + right: auto; + bottom: auto +} + +.dropdown-divider { + height: 0; + margin: .5rem 0; + overflow: hidden; + border-top: 1px solid #eaecf4 +} + +.dropdown-item { + display: block; + width: 100%; + padding: .25rem 1.5rem; + clear: both; + font-weight: 400; + color: #3a3b45; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0 +} + +.dropdown-item:focus,.dropdown-item:hover { + color: #2e2f37; + text-decoration: none; + background-color: #eaecf4 +} + +.dropdown-item.active,.dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #4e73df +} + +.dropdown-item.disabled,.dropdown-item:disabled { + color: #b7b9cc; + pointer-events: none; + background-color: transparent +} + +.dropdown-menu.show { + display: block +} + +.dropdown-header { + display: block; + padding: .5rem 1.5rem; + margin-bottom: 0; + font-size: .875rem; + color: #858796; + white-space: nowrap +} + +.dropdown-item-text { + display: block; + padding: .25rem 1.5rem; + color: #3a3b45 +} + +.btn-group,.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle +} + +.btn-group-vertical>.btn,.btn-group>.btn { + position: relative; + flex: 1 1 auto +} + +.btn-group-vertical>.btn:hover,.btn-group>.btn:hover { + z-index: 1 +} + +.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus { + z-index: 1 +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start +} + +.btn-toolbar .input-group { + width: auto +} + +.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child) { + margin-left: -1px +} + +.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.dropdown-toggle-split { + padding-right: .5625rem; + padding-left: .5625rem +} + +.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after { + margin-left: 0 +} + +.dropleft .dropdown-toggle-split::before { + margin-right: 0 +} + +.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split { + padding-right: .375rem; + padding-left: .375rem +} + +.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split { + padding-right: .75rem; + padding-left: .75rem +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center +} + +.btn-group-vertical>.btn,.btn-group-vertical>.btn-group { + width: 100% +} + +.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child) { + margin-top: -1px +} + +.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn { + margin-bottom: 0 +} + +.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio] { + position: absolute; + clip: rect(0,0,0,0); + pointer-events: none +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100% +} + +.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; + margin-bottom: 0 +} + +.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control { + margin-left: -1px +} + +.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus { + z-index: 3 +} + +.input-group>.custom-file .custom-file-input:focus { + z-index: 4 +} + +.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.input-group>.custom-file { + display: flex; + align-items: center +} + +.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group-append,.input-group-prepend { + display: flex +} + +.input-group-append .btn,.input-group-prepend .btn { + position: relative; + z-index: 2 +} + +.input-group-append .btn:focus,.input-group-prepend .btn:focus { + z-index: 3 +} + +.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text { + margin-left: -1px +} + +.input-group-prepend { + margin-right: -1px +} + +.input-group-append { + margin-left: -1px +} + +.input-group-text { + display: flex; + align-items: center; + padding: .375rem .75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #6e707e; + text-align: center; + white-space: nowrap; + background-color: #eaecf4; + border: 1px solid #d1d3e2; + border-radius: .35rem +} + +.input-group-text input[type=checkbox],.input-group-text input[type=radio] { + margin-top: 0 +} + +.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea) { + height: calc(1.5em + 1rem + 2px) +} + +.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text { + padding: .5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: .3rem +} + +.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea) { + height: calc(1.5em + .5rem + 2px) +} + +.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text { + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5; + border-radius: .2rem +} + +.input-group-lg>.custom-select,.input-group-sm>.custom-select { + padding-right: 1.75rem +} + +.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.custom-control { + position: relative; + z-index: 1; + display: block; + min-height: 1.5rem; + padding-left: 1.5rem; + -webkit-print-color-adjust: exact; + color-adjust: exact +} + +.custom-control-inline { + display: inline-flex; + margin-right: 1rem +} + +.custom-control-input { + position: absolute; + left: 0; + z-index: -1; + width: 1rem; + height: 1.25rem; + opacity: 0 +} + +.custom-control-input:checked~.custom-control-label::before { + color: #fff; + border-color: #4e73df; + background-color: #4e73df +} + +.custom-control-input:focus~.custom-control-label::before { + box-shadow: 0 0 0 .2rem rgba(78,115,223,.25) +} + +.custom-control-input:focus:not(:checked)~.custom-control-label::before { + border-color: #bac8f3 +} + +.custom-control-input:not(:disabled):active~.custom-control-label::before { + color: #fff; + background-color: #e5ebfa; + border-color: #e5ebfa +} + +.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label { + color: #858796 +} + +.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before { + background-color: #eaecf4 +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top +} + +.custom-control-label::before { + position: absolute; + top: .25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #fff; + border: #b7b9cc solid 1px +} + +.custom-control-label::after { + position: absolute; + top: .25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background: 50%/50% 50% no-repeat +} + +.custom-checkbox .custom-control-label::before { + border-radius: .35rem +} + +.custom-checkbox .custom-control-input:checked~.custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e") +} + +.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before { + border-color: #4e73df; + background-color: #4e73df +} + +.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e") +} + +.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before { + background-color: rgba(78,115,223,.5) +} + +.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before { + background-color: rgba(78,115,223,.5) +} + +.custom-radio .custom-control-label::before { + border-radius: 50% +} + +.custom-radio .custom-control-input:checked~.custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e") +} + +.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before { + background-color: rgba(78,115,223,.5) +} + +.custom-switch { + padding-left: 2.25rem +} + +.custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: .5rem +} + +.custom-switch .custom-control-label::after { + top: calc(.25rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #b7b9cc; + border-radius: .5rem; + transition: transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .custom-switch .custom-control-label::after { + transition: none + } +} + +.custom-switch .custom-control-input:checked~.custom-control-label::after { + background-color: #fff; + transform: translateX(.75rem) +} + +.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before { + background-color: rgba(78,115,223,.5) +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.5em + .75rem + 2px); + padding: .375rem 1.75rem .375rem .75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #6e707e; + vertical-align: middle; + background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%235a5c69' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat; + border: 1px solid #d1d3e2; + border-radius: .35rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.custom-select:focus { + border-color: #bac8f3; + outline: 0; + box-shadow: 0 0 0 .2rem rgba(78,115,223,.25) +} + +.custom-select:focus::-ms-value { + color: #6e707e; + background-color: #fff +} + +.custom-select[multiple],.custom-select[size]:not([size="1"]) { + height: auto; + padding-right: .75rem; + background-image: none +} + +.custom-select:disabled { + color: #858796; + background-color: #eaecf4 +} + +.custom-select::-ms-expand { + display: none +} + +.custom-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #6e707e +} + +.custom-select-sm { + height: calc(1.5em + .5rem + 2px); + padding-top: .25rem; + padding-bottom: .25rem; + padding-left: .5rem; + font-size: .875rem +} + +.custom-select-lg { + height: calc(1.5em + 1rem + 2px); + padding-top: .5rem; + padding-bottom: .5rem; + padding-left: 1rem; + font-size: 1.25rem +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.5em + .75rem + 2px); + margin-bottom: 0 +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.5em + .75rem + 2px); + margin: 0; + overflow: hidden; + opacity: 0 +} + +.custom-file-input:focus~.custom-file-label { + border-color: #bac8f3; + box-shadow: 0 0 0 .2rem rgba(78,115,223,.25) +} + +.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label { + background-color: #eaecf4 +} + +.custom-file-input:lang(en)~.custom-file-label::after { + content: "Browse" +} + +.custom-file-input~.custom-file-label[data-browse]::after { + content: attr(data-browse) +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.5em + .75rem + 2px); + padding: .375rem .75rem; + overflow: hidden; + font-weight: 400; + line-height: 1.5; + color: #6e707e; + background-color: #fff; + border: 1px solid #d1d3e2; + border-radius: .35rem +} + +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(1.5em + .75rem); + padding: .375rem .75rem; + line-height: 1.5; + color: #6e707e; + content: "Browse"; + background-color: #eaecf4; + border-left: inherit; + border-radius: 0 .35rem .35rem 0 +} + +.custom-range { + width: 100%; + height: 1.4rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.custom-range:focus { + outline: 0 +} + +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff,0 0 0 .2rem rgba(78,115,223,.25) +} + +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff,0 0 0 .2rem rgba(78,115,223,.25) +} + +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff,0 0 0 .2rem rgba(78,115,223,.25) +} + +.custom-range::-moz-focus-outer { + border: 0 +} + +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -.25rem; + background-color: #4e73df; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; + -webkit-appearance: none; + appearance: none +} + +@media (prefers-reduced-motion:reduce) { + .custom-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none + } +} + +.custom-range::-webkit-slider-thumb:active { + background-color: #e5ebfa +} + +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: #dddfeb; + border-color: transparent; + border-radius: 1rem +} + +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #4e73df; + border: 0; + border-radius: 1rem; + -moz-transition: background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; + -moz-appearance: none; + appearance: none +} + +@media (prefers-reduced-motion:reduce) { + .custom-range::-moz-range-thumb { + -moz-transition: none; + transition: none + } +} + +.custom-range::-moz-range-thumb:active { + background-color: #e5ebfa +} + +.custom-range::-moz-range-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: #dddfeb; + border-color: transparent; + border-radius: 1rem +} + +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: .2rem; + margin-left: .2rem; + background-color: #4e73df; + border: 0; + border-radius: 1rem; + -ms-transition: background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; + appearance: none +} + +@media (prefers-reduced-motion:reduce) { + .custom-range::-ms-thumb { + -ms-transition: none; + transition: none + } +} + +.custom-range::-ms-thumb:active { + background-color: #e5ebfa +} + +.custom-range::-ms-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: .5rem +} + +.custom-range::-ms-fill-lower { + background-color: #dddfeb; + border-radius: 1rem +} + +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dddfeb; + border-radius: 1rem +} + +.custom-range:disabled::-webkit-slider-thumb { + background-color: #b7b9cc +} + +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default +} + +.custom-range:disabled::-moz-range-thumb { + background-color: #b7b9cc +} + +.custom-range:disabled::-moz-range-track { + cursor: default +} + +.custom-range:disabled::-ms-thumb { + background-color: #b7b9cc +} + +.custom-control-label::before,.custom-file-label,.custom-select { + transition: background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .custom-control-label::before,.custom-file-label,.custom-select { + transition: none + } +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.nav-link { + display: block; + padding: .5rem 1rem +} + +.nav-link:focus,.nav-link:hover { + text-decoration: none +} + +.nav-link.disabled { + color: #858796; + pointer-events: none; + cursor: default +} + +.nav-tabs { + border-bottom: 1px solid #dddfeb +} + +.nav-tabs .nav-link { + margin-bottom: -1px; + border: 1px solid transparent; + border-top-left-radius: .35rem; + border-top-right-radius: .35rem +} + +.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover { + border-color: #eaecf4 #eaecf4 #dddfeb +} + +.nav-tabs .nav-link.disabled { + color: #858796; + background-color: transparent; + border-color: transparent +} + +.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active { + color: #6e707e; + background-color: #fff; + border-color: #dddfeb #dddfeb #fff +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.nav-pills .nav-link { + border-radius: .35rem +} + +.nav-pills .nav-link.active,.nav-pills .show>.nav-link { + color: #fff; + background-color: #4e73df +} + +.nav-fill .nav-item,.nav-fill>.nav-link { + flex: 1 1 auto; + text-align: center +} + +.nav-justified .nav-item,.nav-justified>.nav-link { + flex-basis: 0; + flex-grow: 1; + text-align: center +} + +.tab-content>.tab-pane { + display: none +} + +.tab-content>.active { + display: block +} + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: .5rem 1rem +} + +.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between +} + +.navbar-brand { + display: inline-block; + padding-top: .3125rem; + padding-bottom: .3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap +} + +.navbar-brand:focus,.navbar-brand:hover { + text-decoration: none +} + +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0 +} + +.navbar-nav .dropdown-menu { + position: static; + float: none +} + +.navbar-text { + display: inline-block; + padding-top: .5rem; + padding-bottom: .5rem +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center +} + +.navbar-toggler { + padding: .25rem .75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: .35rem +} + +.navbar-toggler:focus,.navbar-toggler:hover { + text-decoration: none +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: 50%/100% 100% no-repeat +} + +.navbar-nav-scroll { + max-height: 75vh; + overflow-y: auto +} + +@media (max-width: 575.98px) { + .navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl { + padding-right:0; + padding-left: 0 + } +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-flow:row nowrap; + justify-content: flex-start + } + + .navbar-expand-sm .navbar-nav { + flex-direction: row + } + + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + + .navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl { + flex-wrap: nowrap + } + + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-sm .navbar-collapse { + display: flex!important; + flex-basis: auto + } + + .navbar-expand-sm .navbar-toggler { + display: none + } +} + +@media (max-width: 767.98px) { + .navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl { + padding-right:0; + padding-left: 0 + } +} + +@media (min-width: 768px) { + .navbar-expand-md { + flex-flow:row nowrap; + justify-content: flex-start + } + + .navbar-expand-md .navbar-nav { + flex-direction: row + } + + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-md .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + + .navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl { + flex-wrap: nowrap + } + + .navbar-expand-md .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-md .navbar-collapse { + display: flex!important; + flex-basis: auto + } + + .navbar-expand-md .navbar-toggler { + display: none + } +} + +@media (max-width: 991.98px) { + .navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl { + padding-right:0; + padding-left: 0 + } +} + +@media (min-width: 992px) { + .navbar-expand-lg { + flex-flow:row nowrap; + justify-content: flex-start + } + + .navbar-expand-lg .navbar-nav { + flex-direction: row + } + + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + + .navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl { + flex-wrap: nowrap + } + + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-lg .navbar-collapse { + display: flex!important; + flex-basis: auto + } + + .navbar-expand-lg .navbar-toggler { + display: none + } +} + +@media (max-width: 1199.98px) { + .navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl { + padding-right:0; + padding-left: 0 + } +} + +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-flow:row nowrap; + justify-content: flex-start + } + + .navbar-expand-xl .navbar-nav { + flex-direction: row + } + + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + + .navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl { + flex-wrap: nowrap + } + + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible + } + + .navbar-expand-xl .navbar-collapse { + display: flex!important; + flex-basis: auto + } + + .navbar-expand-xl .navbar-toggler { + display: none + } +} + +.navbar-expand { + flex-flow: row nowrap; + justify-content: flex-start +} + +.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl { + padding-right: 0; + padding-left: 0 +} + +.navbar-expand .navbar-nav { + flex-direction: row +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem +} + +.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl { + flex-wrap: nowrap +} + +.navbar-expand .navbar-nav-scroll { + overflow: visible +} + +.navbar-expand .navbar-collapse { + display: flex!important; + flex-basis: auto +} + +.navbar-expand .navbar-toggler { + display: none +} + +.navbar-light .navbar-brand { + color: rgba(0,0,0,.9) +} + +.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover { + color: rgba(0,0,0,.9) +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0,0,0,.5) +} + +.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover { + color: rgba(0,0,0,.7) +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0,0,0,.3) +} + +.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link { + color: rgba(0,0,0,.9) +} + +.navbar-light .navbar-toggler { + color: rgba(0,0,0,.5); + border-color: rgba(0,0,0,.1) +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") +} + +.navbar-light .navbar-text { + color: rgba(0,0,0,.5) +} + +.navbar-light .navbar-text a { + color: rgba(0,0,0,.9) +} + +.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover { + color: rgba(0,0,0,.9) +} + +.navbar-dark .navbar-brand { + color: #fff +} + +.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover { + color: #fff +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255,255,255,.5) +} + +.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover { + color: rgba(255,255,255,.75) +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255,255,255,.25) +} + +.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link { + color: #fff +} + +.navbar-dark .navbar-toggler { + color: rgba(255,255,255,.5); + border-color: rgba(255,255,255,.1) +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") +} + +.navbar-dark .navbar-text { + color: rgba(255,255,255,.5) +} + +.navbar-dark .navbar-text a { + color: #fff +} + +.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover { + color: #fff +} + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid #e3e6f0; + border-radius: .35rem +} + +.card>hr { + margin-right: 0; + margin-left: 0 +} + +.card>.list-group { + border-top: inherit; + border-bottom: inherit +} + +.card>.list-group:first-child { + border-top-width: 0; + border-top-left-radius: calc(.35rem - 1px); + border-top-right-radius: calc(.35rem - 1px) +} + +.card>.list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: calc(.35rem - 1px); + border-bottom-left-radius: calc(.35rem - 1px) +} + +.card>.card-header+.list-group,.card>.list-group+.card-footer { + border-top: 0 +} + +.card-body { + flex: 1 1 auto; + min-height: 1px; + padding: 1.25rem +} + +.card-title { + margin-bottom: .75rem +} + +.card-subtitle { + margin-top: -.375rem; + margin-bottom: 0 +} + +.card-text:last-child { + margin-bottom: 0 +} + +.card-link:hover { + text-decoration: none +} + +.card-link+.card-link { + margin-left: 1.25rem +} + +.card-header { + padding: .75rem 1.25rem; + margin-bottom: 0; + background-color: #f8f9fc; + border-bottom: 1px solid #e3e6f0 +} + +.card-header:first-child { + border-radius: calc(.35rem - 1px) calc(.35rem - 1px) 0 0 +} + +.card-footer { + padding: .75rem 1.25rem; + background-color: #f8f9fc; + border-top: 1px solid #e3e6f0 +} + +.card-footer:last-child { + border-radius: 0 0 calc(.35rem - 1px) calc(.35rem - 1px) +} + +.card-header-tabs { + margin-right: -.625rem; + margin-bottom: -.75rem; + margin-left: -.625rem; + border-bottom: 0 +} + +.card-header-pills { + margin-right: -.625rem; + margin-left: -.625rem +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; + border-radius: calc(.35rem - 1px) +} + +.card-img,.card-img-bottom,.card-img-top { + flex-shrink: 0; + width: 100% +} + +.card-img,.card-img-top { + border-top-left-radius: calc(.35rem - 1px); + border-top-right-radius: calc(.35rem - 1px) +} + +.card-img,.card-img-bottom { + border-bottom-right-radius: calc(.35rem - 1px); + border-bottom-left-radius: calc(.35rem - 1px) +} + +.card-deck .card { + margin-bottom: .75rem +} + +@media (min-width: 576px) { + .card-deck { + display:flex; + flex-flow: row wrap; + margin-right: -.75rem; + margin-left: -.75rem + } + + .card-deck .card { + flex: 1 0 0%; + margin-right: .75rem; + margin-bottom: 0; + margin-left: .75rem + } +} + +.card-group>.card { + margin-bottom: .75rem +} + +@media (min-width: 576px) { + .card-group { + display:flex; + flex-flow: row wrap + } + + .card-group>.card { + flex: 1 0 0%; + margin-bottom: 0 + } + + .card-group>.card+.card { + margin-left: 0; + border-left: 0 + } + + .card-group>.card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 + } + + .card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top { + border-top-right-radius: 0 + } + + .card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom { + border-bottom-right-radius: 0 + } + + .card-group>.card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 + } + + .card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top { + border-top-left-radius: 0 + } + + .card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom { + border-bottom-left-radius: 0 + } +} + +.card-columns .card { + margin-bottom: .75rem +} + +@media (min-width: 576px) { + .card-columns { + -moz-column-count:3; + column-count: 3; + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; + orphans: 1; + widows: 1 + } + + .card-columns .card { + display: inline-block; + width: 100% + } +} + +.accordion { + overflow-anchor: none +} + +.accordion>.card { + overflow: hidden +} + +.accordion>.card:not(:last-of-type) { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.accordion>.card:not(:first-of-type) { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.accordion>.card>.card-header { + border-radius: 0; + margin-bottom: -1px +} + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: .75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #eaecf4; + border-radius: .35rem +} + +.breadcrumb-item+.breadcrumb-item { + padding-left: .5rem +} + +.breadcrumb-item+.breadcrumb-item::before { + float: left; + padding-right: .5rem; + color: #858796; + content: "/" +} + +.breadcrumb-item+.breadcrumb-item:hover::before { + text-decoration: underline +} + +.breadcrumb-item+.breadcrumb-item:hover::before { + text-decoration: none +} + +.breadcrumb-item.active { + color: #858796 +} + +.pagination { + display: flex; + padding-left: 0; + list-style: none; + border-radius: .35rem +} + +.page-link { + position: relative; + display: block; + padding: .5rem .75rem; + margin-left: -1px; + line-height: 1.25; + color: #4e73df; + background-color: #fff; + border: 1px solid #dddfeb +} + +.page-link:hover { + z-index: 2; + color: #224abe; + text-decoration: none; + background-color: #eaecf4; + border-color: #dddfeb +} + +.page-link:focus { + z-index: 3; + outline: 0; + box-shadow: 0 0 0 .2rem rgba(78,115,223,.25) +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: .35rem; + border-bottom-left-radius: .35rem +} + +.page-item:last-child .page-link { + border-top-right-radius: .35rem; + border-bottom-right-radius: .35rem +} + +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #4e73df; + border-color: #4e73df +} + +.page-item.disabled .page-link { + color: #858796; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dddfeb +} + +.pagination-lg .page-link { + padding: .75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5 +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: .3rem; + border-bottom-left-radius: .3rem +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: .3rem; + border-bottom-right-radius: .3rem +} + +.pagination-sm .page-link { + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5 +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: .2rem; + border-bottom-left-radius: .2rem +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: .2rem; + border-bottom-right-radius: .2rem +} + +.badge { + display: inline-block; + padding: .25em .4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .35rem; + transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .badge { + transition: none + } +} + +a.badge:focus,a.badge:hover { + text-decoration: none +} + +.badge:empty { + display: none +} + +.btn .badge { + position: relative; + top: -1px +} + +.badge-pill { + padding-right: .6em; + padding-left: .6em; + border-radius: 10rem +} + +.badge-primary { + color: #fff; + background-color: #4e73df +} + +a.badge-primary:focus,a.badge-primary:hover { + color: #fff; + background-color: #2653d4 +} + +a.badge-primary.focus,a.badge-primary:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(78,115,223,.5) +} + +.badge-secondary { + color: #fff; + background-color: #858796 +} + +a.badge-secondary:focus,a.badge-secondary:hover { + color: #fff; + background-color: #6b6d7d +} + +a.badge-secondary.focus,a.badge-secondary:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(133,135,150,.5) +} + +.badge-success { + color: #fff; + background-color: #1cc88a +} + +a.badge-success:focus,a.badge-success:hover { + color: #fff; + background-color: #169b6b +} + +a.badge-success.focus,a.badge-success:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(28,200,138,.5) +} + +.badge-info { + color: #fff; + background-color: #36b9cc +} + +a.badge-info:focus,a.badge-info:hover { + color: #fff; + background-color: #2a96a5 +} + +a.badge-info.focus,a.badge-info:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(54,185,204,.5) +} + +.badge-warning { + color: #fff; + background-color: #f6c23e +} + +a.badge-warning:focus,a.badge-warning:hover { + color: #fff; + background-color: #f4b30d +} + +a.badge-warning.focus,a.badge-warning:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(246,194,62,.5) +} + +.badge-danger { + color: #fff; + background-color: #e74a3b +} + +a.badge-danger:focus,a.badge-danger:hover { + color: #fff; + background-color: #d52a1a +} + +a.badge-danger.focus,a.badge-danger:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(231,74,59,.5) +} + +.badge-light { + color: #3a3b45; + background-color: #f8f9fc +} + +a.badge-light:focus,a.badge-light:hover { + color: #3a3b45; + background-color: #d4daed +} + +a.badge-light.focus,a.badge-light:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(248,249,252,.5) +} + +.badge-dark { + color: #fff; + background-color: #5a5c69 +} + +a.badge-dark:focus,a.badge-dark:hover { + color: #fff; + background-color: #42444e +} + +a.badge-dark.focus,a.badge-dark:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(90,92,105,.5) +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #eaecf4; + border-radius: .3rem +} + +@media (min-width: 576px) { + .jumbotron { + padding:4rem 2rem + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0 +} + +.alert { + position: relative; + padding: .75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: .35rem +} + +.alert-heading { + color: inherit +} + +.alert-link { + font-weight: 700 +} + +.alert-dismissible { + padding-right: 4rem +} + +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: .75rem 1.25rem; + color: inherit +} + +.alert-primary { + color: #293c74; + background-color: #dce3f9; + border-color: #cdd8f6 +} + +.alert-primary hr { + border-top-color: #b7c7f2 +} + +.alert-primary .alert-link { + color: #1c294e +} + +.alert-secondary { + color: #45464e; + background-color: #e7e7ea; + border-color: #dddde2 +} + +.alert-secondary hr { + border-top-color: #cfcfd6 +} + +.alert-secondary .alert-link { + color: #2d2e33 +} + +.alert-success { + color: #0f6848; + background-color: #d2f4e8; + border-color: #bff0de +} + +.alert-success hr { + border-top-color: #aaebd3 +} + +.alert-success .alert-link { + color: #093b29 +} + +.alert-info { + color: #1c606a; + background-color: #d7f1f5; + border-color: #c7ebf1 +} + +.alert-info hr { + border-top-color: #b3e4ec +} + +.alert-info .alert-link { + color: #113b42 +} + +.alert-warning { + color: #806520; + background-color: #fdf3d8; + border-color: #fceec9 +} + +.alert-warning hr { + border-top-color: #fbe6b1 +} + +.alert-warning .alert-link { + color: #574516 +} + +.alert-danger { + color: #78261f; + background-color: #fadbd8; + border-color: #f8ccc8 +} + +.alert-danger hr { + border-top-color: #f5b7b1 +} + +.alert-danger .alert-link { + color: #4f1915 +} + +.alert-light { + color: #818183; + background-color: #fefefe; + border-color: #fdfdfe +} + +.alert-light hr { + border-top-color: #ececf6 +} + +.alert-light .alert-link { + color: #686869 +} + +.alert-dark { + color: #2f3037; + background-color: #dedee1; + border-color: #d1d1d5 +} + +.alert-dark hr { + border-top-color: #c4c4c9 +} + +.alert-dark .alert-link { + color: #18181c +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0 + } + + to { + background-position: 0 0 + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0 + } + + to { + background-position: 0 0 + } +} + +.progress { + display: flex; + height: 1rem; + overflow: hidden; + line-height: 0; + font-size: .75rem; + background-color: #eaecf4; + border-radius: .35rem +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #4e73df; + transition: width .6s ease +} + +@media (prefers-reduced-motion:reduce) { + .progress-bar { + transition: none + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + background-size: 1rem 1rem +} + +.progress-bar-animated { + -webkit-animation: 1s linear infinite progress-bar-stripes; + animation: 1s linear infinite progress-bar-stripes +} + +@media (prefers-reduced-motion:reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none + } +} + +.media { + display: flex; + align-items: flex-start +} + +.media-body { + flex: 1 +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: .35rem +} + +.list-group-item-action { + width: 100%; + color: #6e707e; + text-align: inherit +} + +.list-group-item-action:focus,.list-group-item-action:hover { + z-index: 1; + color: #6e707e; + text-decoration: none; + background-color: #f8f9fc +} + +.list-group-item-action:active { + color: #858796; + background-color: #eaecf4 +} + +.list-group-item { + position: relative; + display: block; + padding: .75rem 1.25rem; + background-color: #fff; + border: 1px solid rgba(0,0,0,.125) +} + +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit +} + +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit +} + +.list-group-item.disabled,.list-group-item:disabled { + color: #858796; + pointer-events: none; + background-color: #fff +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #4e73df; + border-color: #4e73df +} + +.list-group-item+.list-group-item { + border-top-width: 0 +} + +.list-group-item+.list-group-item.active { + margin-top: -1px; + border-top-width: 1px +} + +.list-group-horizontal { + flex-direction: row +} + +.list-group-horizontal>.list-group-item:first-child { + border-bottom-left-radius: .35rem; + border-top-right-radius: 0 +} + +.list-group-horizontal>.list-group-item:last-child { + border-top-right-radius: .35rem; + border-bottom-left-radius: 0 +} + +.list-group-horizontal>.list-group-item.active { + margin-top: 0 +} + +.list-group-horizontal>.list-group-item+.list-group-item { + border-top-width: 1px; + border-left-width: 0 +} + +.list-group-horizontal>.list-group-item+.list-group-item.active { + margin-left: -1px; + border-left-width: 1px +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction:row + } + + .list-group-horizontal-sm>.list-group-item:first-child { + border-bottom-left-radius: .35rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-sm>.list-group-item:last-child { + border-top-right-radius: .35rem; + border-bottom-left-radius: 0 + } + + .list-group-horizontal-sm>.list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-sm>.list-group-item+.list-group-item { + border-top-width: 1px; + border-left-width: 0 + } + + .list-group-horizontal-sm>.list-group-item+.list-group-item.active { + margin-left: -1px; + border-left-width: 1px + } +} + +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction:row + } + + .list-group-horizontal-md>.list-group-item:first-child { + border-bottom-left-radius: .35rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-md>.list-group-item:last-child { + border-top-right-radius: .35rem; + border-bottom-left-radius: 0 + } + + .list-group-horizontal-md>.list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-md>.list-group-item+.list-group-item { + border-top-width: 1px; + border-left-width: 0 + } + + .list-group-horizontal-md>.list-group-item+.list-group-item.active { + margin-left: -1px; + border-left-width: 1px + } +} + +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction:row + } + + .list-group-horizontal-lg>.list-group-item:first-child { + border-bottom-left-radius: .35rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-lg>.list-group-item:last-child { + border-top-right-radius: .35rem; + border-bottom-left-radius: 0 + } + + .list-group-horizontal-lg>.list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-lg>.list-group-item+.list-group-item { + border-top-width: 1px; + border-left-width: 0 + } + + .list-group-horizontal-lg>.list-group-item+.list-group-item.active { + margin-left: -1px; + border-left-width: 1px + } +} + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction:row + } + + .list-group-horizontal-xl>.list-group-item:first-child { + border-bottom-left-radius: .35rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-xl>.list-group-item:last-child { + border-top-right-radius: .35rem; + border-bottom-left-radius: 0 + } + + .list-group-horizontal-xl>.list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-xl>.list-group-item+.list-group-item { + border-top-width: 1px; + border-left-width: 0 + } + + .list-group-horizontal-xl>.list-group-item+.list-group-item.active { + margin-left: -1px; + border-left-width: 1px + } +} + +.list-group-flush { + border-radius: 0 +} + +.list-group-flush>.list-group-item { + border-width: 0 0 1px +} + +.list-group-flush>.list-group-item:last-child { + border-bottom-width: 0 +} + +.list-group-item-primary { + color: #293c74; + background-color: #cdd8f6 +} + +.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover { + color: #293c74; + background-color: #b7c7f2 +} + +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #293c74; + border-color: #293c74 +} + +.list-group-item-secondary { + color: #45464e; + background-color: #dddde2 +} + +.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover { + color: #45464e; + background-color: #cfcfd6 +} + +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #45464e; + border-color: #45464e +} + +.list-group-item-success { + color: #0f6848; + background-color: #bff0de +} + +.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover { + color: #0f6848; + background-color: #aaebd3 +} + +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #0f6848; + border-color: #0f6848 +} + +.list-group-item-info { + color: #1c606a; + background-color: #c7ebf1 +} + +.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover { + color: #1c606a; + background-color: #b3e4ec +} + +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #1c606a; + border-color: #1c606a +} + +.list-group-item-warning { + color: #806520; + background-color: #fceec9 +} + +.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover { + color: #806520; + background-color: #fbe6b1 +} + +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #806520; + border-color: #806520 +} + +.list-group-item-danger { + color: #78261f; + background-color: #f8ccc8 +} + +.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover { + color: #78261f; + background-color: #f5b7b1 +} + +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #78261f; + border-color: #78261f +} + +.list-group-item-light { + color: #818183; + background-color: #fdfdfe +} + +.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover { + color: #818183; + background-color: #ececf6 +} + +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #818183; + border-color: #818183 +} + +.list-group-item-dark { + color: #2f3037; + background-color: #d1d1d5 +} + +.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover { + color: #2f3037; + background-color: #c4c4c9 +} + +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #2f3037; + border-color: #2f3037 +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5 +} + +.close:hover { + color: #000; + text-decoration: none +} + +.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover { + opacity: .75 +} + +button.close { + padding: 0; + background-color: transparent; + border: 0 +} + +a.close.disabled { + pointer-events: none +} + +.toast { + flex-basis: 350px; + max-width: 350px; + font-size: .875rem; + background-color: rgba(255,255,255,.85); + background-clip: padding-box; + border: 1px solid rgba(0,0,0,.1); + box-shadow: 0 .25rem .75rem rgba(0,0,0,.1); + opacity: 0; + border-radius: .25rem +} + +.toast:not(:last-child) { + margin-bottom: .75rem +} + +.toast.showing { + opacity: 1 +} + +.toast.show { + display: block; + opacity: 1 +} + +.toast.hide { + display: none +} + +.toast-header { + display: flex; + align-items: center; + padding: .25rem .75rem; + color: #858796; + background-color: rgba(255,255,255,.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0,0,0,.05); + border-top-left-radius: calc(.25rem - 1px); + border-top-right-radius: calc(.25rem - 1px) +} + +.toast-body { + padding: .75rem +} + +.modal-open { + overflow: hidden +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0 +} + +.modal-dialog { + position: relative; + width: auto; + margin: .5rem; + pointer-events: none +} + +.modal.fade .modal-dialog { + transition: transform .3s ease-out; + transform: translate(0,-50px) +} + +@media (prefers-reduced-motion:reduce) { + .modal.fade .modal-dialog { + transition: none + } +} + +.modal.show .modal-dialog { + transform: none +} + +.modal.modal-static .modal-dialog { + transform: scale(1.02) +} + +.modal-dialog-scrollable { + display: flex; + max-height: calc(100% - 1rem) +} + +.modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden +} + +.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header { + flex-shrink: 0 +} + +.modal-dialog-scrollable .modal-body { + overflow-y: auto +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - 1rem) +} + +.modal-dialog-centered::before { + display: block; + height: calc(100vh - 1rem); + height: -webkit-min-content; + height: -moz-min-content; + height: min-content; + content: "" +} + +.modal-dialog-centered.modal-dialog-scrollable { + flex-direction: column; + justify-content: center; + height: 100% +} + +.modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none +} + +.modal-dialog-centered.modal-dialog-scrollable::before { + content: none +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0,0,0,.2); + border-radius: .3rem; + outline: 0 +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000 +} + +.modal-backdrop.fade { + opacity: 0 +} + +.modal-backdrop.show { + opacity: .5 +} + +.modal-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #e3e6f0; + border-top-left-radius: calc(.3rem - 1px); + border-top-right-radius: calc(.3rem - 1px) +} + +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5 +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem +} + +.modal-footer { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: .75rem; + border-top: 1px solid #e3e6f0; + border-bottom-right-radius: calc(.3rem - 1px); + border-bottom-left-radius: calc(.3rem - 1px) +} + +.modal-footer>* { + margin: .25rem +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll +} + +@media (min-width: 576px) { + .modal-dialog { + max-width:500px; + margin: 1.75rem auto + } + + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem) + } + + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem) + } + + .modal-dialog-centered { + min-height: calc(100% - 3.5rem) + } + + .modal-dialog-centered::before { + height: calc(100vh - 3.5rem); + height: -webkit-min-content; + height: -moz-min-content; + height: min-content + } + + .modal-sm { + max-width: 300px + } +} + +@media (min-width: 992px) { + .modal-lg,.modal-xl { + max-width:800px + } +} + +@media (min-width: 1200px) { + .modal-xl { + max-width:1140px + } +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: Nunito,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: .875rem; + word-wrap: break-word; + opacity: 0 +} + +.tooltip.show { + opacity: .9 +} + +.tooltip .arrow { + position: absolute; + display: block; + width: .8rem; + height: .4rem +} + +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid +} + +.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top { + padding: .4rem 0 +} + +.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow { + bottom: 0 +} + +.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before { + top: 0; + border-width: .4rem .4rem 0; + border-top-color: #000 +} + +.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right { + padding: 0 .4rem +} + +.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow { + left: 0; + width: .4rem; + height: .8rem +} + +.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before { + right: 0; + border-width: .4rem .4rem .4rem 0; + border-right-color: #000 +} + +.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom { + padding: .4rem 0 +} + +.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow { + top: 0 +} + +.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before { + bottom: 0; + border-width: 0 .4rem .4rem; + border-bottom-color: #000 +} + +.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left { + padding: 0 .4rem +} + +.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow { + right: 0; + width: .4rem; + height: .8rem +} + +.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before { + left: 0; + border-width: .4rem 0 .4rem .4rem; + border-left-color: #000 +} + +.tooltip-inner { + max-width: 200px; + padding: .25rem .5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: .35rem +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: Nunito,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: .875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0,0,0,.2); + border-radius: .3rem +} + +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: .5rem; + margin: 0 .3rem +} + +.popover .arrow::after,.popover .arrow::before { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid +} + +.bs-popover-auto[x-placement^=top],.bs-popover-top { + margin-bottom: .5rem +} + +.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow { + bottom: calc(-.5rem - 1px) +} + +.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before { + bottom: 0; + border-width: .5rem .5rem 0; + border-top-color: rgba(0,0,0,.25) +} + +.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after { + bottom: 1px; + border-width: .5rem .5rem 0; + border-top-color: #fff +} + +.bs-popover-auto[x-placement^=right],.bs-popover-right { + margin-left: .5rem +} + +.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow { + left: calc(-.5rem - 1px); + width: .5rem; + height: 1rem; + margin: .3rem 0 +} + +.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before { + left: 0; + border-width: .5rem .5rem .5rem 0; + border-right-color: rgba(0,0,0,.25) +} + +.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after { + left: 1px; + border-width: .5rem .5rem .5rem 0; + border-right-color: #fff +} + +.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom { + margin-top: .5rem +} + +.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow { + top: calc(-.5rem - 1px) +} + +.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before { + top: 0; + border-width: 0 .5rem .5rem .5rem; + border-bottom-color: rgba(0,0,0,.25) +} + +.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after { + top: 1px; + border-width: 0 .5rem .5rem .5rem; + border-bottom-color: #fff +} + +.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7 +} + +.bs-popover-auto[x-placement^=left],.bs-popover-left { + margin-right: .5rem +} + +.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow { + right: calc(-.5rem - 1px); + width: .5rem; + height: 1rem; + margin: .3rem 0 +} + +.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before { + right: 0; + border-width: .5rem 0 .5rem .5rem; + border-left-color: rgba(0,0,0,.25) +} + +.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after { + right: 1px; + border-width: .5rem 0 .5rem .5rem; + border-left-color: #fff +} + +.popover-header { + padding: .5rem .75rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(.3rem - 1px); + border-top-right-radius: calc(.3rem - 1px) +} + +.popover-header:empty { + display: none +} + +.popover-body { + padding: .5rem .75rem; + color: #858796 +} + +.carousel { + position: relative +} + +.carousel.pointer-event { + touch-action: pan-y +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden +} + +.carousel-inner::after { + display: block; + clear: both; + content: "" +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform .6s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .carousel-item { + transition: none + } +} + +.carousel-item-next,.carousel-item-prev,.carousel-item.active { + display: block +} + +.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left) { + transform: translateX(100%) +} + +.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right) { + transform: translateX(-100%) +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none +} + +.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active { + z-index: 1; + opacity: 1 +} + +.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: opacity 0s .6s +} + +@media (prefers-reduced-motion:reduce) { + .carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right { + transition: none + } +} + +.carousel-control-next,.carousel-control-prev { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: .5; + transition: opacity .15s ease +} + +@media (prefers-reduced-motion:reduce) { + .carousel-control-next,.carousel-control-prev { + transition: none + } +} + +.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover { + color: #fff; + text-decoration: none; + outline: 0; + opacity: .9 +} + +.carousel-control-prev { + left: 0 +} + +.carousel-control-next { + right: 0 +} + +.carousel-control-next-icon,.carousel-control-prev-icon { + display: inline-block; + width: 20px; + height: 20px; + background: 50%/100% 100% no-repeat +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e") +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e") +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: flex; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none +} + +.carousel-indicators li { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + transition: opacity .6s ease +} + +@media (prefers-reduced-motion:reduce) { + .carousel-indicators li { + transition: none + } +} + +.carousel-indicators .active { + opacity: 1 +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center +} + +@-webkit-keyframes spinner-border { + to { + transform: rotate(360deg) + } +} + +@keyframes spinner-border { + to { + transform: rotate(360deg) + } +} + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: .25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: .75s linear infinite spinner-border; + animation: .75s linear infinite spinner-border +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: .2em +} + +@-webkit-keyframes spinner-grow { + 0% { + transform: scale(0) + } + + 50% { + opacity: 1; + transform: none + } +} + +@keyframes spinner-grow { + 0% { + transform: scale(0) + } + + 50% { + opacity: 1; + transform: none + } +} + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: .75s linear infinite spinner-grow; + animation: .75s linear infinite spinner-grow +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem +} + +@media (prefers-reduced-motion:reduce) { + .spinner-border,.spinner-grow { + -webkit-animation-duration: 1.5s; + animation-duration: 1.5s + } +} + +.align-baseline { + vertical-align: baseline!important +} + +.align-top { + vertical-align: top!important +} + +.align-middle { + vertical-align: middle!important +} + +.align-bottom { + vertical-align: bottom!important +} + +.align-text-bottom { + vertical-align: text-bottom!important +} + +.align-text-top { + vertical-align: text-top!important +} + +.bg-primary { + background-color: #4e73df!important +} + +a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover { + background-color: #2653d4!important +} + +.bg-secondary { + background-color: #858796!important +} + +a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover { + background-color: #6b6d7d!important +} + +.bg-success { + background-color: #1cc88a!important +} + +a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover { + background-color: #169b6b!important +} + +.bg-info { + background-color: #36b9cc!important +} + +a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover { + background-color: #2a96a5!important +} + +.bg-warning { + background-color: #f6c23e!important +} + +a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover { + background-color: #f4b30d!important +} + +.bg-danger { + background-color: #e74a3b!important +} + +a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover { + background-color: #d52a1a!important +} + +.bg-light { + background-color: #f8f9fc!important +} + +a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover { + background-color: #d4daed!important +} + +.bg-dark { + background-color: #5a5c69 +} + +a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover { + background-color: #42444e!important +} + +.bg-white { + background-color: #fff!important +} + +.bg-transparent { + background-color: transparent!important +} + +.border { + border: 1px solid #e3e6f0!important +} + +.border-top { + border-top: 1px solid #e3e6f0!important +} + +.border-right { + border-right: 1px solid #e3e6f0!important +} + +.border-bottom { + border-bottom: 1px solid #e3e6f0!important +} + +.border-left { + border-left: 1px solid #e3e6f0!important +} + +.border-0 { + border: 0!important +} + +.border-top-0 { + border-top: 0!important +} + +.border-right-0 { + border-right: 0!important +} + +.border-bottom-0 { + border-bottom: 0!important +} + +.border-left-0 { + border-left: 0!important +} + +.border-primary { + border-color: #4e73df!important +} + +.border-secondary { + border-color: #858796!important +} + +.border-success { + border-color: #1cc88a!important +} + +.border-info { + border-color: #36b9cc!important +} + +.border-warning { + border-color: #f6c23e!important +} + +.border-danger { + border-color: #e74a3b!important +} + +.border-light { + border-color: #f8f9fc!important +} + +.border-dark { + border-color: #5a5c69!important +} + +.border-white { + border-color: #fff!important +} + +.rounded-sm { + border-radius: .2rem!important +} + +.rounded { + border-radius: .35rem!important +} + +.rounded-top { + border-top-left-radius: .35rem!important; + border-top-right-radius: .35rem!important +} + +.rounded-right { + border-top-right-radius: .35rem!important; + border-bottom-right-radius: .35rem!important +} + +.rounded-bottom { + border-bottom-right-radius: .35rem!important; + border-bottom-left-radius: .35rem!important +} + +.rounded-left { + border-top-left-radius: .35rem!important; + border-bottom-left-radius: .35rem!important +} + +.rounded-lg { + border-radius: .3rem!important +} + +.rounded-circle { + border-radius: 50%!important +} + +.rounded-pill { + border-radius: 50rem!important +} + +.rounded-0 { + border-radius: 0!important +} + +.clearfix::after { + display: block; + clear: both; + content: "" +} + +.d-none { + display: none!important +} + +.d-inline { + display: inline!important +} + +.d-inline-block { + display: inline-block!important +} + +.d-block { + display: block!important +} + +.d-table { + display: table!important +} + +.d-table-row { + display: table-row!important +} + +.d-table-cell { + display: table-cell!important +} + +.d-flex { + display: flex!important +} + +.d-inline-flex { + display: inline-flex!important +} + +@media (min-width: 576px) { + .d-sm-none { + display:none!important + } + + .d-sm-inline { + display: inline!important + } + + .d-sm-inline-block { + display: inline-block!important + } + + .d-sm-block { + display: block!important + } + + .d-sm-table { + display: table!important + } + + .d-sm-table-row { + display: table-row!important + } + + .d-sm-table-cell { + display: table-cell!important + } + + .d-sm-flex { + display: flex!important + } + + .d-sm-inline-flex { + display: inline-flex!important + } +} + +@media (min-width: 768px) { + .d-md-none { + display:none!important + } + + .d-md-inline { + display: inline!important + } + + .d-md-inline-block { + display: inline-block!important + } + + .d-md-block { + display: block!important + } + + .d-md-table { + display: table!important + } + + .d-md-table-row { + display: table-row!important + } + + .d-md-table-cell { + display: table-cell!important + } + + .d-md-flex { + display: flex!important + } + + .d-md-inline-flex { + display: inline-flex!important + } +} + +@media (min-width: 992px) { + .d-lg-none { + display:none!important + } + + .d-lg-inline { + display: inline!important + } + + .d-lg-inline-block { + display: inline-block!important + } + + .d-lg-block { + display: block!important + } + + .d-lg-table { + display: table!important + } + + .d-lg-table-row { + display: table-row!important + } + + .d-lg-table-cell { + display: table-cell!important + } + + .d-lg-flex { + display: flex!important + } + + .d-lg-inline-flex { + display: inline-flex!important + } +} + +@media (min-width: 1200px) { + .d-xl-none { + display:none!important + } + + .d-xl-inline { + display: inline!important + } + + .d-xl-inline-block { + display: inline-block!important + } + + .d-xl-block { + display: block!important + } + + .d-xl-table { + display: table!important + } + + .d-xl-table-row { + display: table-row!important + } + + .d-xl-table-cell { + display: table-cell!important + } + + .d-xl-flex { + display: flex!important + } + + .d-xl-inline-flex { + display: inline-flex!important + } +} + +@media print { + .d-print-none { + display: none!important + } + + .d-print-inline { + display: inline!important + } + + .d-print-inline-block { + display: inline-block!important + } + + .d-print-block { + display: block!important + } + + .d-print-table { + display: table!important + } + + .d-print-table-row { + display: table-row!important + } + + .d-print-table-cell { + display: table-cell!important + } + + .d-print-flex { + display: flex!important + } + + .d-print-inline-flex { + display: inline-flex!important + } +} + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden +} + +.embed-responsive::before { + display: block; + content: "" +} + +.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0 +} + +.embed-responsive-21by9::before { + padding-top: 42.85714% +} + +.embed-responsive-16by9::before { + padding-top: 56.25% +} + +.embed-responsive-4by3::before { + padding-top: 75% +} + +.embed-responsive-1by1::before { + padding-top: 100% +} + +.flex-row { + flex-direction: row!important +} + +.flex-column { + flex-direction: column!important +} + +.flex-row-reverse { + flex-direction: row-reverse!important +} + +.flex-column-reverse { + flex-direction: column-reverse!important +} + +.flex-wrap { + flex-wrap: wrap!important +} + +.flex-nowrap { + flex-wrap: nowrap!important +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse!important +} + +.flex-fill { + flex: 1 1 auto!important +} + +.flex-grow-0 { + flex-grow: 0!important +} + +.flex-grow-1 { + flex-grow: 1!important +} + +.flex-shrink-0 { + flex-shrink: 0!important +} + +.flex-shrink-1 { + flex-shrink: 1!important +} + +.justify-content-start { + justify-content: flex-start!important +} + +.justify-content-end { + justify-content: flex-end!important +} + +.justify-content-center { + justify-content: center!important +} + +.justify-content-between { + justify-content: space-between!important +} + +.justify-content-around { + justify-content: space-around!important +} + +.align-items-start { + align-items: flex-start!important +} + +.align-items-end { + align-items: flex-end!important +} + +.align-items-center { + align-items: center!important +} + +.align-items-baseline { + align-items: baseline!important +} + +.align-items-stretch { + align-items: stretch!important +} + +.align-content-start { + align-content: flex-start!important +} + +.align-content-end { + align-content: flex-end!important +} + +.align-content-center { + align-content: center!important +} + +.align-content-between { + align-content: space-between!important +} + +.align-content-around { + align-content: space-around!important +} + +.align-content-stretch { + align-content: stretch!important +} + +.align-self-auto { + align-self: auto!important +} + +.align-self-start { + align-self: flex-start!important +} + +.align-self-end { + align-self: flex-end!important +} + +.align-self-center { + align-self: center!important +} + +.align-self-baseline { + align-self: baseline!important +} + +.align-self-stretch { + align-self: stretch!important +} + +@media (min-width: 576px) { + .flex-sm-row { + flex-direction:row!important + } + + .flex-sm-column { + flex-direction: column!important + } + + .flex-sm-row-reverse { + flex-direction: row-reverse!important + } + + .flex-sm-column-reverse { + flex-direction: column-reverse!important + } + + .flex-sm-wrap { + flex-wrap: wrap!important + } + + .flex-sm-nowrap { + flex-wrap: nowrap!important + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse!important + } + + .flex-sm-fill { + flex: 1 1 auto!important + } + + .flex-sm-grow-0 { + flex-grow: 0!important + } + + .flex-sm-grow-1 { + flex-grow: 1!important + } + + .flex-sm-shrink-0 { + flex-shrink: 0!important + } + + .flex-sm-shrink-1 { + flex-shrink: 1!important + } + + .justify-content-sm-start { + justify-content: flex-start!important + } + + .justify-content-sm-end { + justify-content: flex-end!important + } + + .justify-content-sm-center { + justify-content: center!important + } + + .justify-content-sm-between { + justify-content: space-between!important + } + + .justify-content-sm-around { + justify-content: space-around!important + } + + .align-items-sm-start { + align-items: flex-start!important + } + + .align-items-sm-end { + align-items: flex-end!important + } + + .align-items-sm-center { + align-items: center!important + } + + .align-items-sm-baseline { + align-items: baseline!important + } + + .align-items-sm-stretch { + align-items: stretch!important + } + + .align-content-sm-start { + align-content: flex-start!important + } + + .align-content-sm-end { + align-content: flex-end!important + } + + .align-content-sm-center { + align-content: center!important + } + + .align-content-sm-between { + align-content: space-between!important + } + + .align-content-sm-around { + align-content: space-around!important + } + + .align-content-sm-stretch { + align-content: stretch!important + } + + .align-self-sm-auto { + align-self: auto!important + } + + .align-self-sm-start { + align-self: flex-start!important + } + + .align-self-sm-end { + align-self: flex-end!important + } + + .align-self-sm-center { + align-self: center!important + } + + .align-self-sm-baseline { + align-self: baseline!important + } + + .align-self-sm-stretch { + align-self: stretch!important + } +} + +@media (min-width: 768px) { + .flex-md-row { + flex-direction:row!important + } + + .flex-md-column { + flex-direction: column!important + } + + .flex-md-row-reverse { + flex-direction: row-reverse!important + } + + .flex-md-column-reverse { + flex-direction: column-reverse!important + } + + .flex-md-wrap { + flex-wrap: wrap!important + } + + .flex-md-nowrap { + flex-wrap: nowrap!important + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse!important + } + + .flex-md-fill { + flex: 1 1 auto!important + } + + .flex-md-grow-0 { + flex-grow: 0!important + } + + .flex-md-grow-1 { + flex-grow: 1!important + } + + .flex-md-shrink-0 { + flex-shrink: 0!important + } + + .flex-md-shrink-1 { + flex-shrink: 1!important + } + + .justify-content-md-start { + justify-content: flex-start!important + } + + .justify-content-md-end { + justify-content: flex-end!important + } + + .justify-content-md-center { + justify-content: center!important + } + + .justify-content-md-between { + justify-content: space-between!important + } + + .justify-content-md-around { + justify-content: space-around!important + } + + .align-items-md-start { + align-items: flex-start!important + } + + .align-items-md-end { + align-items: flex-end!important + } + + .align-items-md-center { + align-items: center!important + } + + .align-items-md-baseline { + align-items: baseline!important + } + + .align-items-md-stretch { + align-items: stretch!important + } + + .align-content-md-start { + align-content: flex-start!important + } + + .align-content-md-end { + align-content: flex-end!important + } + + .align-content-md-center { + align-content: center!important + } + + .align-content-md-between { + align-content: space-between!important + } + + .align-content-md-around { + align-content: space-around!important + } + + .align-content-md-stretch { + align-content: stretch!important + } + + .align-self-md-auto { + align-self: auto!important + } + + .align-self-md-start { + align-self: flex-start!important + } + + .align-self-md-end { + align-self: flex-end!important + } + + .align-self-md-center { + align-self: center!important + } + + .align-self-md-baseline { + align-self: baseline!important + } + + .align-self-md-stretch { + align-self: stretch!important + } +} + +@media (min-width: 992px) { + .flex-lg-row { + flex-direction:row!important + } + + .flex-lg-column { + flex-direction: column!important + } + + .flex-lg-row-reverse { + flex-direction: row-reverse!important + } + + .flex-lg-column-reverse { + flex-direction: column-reverse!important + } + + .flex-lg-wrap { + flex-wrap: wrap!important + } + + .flex-lg-nowrap { + flex-wrap: nowrap!important + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse!important + } + + .flex-lg-fill { + flex: 1 1 auto!important + } + + .flex-lg-grow-0 { + flex-grow: 0!important + } + + .flex-lg-grow-1 { + flex-grow: 1!important + } + + .flex-lg-shrink-0 { + flex-shrink: 0!important + } + + .flex-lg-shrink-1 { + flex-shrink: 1!important + } + + .justify-content-lg-start { + justify-content: flex-start!important + } + + .justify-content-lg-end { + justify-content: flex-end!important + } + + .justify-content-lg-center { + justify-content: center!important + } + + .justify-content-lg-between { + justify-content: space-between!important + } + + .justify-content-lg-around { + justify-content: space-around!important + } + + .align-items-lg-start { + align-items: flex-start!important + } + + .align-items-lg-end { + align-items: flex-end!important + } + + .align-items-lg-center { + align-items: center!important + } + + .align-items-lg-baseline { + align-items: baseline!important + } + + .align-items-lg-stretch { + align-items: stretch!important + } + + .align-content-lg-start { + align-content: flex-start!important + } + + .align-content-lg-end { + align-content: flex-end!important + } + + .align-content-lg-center { + align-content: center!important + } + + .align-content-lg-between { + align-content: space-between!important + } + + .align-content-lg-around { + align-content: space-around!important + } + + .align-content-lg-stretch { + align-content: stretch!important + } + + .align-self-lg-auto { + align-self: auto!important + } + + .align-self-lg-start { + align-self: flex-start!important + } + + .align-self-lg-end { + align-self: flex-end!important + } + + .align-self-lg-center { + align-self: center!important + } + + .align-self-lg-baseline { + align-self: baseline!important + } + + .align-self-lg-stretch { + align-self: stretch!important + } +} + +@media (min-width: 1200px) { + .flex-xl-row { + flex-direction:row!important + } + + .flex-xl-column { + flex-direction: column!important + } + + .flex-xl-row-reverse { + flex-direction: row-reverse!important + } + + .flex-xl-column-reverse { + flex-direction: column-reverse!important + } + + .flex-xl-wrap { + flex-wrap: wrap!important + } + + .flex-xl-nowrap { + flex-wrap: nowrap!important + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse!important + } + + .flex-xl-fill { + flex: 1 1 auto!important + } + + .flex-xl-grow-0 { + flex-grow: 0!important + } + + .flex-xl-grow-1 { + flex-grow: 1!important + } + + .flex-xl-shrink-0 { + flex-shrink: 0!important + } + + .flex-xl-shrink-1 { + flex-shrink: 1!important + } + + .justify-content-xl-start { + justify-content: flex-start!important + } + + .justify-content-xl-end { + justify-content: flex-end!important + } + + .justify-content-xl-center { + justify-content: center!important + } + + .justify-content-xl-between { + justify-content: space-between!important + } + + .justify-content-xl-around { + justify-content: space-around!important + } + + .align-items-xl-start { + align-items: flex-start!important + } + + .align-items-xl-end { + align-items: flex-end!important + } + + .align-items-xl-center { + align-items: center!important + } + + .align-items-xl-baseline { + align-items: baseline!important + } + + .align-items-xl-stretch { + align-items: stretch!important + } + + .align-content-xl-start { + align-content: flex-start!important + } + + .align-content-xl-end { + align-content: flex-end!important + } + + .align-content-xl-center { + align-content: center!important + } + + .align-content-xl-between { + align-content: space-between!important + } + + .align-content-xl-around { + align-content: space-around!important + } + + .align-content-xl-stretch { + align-content: stretch!important + } + + .align-self-xl-auto { + align-self: auto!important + } + + .align-self-xl-start { + align-self: flex-start!important + } + + .align-self-xl-end { + align-self: flex-end!important + } + + .align-self-xl-center { + align-self: center!important + } + + .align-self-xl-baseline { + align-self: baseline!important + } + + .align-self-xl-stretch { + align-self: stretch!important + } +} + +.float-left { + float: left!important +} + +.float-right { + float: right!important +} + +.float-none { + float: none!important +} + +@media (min-width: 576px) { + .float-sm-left { + float:left!important + } + + .float-sm-right { + float: right!important + } + + .float-sm-none { + float: none!important + } +} + +@media (min-width: 768px) { + .float-md-left { + float:left!important + } + + .float-md-right { + float: right!important + } + + .float-md-none { + float: none!important + } +} + +@media (min-width: 992px) { + .float-lg-left { + float:left!important + } + + .float-lg-right { + float: right!important + } + + .float-lg-none { + float: none!important + } +} + +@media (min-width: 1200px) { + .float-xl-left { + float:left!important + } + + .float-xl-right { + float: right!important + } + + .float-xl-none { + float: none!important + } +} + +.user-select-all { + -webkit-user-select: all!important; + -moz-user-select: all!important; + -ms-user-select: all!important; + user-select: all!important +} + +.user-select-auto { + -webkit-user-select: auto!important; + -moz-user-select: auto!important; + -ms-user-select: auto!important; + user-select: auto!important +} + +.user-select-none { + -webkit-user-select: none!important; + -moz-user-select: none!important; + -ms-user-select: none!important; + user-select: none!important +} + +.overflow-auto { + overflow: auto!important +} + +.overflow-hidden { + overflow: hidden!important +} + +.position-static { + position: static!important +} + +.position-relative { + position: relative!important +} + +.position-absolute { + position: absolute!important +} + +.position-fixed { + position: fixed!important +} + +.position-sticky { + position: -webkit-sticky!important; + position: sticky!important +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030 +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030 +} + +@supports ((position: -webkit-sticky) or (position:sticky)) { + .sticky-top { + position:-webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + white-space: nowrap; + border: 0 +} + +.sr-only-focusable:active,.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal +} + +.shadow-sm { + box-shadow: 0 .125rem .25rem 0 rgba(58,59,69,.2)!important +} + +.shadow { + box-shadow: 0 .15rem 1.75rem 0 rgba(58,59,69,.15)!important +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0,0,0,.175)!important +} + +.shadow-none { + box-shadow: none!important +} + +.w-25 { + width: 25%!important +} + +.w-50 { + width: 50%!important +} + +.w-75 { + width: 75%!important +} + +.w-100 { + width: 100%!important +} + +.w-auto { + width: auto!important +} + +.h-25 { + height: 25%!important +} + +.h-50 { + height: 50%!important +} + +.h-75 { + height: 75%!important +} + +.h-100 { + height: 100%!important +} + +.h-auto { + height: auto!important +} + +.mw-100 { + max-width: 100%!important +} + +.mh-100 { + max-height: 100%!important +} + +.min-vw-100 { + min-width: 100vw!important +} + +.min-vh-100 { + min-height: 100vh!important +} + +.vw-100 { + width: 100vw!important +} + +.vh-100 { + height: 100vh!important +} + +.m-0 { + margin: 0!important +} + +.mt-0,.my-0 { + margin-top: 0!important +} + +.mr-0,.mx-0 { + margin-right: 0!important +} + +.mb-0,.my-0 { + margin-bottom: 0!important +} + +.ml-0,.mx-0 { + margin-left: 0!important +} + +.m-1 { + margin: .25rem!important +} + +.mt-1,.my-1 { + margin-top: .25rem!important +} + +.mr-1,.mx-1 { + margin-right: .25rem!important +} + +.mb-1,.my-1 { + margin-bottom: .25rem!important +} + +.ml-1,.mx-1 { + margin-left: .25rem!important +} + +.m-2 { + margin: .5rem!important +} + +.mt-2,.my-2 { + margin-top: .5rem!important +} + +.mr-2,.mx-2 { + margin-right: .5rem!important +} + +.mb-2,.my-2 { + margin-bottom: .5rem!important +} + +.ml-2,.mx-2 { + margin-left: .5rem!important +} + +.m-3 { + margin: 1rem!important +} + +.mt-3,.my-3 { + margin-top: 1rem!important +} + +.mr-3,.mx-3 { + margin-right: 1rem!important +} + +.mb-3,.my-3 { + margin-bottom: 1rem!important +} + +.ml-3,.mx-3 { + margin-left: 1rem!important +} + +.m-4 { + margin: 1.5rem!important +} + +.mt-4,.my-4 { + margin-top: 1.5rem!important +} + +.mr-4,.mx-4 { + margin-right: 1.5rem!important +} + +.mb-4,.my-4 { + margin-bottom: 1.5rem!important +} + +.ml-4,.mx-4 { + margin-left: 1.5rem!important +} + +.m-5 { + margin: 3rem!important +} + +.mt-5,.my-5 { + margin-top: 3rem!important +} + +.mr-5,.mx-5 { + margin-right: 3rem!important +} + +.mb-5,.my-5 { + margin-bottom: 3rem!important +} + +.ml-5,.mx-5 { + margin-left: 3rem!important +} + +.p-0 { + padding: 0!important +} + +.pt-0,.py-0 { + padding-top: 0!important +} + +.pr-0,.px-0 { + padding-right: 0!important +} + +.pb-0,.py-0 { + padding-bottom: 0!important +} + +.pl-0,.px-0 { + padding-left: 0!important +} + +.p-1 { + padding: .25rem!important +} + +.pt-1,.py-1 { + padding-top: .25rem!important +} + +.pr-1,.px-1 { + padding-right: .25rem!important +} + +.pb-1,.py-1 { + padding-bottom: .25rem!important +} + +.pl-1,.px-1 { + padding-left: .25rem!important +} + +.p-2 { + padding: .5rem!important +} + +.pt-2,.py-2 { + padding-top: .5rem!important +} + +.pr-2,.px-2 { + padding-right: .5rem!important +} + +.pb-2,.py-2 { + padding-bottom: .5rem!important +} + +.pl-2,.px-2 { + padding-left: .5rem!important +} + +.p-3 { + padding: 1rem!important +} + +.pt-3,.py-3 { + padding-top: 1rem!important +} + +.pr-3,.px-3 { + padding-right: 1rem!important +} + +.pb-3,.py-3 { + padding-bottom: 1rem!important +} + +.pl-3,.px-3 { + padding-left: 1rem!important +} + +.p-4 { + padding: 1.5rem!important +} + +.pt-4,.py-4 { + padding-top: 1.5rem!important +} + +.pr-4,.px-4 { + padding-right: 1.5rem!important +} + +.pb-4,.py-4 { + padding-bottom: 1.5rem!important +} + +.pl-4,.px-4 { + padding-left: 1.5rem!important +} + +.p-5 { + padding: 3rem!important +} + +.pt-5,.py-5 { + padding-top: 3rem!important +} + +.pr-5,.px-5 { + padding-right: 3rem!important +} + +.pb-5,.py-5 { + padding-bottom: 3rem!important +} + +.pl-5,.px-5 { + padding-left: 3rem!important +} + +.m-n1 { + margin: -.25rem!important +} + +.mt-n1,.my-n1 { + margin-top: -.25rem!important +} + +.mr-n1,.mx-n1 { + margin-right: -.25rem!important +} + +.mb-n1,.my-n1 { + margin-bottom: -.25rem!important +} + +.ml-n1,.mx-n1 { + margin-left: -.25rem!important +} + +.m-n2 { + margin: -.5rem!important +} + +.mt-n2,.my-n2 { + margin-top: -.5rem!important +} + +.mr-n2,.mx-n2 { + margin-right: -.5rem!important +} + +.mb-n2,.my-n2 { + margin-bottom: -.5rem!important +} + +.ml-n2,.mx-n2 { + margin-left: -.5rem!important +} + +.m-n3 { + margin: -1rem!important +} + +.mt-n3,.my-n3 { + margin-top: -1rem!important +} + +.mr-n3,.mx-n3 { + margin-right: -1rem!important +} + +.mb-n3,.my-n3 { + margin-bottom: -1rem!important +} + +.ml-n3,.mx-n3 { + margin-left: -1rem!important +} + +.m-n4 { + margin: -1.5rem!important +} + +.mt-n4,.my-n4 { + margin-top: -1.5rem!important +} + +.mr-n4,.mx-n4 { + margin-right: -1.5rem!important +} + +.mb-n4,.my-n4 { + margin-bottom: -1.5rem!important +} + +.ml-n4,.mx-n4 { + margin-left: -1.5rem!important +} + +.m-n5 { + margin: -3rem!important +} + +.mt-n5,.my-n5 { + margin-top: -3rem!important +} + +.mr-n5,.mx-n5 { + margin-right: -3rem!important +} + +.mb-n5,.my-n5 { + margin-bottom: -3rem!important +} + +.ml-n5,.mx-n5 { + margin-left: -3rem!important +} + +.m-auto { + margin: auto!important +} + +.mt-auto,.my-auto { + margin-top: auto!important +} + +.mr-auto,.mx-auto { + margin-right: auto!important +} + +.mb-auto,.my-auto { + margin-bottom: auto!important +} + +.ml-auto,.mx-auto { + margin-left: auto!important +} + +@media (min-width: 576px) { + .m-sm-0 { + margin:0!important + } + + .mt-sm-0,.my-sm-0 { + margin-top: 0!important + } + + .mr-sm-0,.mx-sm-0 { + margin-right: 0!important + } + + .mb-sm-0,.my-sm-0 { + margin-bottom: 0!important + } + + .ml-sm-0,.mx-sm-0 { + margin-left: 0!important + } + + .m-sm-1 { + margin: .25rem!important + } + + .mt-sm-1,.my-sm-1 { + margin-top: .25rem!important + } + + .mr-sm-1,.mx-sm-1 { + margin-right: .25rem!important + } + + .mb-sm-1,.my-sm-1 { + margin-bottom: .25rem!important + } + + .ml-sm-1,.mx-sm-1 { + margin-left: .25rem!important + } + + .m-sm-2 { + margin: .5rem!important + } + + .mt-sm-2,.my-sm-2 { + margin-top: .5rem!important + } + + .mr-sm-2,.mx-sm-2 { + margin-right: .5rem!important + } + + .mb-sm-2,.my-sm-2 { + margin-bottom: .5rem!important + } + + .ml-sm-2,.mx-sm-2 { + margin-left: .5rem!important + } + + .m-sm-3 { + margin: 1rem!important + } + + .mt-sm-3,.my-sm-3 { + margin-top: 1rem!important + } + + .mr-sm-3,.mx-sm-3 { + margin-right: 1rem!important + } + + .mb-sm-3,.my-sm-3 { + margin-bottom: 1rem!important + } + + .ml-sm-3,.mx-sm-3 { + margin-left: 1rem!important + } + + .m-sm-4 { + margin: 1.5rem!important + } + + .mt-sm-4,.my-sm-4 { + margin-top: 1.5rem!important + } + + .mr-sm-4,.mx-sm-4 { + margin-right: 1.5rem!important + } + + .mb-sm-4,.my-sm-4 { + margin-bottom: 1.5rem!important + } + + .ml-sm-4,.mx-sm-4 { + margin-left: 1.5rem!important + } + + .m-sm-5 { + margin: 3rem!important + } + + .mt-sm-5,.my-sm-5 { + margin-top: 3rem!important + } + + .mr-sm-5,.mx-sm-5 { + margin-right: 3rem!important + } + + .mb-sm-5,.my-sm-5 { + margin-bottom: 3rem!important + } + + .ml-sm-5,.mx-sm-5 { + margin-left: 3rem!important + } + + .p-sm-0 { + padding: 0!important + } + + .pt-sm-0,.py-sm-0 { + padding-top: 0!important + } + + .pr-sm-0,.px-sm-0 { + padding-right: 0!important + } + + .pb-sm-0,.py-sm-0 { + padding-bottom: 0!important + } + + .pl-sm-0,.px-sm-0 { + padding-left: 0!important + } + + .p-sm-1 { + padding: .25rem!important + } + + .pt-sm-1,.py-sm-1 { + padding-top: .25rem!important + } + + .pr-sm-1,.px-sm-1 { + padding-right: .25rem!important + } + + .pb-sm-1,.py-sm-1 { + padding-bottom: .25rem!important + } + + .pl-sm-1,.px-sm-1 { + padding-left: .25rem!important + } + + .p-sm-2 { + padding: .5rem!important + } + + .pt-sm-2,.py-sm-2 { + padding-top: .5rem!important + } + + .pr-sm-2,.px-sm-2 { + padding-right: .5rem!important + } + + .pb-sm-2,.py-sm-2 { + padding-bottom: .5rem!important + } + + .pl-sm-2,.px-sm-2 { + padding-left: .5rem!important + } + + .p-sm-3 { + padding: 1rem!important + } + + .pt-sm-3,.py-sm-3 { + padding-top: 1rem!important + } + + .pr-sm-3,.px-sm-3 { + padding-right: 1rem!important + } + + .pb-sm-3,.py-sm-3 { + padding-bottom: 1rem!important + } + + .pl-sm-3,.px-sm-3 { + padding-left: 1rem!important + } + + .p-sm-4 { + padding: 1.5rem!important + } + + .pt-sm-4,.py-sm-4 { + padding-top: 1.5rem!important + } + + .pr-sm-4,.px-sm-4 { + padding-right: 1.5rem!important + } + + .pb-sm-4,.py-sm-4 { + padding-bottom: 1.5rem!important + } + + .pl-sm-4,.px-sm-4 { + padding-left: 1.5rem!important + } + + .p-sm-5 { + padding: 3rem!important + } + + .pt-sm-5,.py-sm-5 { + padding-top: 3rem!important + } + + .pr-sm-5,.px-sm-5 { + padding-right: 3rem!important + } + + .pb-sm-5,.py-sm-5 { + padding-bottom: 3rem!important + } + + .pl-sm-5,.px-sm-5 { + padding-left: 3rem!important + } + + .m-sm-n1 { + margin: -.25rem!important + } + + .mt-sm-n1,.my-sm-n1 { + margin-top: -.25rem!important + } + + .mr-sm-n1,.mx-sm-n1 { + margin-right: -.25rem!important + } + + .mb-sm-n1,.my-sm-n1 { + margin-bottom: -.25rem!important + } + + .ml-sm-n1,.mx-sm-n1 { + margin-left: -.25rem!important + } + + .m-sm-n2 { + margin: -.5rem!important + } + + .mt-sm-n2,.my-sm-n2 { + margin-top: -.5rem!important + } + + .mr-sm-n2,.mx-sm-n2 { + margin-right: -.5rem!important + } + + .mb-sm-n2,.my-sm-n2 { + margin-bottom: -.5rem!important + } + + .ml-sm-n2,.mx-sm-n2 { + margin-left: -.5rem!important + } + + .m-sm-n3 { + margin: -1rem!important + } + + .mt-sm-n3,.my-sm-n3 { + margin-top: -1rem!important + } + + .mr-sm-n3,.mx-sm-n3 { + margin-right: -1rem!important + } + + .mb-sm-n3,.my-sm-n3 { + margin-bottom: -1rem!important + } + + .ml-sm-n3,.mx-sm-n3 { + margin-left: -1rem!important + } + + .m-sm-n4 { + margin: -1.5rem!important + } + + .mt-sm-n4,.my-sm-n4 { + margin-top: -1.5rem!important + } + + .mr-sm-n4,.mx-sm-n4 { + margin-right: -1.5rem!important + } + + .mb-sm-n4,.my-sm-n4 { + margin-bottom: -1.5rem!important + } + + .ml-sm-n4,.mx-sm-n4 { + margin-left: -1.5rem!important + } + + .m-sm-n5 { + margin: -3rem!important + } + + .mt-sm-n5,.my-sm-n5 { + margin-top: -3rem!important + } + + .mr-sm-n5,.mx-sm-n5 { + margin-right: -3rem!important + } + + .mb-sm-n5,.my-sm-n5 { + margin-bottom: -3rem!important + } + + .ml-sm-n5,.mx-sm-n5 { + margin-left: -3rem!important + } + + .m-sm-auto { + margin: auto!important + } + + .mt-sm-auto,.my-sm-auto { + margin-top: auto!important + } + + .mr-sm-auto,.mx-sm-auto { + margin-right: auto!important + } + + .mb-sm-auto,.my-sm-auto { + margin-bottom: auto!important + } + + .ml-sm-auto,.mx-sm-auto { + margin-left: auto!important + } +} + +@media (min-width: 768px) { + .m-md-0 { + margin:0!important + } + + .mt-md-0,.my-md-0 { + margin-top: 0!important + } + + .mr-md-0,.mx-md-0 { + margin-right: 0!important + } + + .mb-md-0,.my-md-0 { + margin-bottom: 0!important + } + + .ml-md-0,.mx-md-0 { + margin-left: 0!important + } + + .m-md-1 { + margin: .25rem!important + } + + .mt-md-1,.my-md-1 { + margin-top: .25rem!important + } + + .mr-md-1,.mx-md-1 { + margin-right: .25rem!important + } + + .mb-md-1,.my-md-1 { + margin-bottom: .25rem!important + } + + .ml-md-1,.mx-md-1 { + margin-left: .25rem!important + } + + .m-md-2 { + margin: .5rem!important + } + + .mt-md-2,.my-md-2 { + margin-top: .5rem!important + } + + .mr-md-2,.mx-md-2 { + margin-right: .5rem!important + } + + .mb-md-2,.my-md-2 { + margin-bottom: .5rem!important + } + + .ml-md-2,.mx-md-2 { + margin-left: .5rem!important + } + + .m-md-3 { + margin: 1rem!important + } + + .mt-md-3,.my-md-3 { + margin-top: 1rem!important + } + + .mr-md-3,.mx-md-3 { + margin-right: 1rem!important + } + + .mb-md-3,.my-md-3 { + margin-bottom: 1rem!important + } + + .ml-md-3,.mx-md-3 { + margin-left: 1rem!important + } + + .m-md-4 { + margin: 1.5rem!important + } + + .mt-md-4,.my-md-4 { + margin-top: 1.5rem!important + } + + .mr-md-4,.mx-md-4 { + margin-right: 1.5rem!important + } + + .mb-md-4,.my-md-4 { + margin-bottom: 1.5rem!important + } + + .ml-md-4,.mx-md-4 { + margin-left: 1.5rem!important + } + + .m-md-5 { + margin: 3rem!important + } + + .mt-md-5,.my-md-5 { + margin-top: 3rem!important + } + + .mr-md-5,.mx-md-5 { + margin-right: 3rem!important + } + + .mb-md-5,.my-md-5 { + margin-bottom: 3rem!important + } + + .ml-md-5,.mx-md-5 { + margin-left: 3rem!important + } + + .p-md-0 { + padding: 0!important + } + + .pt-md-0,.py-md-0 { + padding-top: 0!important + } + + .pr-md-0,.px-md-0 { + padding-right: 0!important + } + + .pb-md-0,.py-md-0 { + padding-bottom: 0!important + } + + .pl-md-0,.px-md-0 { + padding-left: 0!important + } + + .p-md-1 { + padding: .25rem!important + } + + .pt-md-1,.py-md-1 { + padding-top: .25rem!important + } + + .pr-md-1,.px-md-1 { + padding-right: .25rem!important + } + + .pb-md-1,.py-md-1 { + padding-bottom: .25rem!important + } + + .pl-md-1,.px-md-1 { + padding-left: .25rem!important + } + + .p-md-2 { + padding: .5rem!important + } + + .pt-md-2,.py-md-2 { + padding-top: .5rem!important + } + + .pr-md-2,.px-md-2 { + padding-right: .5rem!important + } + + .pb-md-2,.py-md-2 { + padding-bottom: .5rem!important + } + + .pl-md-2,.px-md-2 { + padding-left: .5rem!important + } + + .p-md-3 { + padding: 1rem!important + } + + .pt-md-3,.py-md-3 { + padding-top: 1rem!important + } + + .pr-md-3,.px-md-3 { + padding-right: 1rem!important + } + + .pb-md-3,.py-md-3 { + padding-bottom: 1rem!important + } + + .pl-md-3,.px-md-3 { + padding-left: 1rem!important + } + + .p-md-4 { + padding: 1.5rem!important + } + + .pt-md-4,.py-md-4 { + padding-top: 1.5rem!important + } + + .pr-md-4,.px-md-4 { + padding-right: 1.5rem!important + } + + .pb-md-4,.py-md-4 { + padding-bottom: 1.5rem!important + } + + .pl-md-4,.px-md-4 { + padding-left: 1.5rem!important + } + + .p-md-5 { + padding: 3rem!important + } + + .pt-md-5,.py-md-5 { + padding-top: 3rem!important + } + + .pr-md-5,.px-md-5 { + padding-right: 3rem!important + } + + .pb-md-5,.py-md-5 { + padding-bottom: 3rem!important + } + + .pl-md-5,.px-md-5 { + padding-left: 3rem!important + } + + .m-md-n1 { + margin: -.25rem!important + } + + .mt-md-n1,.my-md-n1 { + margin-top: -.25rem!important + } + + .mr-md-n1,.mx-md-n1 { + margin-right: -.25rem!important + } + + .mb-md-n1,.my-md-n1 { + margin-bottom: -.25rem!important + } + + .ml-md-n1,.mx-md-n1 { + margin-left: -.25rem!important + } + + .m-md-n2 { + margin: -.5rem!important + } + + .mt-md-n2,.my-md-n2 { + margin-top: -.5rem!important + } + + .mr-md-n2,.mx-md-n2 { + margin-right: -.5rem!important + } + + .mb-md-n2,.my-md-n2 { + margin-bottom: -.5rem!important + } + + .ml-md-n2,.mx-md-n2 { + margin-left: -.5rem!important + } + + .m-md-n3 { + margin: -1rem!important + } + + .mt-md-n3,.my-md-n3 { + margin-top: -1rem!important + } + + .mr-md-n3,.mx-md-n3 { + margin-right: -1rem!important + } + + .mb-md-n3,.my-md-n3 { + margin-bottom: -1rem!important + } + + .ml-md-n3,.mx-md-n3 { + margin-left: -1rem!important + } + + .m-md-n4 { + margin: -1.5rem!important + } + + .mt-md-n4,.my-md-n4 { + margin-top: -1.5rem!important + } + + .mr-md-n4,.mx-md-n4 { + margin-right: -1.5rem!important + } + + .mb-md-n4,.my-md-n4 { + margin-bottom: -1.5rem!important + } + + .ml-md-n4,.mx-md-n4 { + margin-left: -1.5rem!important + } + + .m-md-n5 { + margin: -3rem!important + } + + .mt-md-n5,.my-md-n5 { + margin-top: -3rem!important + } + + .mr-md-n5,.mx-md-n5 { + margin-right: -3rem!important + } + + .mb-md-n5,.my-md-n5 { + margin-bottom: -3rem!important + } + + .ml-md-n5,.mx-md-n5 { + margin-left: -3rem!important + } + + .m-md-auto { + margin: auto!important + } + + .mt-md-auto,.my-md-auto { + margin-top: auto!important + } + + .mr-md-auto,.mx-md-auto { + margin-right: auto!important + } + + .mb-md-auto,.my-md-auto { + margin-bottom: auto!important + } + + .ml-md-auto,.mx-md-auto { + margin-left: auto!important + } +} + +@media (min-width: 992px) { + .m-lg-0 { + margin:0!important + } + + .mt-lg-0,.my-lg-0 { + margin-top: 0!important + } + + .mr-lg-0,.mx-lg-0 { + margin-right: 0!important + } + + .mb-lg-0,.my-lg-0 { + margin-bottom: 0!important + } + + .ml-lg-0,.mx-lg-0 { + margin-left: 0!important + } + + .m-lg-1 { + margin: .25rem!important + } + + .mt-lg-1,.my-lg-1 { + margin-top: .25rem!important + } + + .mr-lg-1,.mx-lg-1 { + margin-right: .25rem!important + } + + .mb-lg-1,.my-lg-1 { + margin-bottom: .25rem!important + } + + .ml-lg-1,.mx-lg-1 { + margin-left: .25rem!important + } + + .m-lg-2 { + margin: .5rem!important + } + + .mt-lg-2,.my-lg-2 { + margin-top: .5rem!important + } + + .mr-lg-2,.mx-lg-2 { + margin-right: .5rem!important + } + + .mb-lg-2,.my-lg-2 { + margin-bottom: .5rem!important + } + + .ml-lg-2,.mx-lg-2 { + margin-left: .5rem!important + } + + .m-lg-3 { + margin: 1rem!important + } + + .mt-lg-3,.my-lg-3 { + margin-top: 1rem!important + } + + .mr-lg-3,.mx-lg-3 { + margin-right: 1rem!important + } + + .mb-lg-3,.my-lg-3 { + margin-bottom: 1rem!important + } + + .ml-lg-3,.mx-lg-3 { + margin-left: 1rem!important + } + + .m-lg-4 { + margin: 1.5rem!important + } + + .mt-lg-4,.my-lg-4 { + margin-top: 1.5rem!important + } + + .mr-lg-4,.mx-lg-4 { + margin-right: 1.5rem!important + } + + .mb-lg-4,.my-lg-4 { + margin-bottom: 1.5rem!important + } + + .ml-lg-4,.mx-lg-4 { + margin-left: 1.5rem!important + } + + .m-lg-5 { + margin: 3rem!important + } + + .mt-lg-5,.my-lg-5 { + margin-top: 3rem!important + } + + .mr-lg-5,.mx-lg-5 { + margin-right: 3rem!important + } + + .mb-lg-5,.my-lg-5 { + margin-bottom: 3rem!important + } + + .ml-lg-5,.mx-lg-5 { + margin-left: 3rem!important + } + + .p-lg-0 { + padding: 0!important + } + + .pt-lg-0,.py-lg-0 { + padding-top: 0!important + } + + .pr-lg-0,.px-lg-0 { + padding-right: 0!important + } + + .pb-lg-0,.py-lg-0 { + padding-bottom: 0!important + } + + .pl-lg-0,.px-lg-0 { + padding-left: 0!important + } + + .p-lg-1 { + padding: .25rem!important + } + + .pt-lg-1,.py-lg-1 { + padding-top: .25rem!important + } + + .pr-lg-1,.px-lg-1 { + padding-right: .25rem!important + } + + .pb-lg-1,.py-lg-1 { + padding-bottom: .25rem!important + } + + .pl-lg-1,.px-lg-1 { + padding-left: .25rem!important + } + + .p-lg-2 { + padding: .5rem!important + } + + .pt-lg-2,.py-lg-2 { + padding-top: .5rem!important + } + + .pr-lg-2,.px-lg-2 { + padding-right: .5rem!important + } + + .pb-lg-2,.py-lg-2 { + padding-bottom: .5rem!important + } + + .pl-lg-2,.px-lg-2 { + padding-left: .5rem!important + } + + .p-lg-3 { + padding: 1rem!important + } + + .pt-lg-3,.py-lg-3 { + padding-top: 1rem!important + } + + .pr-lg-3,.px-lg-3 { + padding-right: 1rem!important + } + + .pb-lg-3,.py-lg-3 { + padding-bottom: 1rem!important + } + + .pl-lg-3,.px-lg-3 { + padding-left: 1rem!important + } + + .p-lg-4 { + padding: 1.5rem!important + } + + .pt-lg-4,.py-lg-4 { + padding-top: 1.5rem!important + } + + .pr-lg-4,.px-lg-4 { + padding-right: 1.5rem!important + } + + .pb-lg-4,.py-lg-4 { + padding-bottom: 1.5rem!important + } + + .pl-lg-4,.px-lg-4 { + padding-left: 1.5rem!important + } + + .p-lg-5 { + padding: 3rem!important + } + + .pt-lg-5,.py-lg-5 { + padding-top: 3rem!important + } + + .pr-lg-5,.px-lg-5 { + padding-right: 3rem!important + } + + .pb-lg-5,.py-lg-5 { + padding-bottom: 3rem!important + } + + .pl-lg-5,.px-lg-5 { + padding-left: 3rem!important + } + + .m-lg-n1 { + margin: -.25rem!important + } + + .mt-lg-n1,.my-lg-n1 { + margin-top: -.25rem!important + } + + .mr-lg-n1,.mx-lg-n1 { + margin-right: -.25rem!important + } + + .mb-lg-n1,.my-lg-n1 { + margin-bottom: -.25rem!important + } + + .ml-lg-n1,.mx-lg-n1 { + margin-left: -.25rem!important + } + + .m-lg-n2 { + margin: -.5rem!important + } + + .mt-lg-n2,.my-lg-n2 { + margin-top: -.5rem!important + } + + .mr-lg-n2,.mx-lg-n2 { + margin-right: -.5rem!important + } + + .mb-lg-n2,.my-lg-n2 { + margin-bottom: -.5rem!important + } + + .ml-lg-n2,.mx-lg-n2 { + margin-left: -.5rem!important + } + + .m-lg-n3 { + margin: -1rem!important + } + + .mt-lg-n3,.my-lg-n3 { + margin-top: -1rem!important + } + + .mr-lg-n3,.mx-lg-n3 { + margin-right: -1rem!important + } + + .mb-lg-n3,.my-lg-n3 { + margin-bottom: -1rem!important + } + + .ml-lg-n3,.mx-lg-n3 { + margin-left: -1rem!important + } + + .m-lg-n4 { + margin: -1.5rem!important + } + + .mt-lg-n4,.my-lg-n4 { + margin-top: -1.5rem!important + } + + .mr-lg-n4,.mx-lg-n4 { + margin-right: -1.5rem!important + } + + .mb-lg-n4,.my-lg-n4 { + margin-bottom: -1.5rem!important + } + + .ml-lg-n4,.mx-lg-n4 { + margin-left: -1.5rem!important + } + + .m-lg-n5 { + margin: -3rem!important + } + + .mt-lg-n5,.my-lg-n5 { + margin-top: -3rem!important + } + + .mr-lg-n5,.mx-lg-n5 { + margin-right: -3rem!important + } + + .mb-lg-n5,.my-lg-n5 { + margin-bottom: -3rem!important + } + + .ml-lg-n5,.mx-lg-n5 { + margin-left: -3rem!important + } + + .m-lg-auto { + margin: auto!important + } + + .mt-lg-auto,.my-lg-auto { + margin-top: auto!important + } + + .mr-lg-auto,.mx-lg-auto { + margin-right: auto!important + } + + .mb-lg-auto,.my-lg-auto { + margin-bottom: auto!important + } + + .ml-lg-auto,.mx-lg-auto { + margin-left: auto!important + } +} + +@media (min-width: 1200px) { + .m-xl-0 { + margin:0!important + } + + .mt-xl-0,.my-xl-0 { + margin-top: 0!important + } + + .mr-xl-0,.mx-xl-0 { + margin-right: 0!important + } + + .mb-xl-0,.my-xl-0 { + margin-bottom: 0!important + } + + .ml-xl-0,.mx-xl-0 { + margin-left: 0!important + } + + .m-xl-1 { + margin: .25rem!important + } + + .mt-xl-1,.my-xl-1 { + margin-top: .25rem!important + } + + .mr-xl-1,.mx-xl-1 { + margin-right: .25rem!important + } + + .mb-xl-1,.my-xl-1 { + margin-bottom: .25rem!important + } + + .ml-xl-1,.mx-xl-1 { + margin-left: .25rem!important + } + + .m-xl-2 { + margin: .5rem!important + } + + .mt-xl-2,.my-xl-2 { + margin-top: .5rem!important + } + + .mr-xl-2,.mx-xl-2 { + margin-right: .5rem!important + } + + .mb-xl-2,.my-xl-2 { + margin-bottom: .5rem!important + } + + .ml-xl-2,.mx-xl-2 { + margin-left: .5rem!important + } + + .m-xl-3 { + margin: 1rem!important + } + + .mt-xl-3,.my-xl-3 { + margin-top: 1rem!important + } + + .mr-xl-3,.mx-xl-3 { + margin-right: 1rem!important + } + + .mb-xl-3,.my-xl-3 { + margin-bottom: 1rem!important + } + + .ml-xl-3,.mx-xl-3 { + margin-left: 1rem!important + } + + .m-xl-4 { + margin: 1.5rem!important + } + + .mt-xl-4,.my-xl-4 { + margin-top: 1.5rem!important + } + + .mr-xl-4,.mx-xl-4 { + margin-right: 1.5rem!important + } + + .mb-xl-4,.my-xl-4 { + margin-bottom: 1.5rem!important + } + + .ml-xl-4,.mx-xl-4 { + margin-left: 1.5rem!important + } + + .m-xl-5 { + margin: 3rem!important + } + + .mt-xl-5,.my-xl-5 { + margin-top: 3rem!important + } + + .mr-xl-5,.mx-xl-5 { + margin-right: 3rem!important + } + + .mb-xl-5,.my-xl-5 { + margin-bottom: 3rem!important + } + + .ml-xl-5,.mx-xl-5 { + margin-left: 3rem!important + } + + .p-xl-0 { + padding: 0!important + } + + .pt-xl-0,.py-xl-0 { + padding-top: 0!important + } + + .pr-xl-0,.px-xl-0 { + padding-right: 0!important + } + + .pb-xl-0,.py-xl-0 { + padding-bottom: 0!important + } + + .pl-xl-0,.px-xl-0 { + padding-left: 0!important + } + + .p-xl-1 { + padding: .25rem!important + } + + .pt-xl-1,.py-xl-1 { + padding-top: .25rem!important + } + + .pr-xl-1,.px-xl-1 { + padding-right: .25rem!important + } + + .pb-xl-1,.py-xl-1 { + padding-bottom: .25rem!important + } + + .pl-xl-1,.px-xl-1 { + padding-left: .25rem!important + } + + .p-xl-2 { + padding: .5rem!important + } + + .pt-xl-2,.py-xl-2 { + padding-top: .5rem!important + } + + .pr-xl-2,.px-xl-2 { + padding-right: .5rem!important + } + + .pb-xl-2,.py-xl-2 { + padding-bottom: .5rem!important + } + + .pl-xl-2,.px-xl-2 { + padding-left: .5rem!important + } + + .p-xl-3 { + padding: 1rem!important + } + + .pt-xl-3,.py-xl-3 { + padding-top: 1rem!important + } + + .pr-xl-3,.px-xl-3 { + padding-right: 1rem!important + } + + .pb-xl-3,.py-xl-3 { + padding-bottom: 1rem!important + } + + .pl-xl-3,.px-xl-3 { + padding-left: 1rem!important + } + + .p-xl-4 { + padding: 1.5rem!important + } + + .pt-xl-4,.py-xl-4 { + padding-top: 1.5rem!important + } + + .pr-xl-4,.px-xl-4 { + padding-right: 1.5rem!important + } + + .pb-xl-4,.py-xl-4 { + padding-bottom: 1.5rem!important + } + + .pl-xl-4,.px-xl-4 { + padding-left: 1.5rem!important + } + + .p-xl-5 { + padding: 3rem!important + } + + .pt-xl-5,.py-xl-5 { + padding-top: 3rem!important + } + + .pr-xl-5,.px-xl-5 { + padding-right: 3rem!important + } + + .pb-xl-5,.py-xl-5 { + padding-bottom: 3rem!important + } + + .pl-xl-5,.px-xl-5 { + padding-left: 3rem!important + } + + .m-xl-n1 { + margin: -.25rem!important + } + + .mt-xl-n1,.my-xl-n1 { + margin-top: -.25rem!important + } + + .mr-xl-n1,.mx-xl-n1 { + margin-right: -.25rem!important + } + + .mb-xl-n1,.my-xl-n1 { + margin-bottom: -.25rem!important + } + + .ml-xl-n1,.mx-xl-n1 { + margin-left: -.25rem!important + } + + .m-xl-n2 { + margin: -.5rem!important + } + + .mt-xl-n2,.my-xl-n2 { + margin-top: -.5rem!important + } + + .mr-xl-n2,.mx-xl-n2 { + margin-right: -.5rem!important + } + + .mb-xl-n2,.my-xl-n2 { + margin-bottom: -.5rem!important + } + + .ml-xl-n2,.mx-xl-n2 { + margin-left: -.5rem!important + } + + .m-xl-n3 { + margin: -1rem!important + } + + .mt-xl-n3,.my-xl-n3 { + margin-top: -1rem!important + } + + .mr-xl-n3,.mx-xl-n3 { + margin-right: -1rem!important + } + + .mb-xl-n3,.my-xl-n3 { + margin-bottom: -1rem!important + } + + .ml-xl-n3,.mx-xl-n3 { + margin-left: -1rem!important + } + + .m-xl-n4 { + margin: -1.5rem!important + } + + .mt-xl-n4,.my-xl-n4 { + margin-top: -1.5rem!important + } + + .mr-xl-n4,.mx-xl-n4 { + margin-right: -1.5rem!important + } + + .mb-xl-n4,.my-xl-n4 { + margin-bottom: -1.5rem!important + } + + .ml-xl-n4,.mx-xl-n4 { + margin-left: -1.5rem!important + } + + .m-xl-n5 { + margin: -3rem!important + } + + .mt-xl-n5,.my-xl-n5 { + margin-top: -3rem!important + } + + .mr-xl-n5,.mx-xl-n5 { + margin-right: -3rem!important + } + + .mb-xl-n5,.my-xl-n5 { + margin-bottom: -3rem!important + } + + .ml-xl-n5,.mx-xl-n5 { + margin-left: -3rem!important + } + + .m-xl-auto { + margin: auto!important + } + + .mt-xl-auto,.my-xl-auto { + margin-top: auto!important + } + + .mr-xl-auto,.mx-xl-auto { + margin-right: auto!important + } + + .mb-xl-auto,.my-xl-auto { + margin-bottom: auto!important + } + + .ml-xl-auto,.mx-xl-auto { + margin-left: auto!important + } +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: ""; + background-color: rgba(0,0,0,0) +} + +.text-monospace { + font-family: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important +} + +.text-justify { + text-align: justify!important +} + +.text-wrap { + white-space: normal!important +} + +.text-nowrap { + white-space: nowrap!important +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.text-left { + text-align: left!important +} + +.text-right { + text-align: right!important +} + +.text-center { + text-align: center!important +} + +@media (min-width: 576px) { + .text-sm-left { + text-align:left!important + } + + .text-sm-right { + text-align: right!important + } + + .text-sm-center { + text-align: center!important + } +} + +@media (min-width: 768px) { + .text-md-left { + text-align:left!important + } + + .text-md-right { + text-align: right!important + } + + .text-md-center { + text-align: center!important + } +} + +@media (min-width: 992px) { + .text-lg-left { + text-align:left!important + } + + .text-lg-right { + text-align: right!important + } + + .text-lg-center { + text-align: center!important + } +} + +@media (min-width: 1200px) { + .text-xl-left { + text-align:left!important + } + + .text-xl-right { + text-align: right!important + } + + .text-xl-center { + text-align: center!important + } +} + +.text-lowercase { + text-transform: lowercase!important +} + +.dropdown .dropdown-menu .dropdown-header,.sidebar .sidebar-heading,.text-uppercase { + text-transform: uppercase!important +} + +.text-capitalize { + text-transform: capitalize!important +} + +.font-weight-light { + font-weight: 300!important +} + +.font-weight-lighter { + font-weight: lighter!important +} + +.font-weight-normal { + font-weight: 400!important +} + +.font-weight-bold { + font-weight: 700!important +} + +.font-weight-bolder { + font-weight: bolder!important +} + +.font-italic { + font-style: italic!important +} + +.text-white { + color: #fff!important +} + +.text-primary { + color: #4e73df!important +} + +a.text-primary:focus,a.text-primary:hover { + color: #224abe!important +} + +.text-secondary { + color: #858796!important +} + +a.text-secondary:focus,a.text-secondary:hover { + color: #60616f!important +} + +.text-success { + color: #1cc88a!important +} + +a.text-success:focus,a.text-success:hover { + color: #13855c!important +} + +.text-info { + color: #36b9cc!important +} + +a.text-info:focus,a.text-info:hover { + color: #258391!important +} + +.text-warning { + color: #f6c23e!important +} + +a.text-warning:focus,a.text-warning:hover { + color: #dda20a!important +} + +.text-danger { + color: #e74a3b!important +} + +a.text-danger:focus,a.text-danger:hover { + color: #be2617!important +} + +.text-light { + color: #f8f9fc!important +} + +a.text-light:focus,a.text-light:hover { + color: #c2cbe5!important +} + +.text-dark { + color: #5a5c69!important +} + +a.text-dark:focus,a.text-dark:hover { + color: #373840!important +} + +.text-body { + color: #858796!important +} + +.text-muted { + color: #858796!important +} + +.text-black-50 { + color: rgba(0,0,0,.5)!important +} + +.text-white-50 { + color: rgba(255,255,255,.5)!important +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0 +} + +.text-decoration-none { + text-decoration: none!important +} + +.text-break { + word-break: break-word!important; + word-wrap: break-word!important +} + +.text-reset { + color: inherit!important +} + +.visible { + visibility: visible!important +} + +.invisible { + visibility: hidden!important +} + +@media print { + *,::after,::before { + text-shadow: none!important; + box-shadow: none!important + } + + a:not(.btn) { + text-decoration: underline + } + + abbr[title]::after { + content: " (" attr(title) ")" + } + + pre { + white-space: pre-wrap!important + } + + blockquote,pre { + border: 1px solid #b7b9cc; + page-break-inside: avoid + } + + thead { + display: table-header-group + } + + img,tr { + page-break-inside: avoid + } + + h2,h3,p { + orphans: 3; + widows: 3 + } + + h2,h3 { + page-break-after: avoid + } + + @page { + size: a3 + } + + body { + min-width: 992px!important + } + + .container { + min-width: 992px!important + } + + .navbar { + display: none + } + + .badge { + border: 1px solid #000 + } + + .table { + border-collapse: collapse!important + } + + .table td,.table th { + background-color: #fff!important + } + + .table-bordered td,.table-bordered th { + border: 1px solid #dddfeb!important + } + + .table-dark { + color: inherit + } + + .table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th { + border-color: #e3e6f0 + } + + .table .thead-dark th { + color: inherit; + border-color: #e3e6f0 + } +} + +html { + position: relative; + min-height: 100% +} + +body { + height: 100% +} + +a:focus { + outline: 0 +} + +#wrapper { + display: flex +} + +#wrapper #content-wrapper { + background-color: #f8f9fc; + width: 100%; + overflow-x: hidden +} + +#wrapper #content-wrapper #content { + flex: 1 0 auto +} + +.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl { + padding-left: 1.5rem; + padding-right: 1.5rem +} + +.scroll-to-top { + position: fixed; + right: 1rem; + bottom: 1rem; + display: none; + width: 2.75rem; + height: 2.75rem; + text-align: center; + color: #fff; + background: rgba(90,92,105,.5); + line-height: 46px +} + +.scroll-to-top:focus,.scroll-to-top:hover { + color: #fff +} + +.scroll-to-top:hover { + background: #5a5c69 +} + +.scroll-to-top i { + font-weight: 800 +} + +@-webkit-keyframes growIn { + 0% { + transform: scale(.9); + opacity: 0 + } + + 100% { + transform: scale(1); + opacity: 1 + } +} + +@keyframes growIn { + 0% { + transform: scale(.9); + opacity: 0 + } + + 100% { + transform: scale(1); + opacity: 1 + } +} + +.animated--grow-in,.sidebar .nav-item .collapse { + -webkit-animation-name: growIn; + animation-name: growIn; + -webkit-animation-duration: .2s; + animation-duration: .2s; + -webkit-animation-timing-function: transform cubic-bezier(.18,1.25,.4,1),opacity cubic-bezier(0,1,.4,1); + animation-timing-function: transform cubic-bezier(.18,1.25,.4,1),opacity cubic-bezier(0,1,.4,1) +} + +@-webkit-keyframes fadeIn { + 0% { + opacity: 0 + } + + 100% { + opacity: 1 + } +} + +@keyframes fadeIn { + 0% { + opacity: 0 + } + + 100% { + opacity: 1 + } +} + +.animated--fade-in { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; + -webkit-animation-duration: .2s; + animation-duration: .2s; + -webkit-animation-timing-function: opacity cubic-bezier(0,1,.4,1); + animation-timing-function: opacity cubic-bezier(0,1,.4,1) +} + +.bg-gradient-primary { + background-color: #4e73df; + background-image: linear-gradient(180deg,#4e73df 10%,#224abe 100%); + background-size: cover +} + +.bg-gradient-secondary { + background-color: #858796; + background-image: linear-gradient(180deg,#858796 10%,#60616f 100%); + background-size: cover +} + +.bg-gradient-success { + background-color: #1cc88a; + background-image: linear-gradient(180deg,#1cc88a 10%,#13855c 100%); + background-size: cover +} + +.bg-gradient-info { + background-color: #36b9cc; + background-image: linear-gradient(180deg,#36b9cc 10%,#258391 100%); + background-size: cover +} + +.bg-gradient-warning { + background-color: #f6c23e; + background-image: linear-gradient(180deg,#f6c23e 10%,#dda20a 100%); + background-size: cover +} + +.bg-gradient-danger { + background-color: #e74a3b; + background-image: linear-gradient(180deg,#e74a3b 10%,#be2617 100%); + background-size: cover +} + +.bg-gradient-light { + background-color: #f8f9fc; + background-image: linear-gradient(180deg,#f8f9fc 10%,#c2cbe5 100%); + background-size: cover +} + +.bg-gradient-dark { + background-color: #5a5c69; + background-image: linear-gradient(180deg,#5a5c69 10%,#373840 100%); + background-size: cover +} + +.bg-gray-100 { + background-color: #f8f9fc!important +} + +.bg-gray-200 { + background-color: #eaecf4!important +} + +.bg-gray-300 { + background-color: #dddfeb!important +} + +.bg-gray-400 { + background-color: #d1d3e2!important +} + +.bg-gray-500 { + background-color: #b7b9cc!important +} + +.bg-gray-600 { + background-color: #858796!important +} + +.bg-gray-700 { + background-color: #6e707e!important +} + +.bg-gray-800 { + background-color: #5a5c69!important +} + +.bg-gray-900 { + background-color: #3a3b45!important +} + +.o-hidden { + overflow: hidden!important +} + +.text-xs { + font-size: .7rem +} + +.text-lg { + font-size: 1.2rem +} + +.text-gray-100 { + color: #f8f9fc!important +} + +.text-gray-200 { + color: #eaecf4!important +} + +.text-gray-300 { + color: #dddfeb!important +} + +.text-gray-400 { + color: #d1d3e2!important +} + +.text-gray-500 { + color: #b7b9cc!important +} + +.text-gray-600 { + color: #858796!important +} + +.text-gray-700 { + color: #6e707e!important +} + +.text-gray-800 { + color: #5a5c69!important +} + +.text-gray-900 { + color: #3a3b45!important +} + +.icon-circle { + height: 2.5rem; + width: 2.5rem; + border-radius: 100%; + display: flex; + align-items: center; + justify-content: center +} + +.border-left-primary { + border-left: .25rem solid #4e73df!important +} + +.border-bottom-primary { + border-bottom: .25rem solid #4e73df!important +} + +.border-left-secondary { + border-left: .25rem solid #858796!important +} + +.border-bottom-secondary { + border-bottom: .25rem solid #858796!important +} + +.border-left-success { + border-left: .25rem solid #1cc88a!important +} + +.border-bottom-success { + border-bottom: .25rem solid #1cc88a!important +} + +.border-left-info { + border-left: .25rem solid #36b9cc!important +} + +.border-bottom-info { + border-bottom: .25rem solid #36b9cc!important +} + +.border-left-warning { + border-left: .25rem solid #f6c23e!important +} + +.border-bottom-warning { + border-bottom: .25rem solid #f6c23e!important +} + +.border-left-danger { + border-left: .25rem solid #e74a3b!important +} + +.border-bottom-danger { + border-bottom: .25rem solid #e74a3b!important +} + +.border-left-light { + border-left: .25rem solid #f8f9fc!important +} + +.border-bottom-light { + border-bottom: .25rem solid #f8f9fc!important +} + +.border-left-dark { + border-left: .25rem solid #5a5c69!important +} + +.border-bottom-dark { + border-bottom: .25rem solid #5a5c69!important +} + +.progress-sm { + height: .5rem +} + +.rotate-15 { + transform: rotate(15deg) +} + +.rotate-n-15 { + transform: rotate(-15deg) +} + +.dropdown .dropdown-menu { + font-size: .85rem +} + +.dropdown .dropdown-menu .dropdown-header { + font-weight: 800; + font-size: .65rem; + color: #b7b9cc +} + +.dropdown.no-arrow .dropdown-toggle::after { + display: none +} + +.sidebar .nav-item.dropdown .dropdown-toggle::after,.topbar .nav-item.dropdown .dropdown-toggle::after { + width: 1rem; + text-align: center; + float: right; + vertical-align: 0; + border: 0; + font-weight: 900; + content: '\f105'; + font-family: 'Font Awesome 5 Free' +} + +.sidebar .nav-item.dropdown.show .dropdown-toggle::after,.topbar .nav-item.dropdown.show .dropdown-toggle::after { + content: '\f107' +} + +.sidebar .nav-item .nav-link,.topbar .nav-item .nav-link { + position: relative +} + +.sidebar .nav-item .nav-link .badge-counter,.topbar .nav-item .nav-link .badge-counter { + position: absolute; + transform: scale(.7); + transform-origin: top right; + right: .25rem; + margin-top: -.25rem +} + +.sidebar .nav-item .nav-link .img-profile,.topbar .nav-item .nav-link .img-profile { + height: 2rem; + width: 2rem +} + +.topbar { + height: 4.375rem +} + +.topbar #sidebarToggleTop { + height: 2.5rem; + width: 2.5rem +} + +.topbar #sidebarToggleTop:hover { + background-color: #eaecf4 +} + +.topbar #sidebarToggleTop:active { + background-color: #dddfeb +} + +.topbar .navbar-search { + width: 25rem +} + +.topbar .navbar-search input { + font-size: .85rem; + height: auto +} + +.topbar .topbar-divider { + width: 0; + border-right: 1px solid #e3e6f0; + height: calc(4.375rem - 2rem); + margin: auto 1rem +} + +.topbar .nav-item .nav-link { + height: 4.375rem; + display: flex; + align-items: center; + padding: 0 .75rem +} + +.topbar .nav-item .nav-link:focus { + outline: 0 +} + +.topbar .nav-item:focus { + outline: 0 +} + +.topbar .dropdown { + position: static +} + +.topbar .dropdown .dropdown-menu { + width: calc(100% - 1.5rem); + right: .75rem +} + +.topbar .dropdown-list { + padding: 0; + border: none; + overflow: hidden +} + +.topbar .dropdown-list .dropdown-header { + background-color: #4e73df; + border: 1px solid #4e73df; + padding-top: .75rem; + padding-bottom: .75rem; + color: #fff +} + +.topbar .dropdown-list .dropdown-item { + white-space: normal; + padding-top: .5rem; + padding-bottom: .5rem; + border-left: 1px solid #e3e6f0; + border-right: 1px solid #e3e6f0; + border-bottom: 1px solid #e3e6f0; + line-height: 1.3rem +} + +.topbar .dropdown-list .dropdown-item .dropdown-list-image { + position: relative; + height: 2.5rem; + width: 2.5rem +} + +.topbar .dropdown-list .dropdown-item .dropdown-list-image img { + height: 2.5rem; + width: 2.5rem +} + +.topbar .dropdown-list .dropdown-item .dropdown-list-image .status-indicator { + background-color: #eaecf4; + height: .75rem; + width: .75rem; + border-radius: 100%; + position: absolute; + bottom: 0; + right: 0; + border: .125rem solid #fff +} + +.topbar .dropdown-list .dropdown-item .text-truncate { + max-width: 10rem +} + +.topbar .dropdown-list .dropdown-item:active { + background-color: #eaecf4; + color: #3a3b45 +} + +@media (min-width: 576px) { + .topbar .dropdown { + position:relative + } + + .topbar .dropdown .dropdown-menu { + width: auto; + right: 0 + } + + .topbar .dropdown-list { + width: 20rem!important + } + + .topbar .dropdown-list .dropdown-item .text-truncate { + max-width: 13.375rem + } +} + +.topbar.navbar-dark .navbar-nav .nav-item .nav-link { + color: rgba(255,255,255,.8) +} + +.topbar.navbar-dark .navbar-nav .nav-item .nav-link:hover { + color: #fff +} + +.topbar.navbar-dark .navbar-nav .nav-item .nav-link:active { + color: #fff +} + +.topbar.navbar-light .navbar-nav .nav-item .nav-link { + color: #d1d3e2 +} + +.topbar.navbar-light .navbar-nav .nav-item .nav-link:hover { + color: #b7b9cc +} + +.topbar.navbar-light .navbar-nav .nav-item .nav-link:active { + color: #858796 +} + +.sidebar { + width: 6.5rem; + min-height: 100vh +} + +.sidebar .nav-item { + position: relative +} + +.sidebar .nav-item:last-child { + margin-bottom: 1rem +} + +.sidebar .nav-item .nav-link { + text-align: center; + padding: .75rem 1rem; + width: 6.5rem +} + +.sidebar .nav-item .nav-link span { + font-size: .65rem; + display: block +} + +.sidebar .nav-item.active .nav-link { + font-weight: 700 +} + +.sidebar .nav-item .collapse { + position: absolute; + left: calc(6.5rem + 1.5rem / 2); + z-index: 1; + top: 2px +} + +.sidebar .nav-item .collapse .collapse-inner { + border-radius: .35rem; + box-shadow: 0 .15rem 1.75rem 0 rgba(58,59,69,.15) +} + +.sidebar .nav-item .collapsing { + display: none; + transition: none +} + +.sidebar .nav-item .collapse .collapse-inner,.sidebar .nav-item .collapsing .collapse-inner { + padding: .5rem 0; + min-width: 10rem; + font-size: .85rem; + margin: 0 0 1rem 0 +} + +.sidebar .nav-item .collapse .collapse-inner .collapse-header,.sidebar .nav-item .collapsing .collapse-inner .collapse-header { + margin: 0; + white-space: nowrap; + padding: .5rem 1.5rem; + text-transform: uppercase; + font-weight: 800; + font-size: .65rem; + color: #b7b9cc +} + +.sidebar .nav-item .collapse .collapse-inner .collapse-item,.sidebar .nav-item .collapsing .collapse-inner .collapse-item { + padding: .5rem 1rem; + margin: 0 .5rem; + display: block; + color: #3a3b45; + text-decoration: none; + border-radius: .35rem; + white-space: nowrap +} + +.sidebar .nav-item .collapse .collapse-inner .collapse-item:hover,.sidebar .nav-item .collapsing .collapse-inner .collapse-item:hover { + background-color: #eaecf4 +} + +.sidebar .nav-item .collapse .collapse-inner .collapse-item:active,.sidebar .nav-item .collapsing .collapse-inner .collapse-item:active { + background-color: #dddfeb +} + +.sidebar .nav-item .collapse .collapse-inner .collapse-item.active,.sidebar .nav-item .collapsing .collapse-inner .collapse-item.active { + color: #4e73df; + font-weight: 700 +} + +.sidebar #sidebarToggle { + width: 2.5rem; + height: 2.5rem; + text-align: center; + margin-bottom: 1rem; + cursor: pointer +} + +.sidebar #sidebarToggle::after { + font-weight: 900; + content: '\f104'; + font-family: 'Font Awesome 5 Free'; + margin-right: .1rem +} + +.sidebar #sidebarToggle:hover { + text-decoration: none +} + +.sidebar #sidebarToggle:focus { + outline: 0 +} + +.sidebar.toggled { + width: 0!important; + overflow: hidden +} + +.sidebar.toggled #sidebarToggle::after { + content: '\f105'; + font-family: 'Font Awesome 5 Free'; + margin-left: .25rem +} + +.sidebar.toggled .sidebar-card { + display: none +} + +.sidebar .sidebar-brand { + height: 4.375rem; + text-decoration: none; + font-size: 1rem; + font-weight: 800; + padding: 1.5rem 1rem; + text-align: center; + text-transform: uppercase; + letter-spacing: .05rem; + z-index: 1 +} + +.sidebar .sidebar-brand .sidebar-brand-icon i { + font-size: 2rem +} + +.sidebar .sidebar-brand .sidebar-brand-text { + display: none +} + +.sidebar hr.sidebar-divider { + margin: 0 1rem 1rem +} + +.sidebar .sidebar-heading { + text-align: center; + padding: 0 1rem; + font-weight: 800; + font-size: .65rem +} + +.sidebar .sidebar-card { + display: flex; + flex-direction: column; + align-items: center; + font-size: .875rem; + border-radius: .35rem; + color: rgba(255,255,255,.8); + margin-left: 1rem; + margin-right: 1rem; + margin-bottom: 1rem; + padding: 1rem; + background-color: rgba(0,0,0,.1) +} + +.sidebar .sidebar-card .sidebar-card-illustration { + height: 3rem; + display: block +} + +.sidebar .sidebar-card .sidebar-card-title { + font-weight: 700 +} + +.sidebar .sidebar-card p { + font-size: .75rem; + color: rgba(255,255,255,.5) +} + +@media (min-width: 768px) { + .sidebar { + width:14rem!important + } + + .sidebar .nav-item .collapse { + position: relative; + left: 0; + z-index: 1; + top: 0; + -webkit-animation: none; + animation: none + } + + .sidebar .nav-item .collapse .collapse-inner { + border-radius: 0; + box-shadow: none + } + + .sidebar .nav-item .collapsing { + display: block; + transition: height .15s ease + } + + .sidebar .nav-item .collapse,.sidebar .nav-item .collapsing { + margin: 0 1rem + } + + .sidebar .nav-item .nav-link { + display: block; + width: 100%; + text-align: left; + padding: 1rem; + width: 14rem + } + + .sidebar .nav-item .nav-link i { + font-size: .85rem; + margin-right: .25rem + } + + .sidebar .nav-item .nav-link span { + font-size: .85rem; + display: inline + } + + .sidebar .nav-item .nav-link[data-toggle=collapse]::after { + width: 1rem; + text-align: center; + float: right; + vertical-align: 0; + border: 0; + font-weight: 900; + content: '\f107'; + font-family: 'Font Awesome 5 Free' + } + + .sidebar .nav-item .nav-link[data-toggle=collapse].collapsed::after { + content: '\f105' + } + + .sidebar .sidebar-brand .sidebar-brand-icon i { + font-size: 2rem + } + + .sidebar .sidebar-brand .sidebar-brand-text { + display: inline + } + + .sidebar .sidebar-heading { + text-align: left + } + + .sidebar.toggled { + overflow: visible; + width: 6.5rem!important + } + + .sidebar.toggled .nav-item .collapse { + position: absolute; + left: calc(6.5rem + 1.5rem / 2); + z-index: 1; + top: 2px; + -webkit-animation-name: growIn; + animation-name: growIn; + -webkit-animation-duration: .2s; + animation-duration: .2s; + -webkit-animation-timing-function: transform cubic-bezier(.18,1.25,.4,1),opacity cubic-bezier(0,1,.4,1); + animation-timing-function: transform cubic-bezier(.18,1.25,.4,1),opacity cubic-bezier(0,1,.4,1) + } + + .sidebar.toggled .nav-item .collapse .collapse-inner { + box-shadow: 0 .15rem 1.75rem 0 rgba(58,59,69,.15); + border-radius: .35rem + } + + .sidebar.toggled .nav-item .collapsing { + display: none; + transition: none + } + + .sidebar.toggled .nav-item .collapse,.sidebar.toggled .nav-item .collapsing { + margin: 0 + } + + .sidebar.toggled .nav-item:last-child { + margin-bottom: 1rem + } + + .sidebar.toggled .nav-item .nav-link { + text-align: center; + padding: .75rem 1rem; + width: 6.5rem + } + + .sidebar.toggled .nav-item .nav-link span { + font-size: .65rem; + display: block + } + + .sidebar.toggled .nav-item .nav-link i { + margin-right: 0 + } + + .sidebar.toggled .nav-item .nav-link[data-toggle=collapse]::after { + display: none + } + + .sidebar.toggled .sidebar-brand .sidebar-brand-icon i { + font-size: 2rem + } + + .sidebar.toggled .sidebar-brand .sidebar-brand-text { + display: none + } + + .sidebar.toggled .sidebar-heading { + text-align: center + } +} + +.sidebar-light .sidebar-brand { + color: #6e707e +} + +.sidebar-light hr.sidebar-divider { + border-top: 1px solid #eaecf4 +} + +.sidebar-light .sidebar-heading { + color: #b7b9cc +} + +.sidebar-light .nav-item .nav-link { + color: #858796 +} + +.sidebar-light .nav-item .nav-link i { + color: #d1d3e2 +} + +.sidebar-light .nav-item .nav-link:active,.sidebar-light .nav-item .nav-link:focus,.sidebar-light .nav-item .nav-link:hover { + color: #6e707e +} + +.sidebar-light .nav-item .nav-link:active i,.sidebar-light .nav-item .nav-link:focus i,.sidebar-light .nav-item .nav-link:hover i { + color: #6e707e +} + +.sidebar-light .nav-item .nav-link[data-toggle=collapse]::after { + color: #b7b9cc +} + +.sidebar-light .nav-item.active .nav-link { + color: #6e707e +} + +.sidebar-light .nav-item.active .nav-link i { + color: #6e707e +} + +.sidebar-light #sidebarToggle { + background-color: #eaecf4 +} + +.sidebar-light #sidebarToggle::after { + color: #b7b9cc +} + +.sidebar-light #sidebarToggle:hover { + background-color: #dddfeb +} + +.sidebar-dark .sidebar-brand { + color: #fff +} + +.sidebar-dark hr.sidebar-divider { + border-top: 1px solid rgba(255,255,255,.15) +} + +.sidebar-dark .sidebar-heading { + color: rgba(255,255,255,.4) +} + +.sidebar-dark .nav-item .nav-link { + color: rgba(255,255,255,.8) +} + +.sidebar-dark .nav-item .nav-link i { + color: rgba(255,255,255,.3) +} + +.sidebar-dark .nav-item .nav-link:active,.sidebar-dark .nav-item .nav-link:focus,.sidebar-dark .nav-item .nav-link:hover { + color: #fff +} + +.sidebar-dark .nav-item .nav-link:active i,.sidebar-dark .nav-item .nav-link:focus i,.sidebar-dark .nav-item .nav-link:hover i { + color: #fff +} + +.sidebar-dark .nav-item .nav-link[data-toggle=collapse]::after { + color: rgba(255,255,255,.5) +} + +.sidebar-dark .nav-item.active .nav-link { + color: #fff +} + +.sidebar-dark .nav-item.active .nav-link i { + color: #fff +} + +.sidebar-dark #sidebarToggle { + background-color: rgba(255,255,255,.2) +} + +.sidebar-dark #sidebarToggle::after { + color: rgba(255,255,255,.5) +} + +.sidebar-dark #sidebarToggle:hover { + background-color: rgba(255,255,255,.25) +} + +.sidebar-dark.toggled #sidebarToggle::after { + color: rgba(255,255,255,.5) +} + +.btn-circle { + border-radius: 100%; + height: 2.5rem; + width: 2.5rem; + font-size: 1rem; + display: inline-flex; + align-items: center; + justify-content: center +} + +.btn-circle.btn-sm,.btn-group-sm>.btn-circle.btn { + height: 1.8rem; + width: 1.8rem; + font-size: .75rem +} + +.btn-circle.btn-lg,.btn-group-lg>.btn-circle.btn { + height: 3.5rem; + width: 3.5rem; + font-size: 1.35rem +} + +.btn-icon-split { + padding: 0; + overflow: hidden; + display: inline-flex; + align-items: stretch; + justify-content: center +} + +.btn-icon-split .icon { + background: rgba(0,0,0,.15); + display: inline-block; + padding: .375rem .75rem +} + +.btn-icon-split .text { + display: inline-block; + padding: .375rem .75rem +} + +.btn-group-sm>.btn-icon-split.btn .icon,.btn-icon-split.btn-sm .icon { + padding: .25rem .5rem +} + +.btn-group-sm>.btn-icon-split.btn .text,.btn-icon-split.btn-sm .text { + padding: .25rem .5rem +} + +.btn-group-lg>.btn-icon-split.btn .icon,.btn-icon-split.btn-lg .icon { + padding: .5rem 1rem +} + +.btn-group-lg>.btn-icon-split.btn .text,.btn-icon-split.btn-lg .text { + padding: .5rem 1rem +} + +.card .card-header .dropdown { + line-height: 1 +} + +.card .card-header .dropdown .dropdown-menu { + line-height: 1.5 +} + +.card .card-header[data-toggle=collapse] { + text-decoration: none; + position: relative; + padding: .75rem 3.25rem .75rem 1.25rem +} + +.card .card-header[data-toggle=collapse]::after { + position: absolute; + right: 0; + top: 0; + padding-right: 1.725rem; + line-height: 51px; + font-weight: 900; + content: '\f107'; + font-family: 'Font Awesome 5 Free'; + color: #d1d3e2 +} + +.card .card-header[data-toggle=collapse].collapsed { + border-radius: .35rem +} + +.card .card-header[data-toggle=collapse].collapsed::after { + content: '\f105' +} + +.chart-area { + position: relative; + height: 10rem; + width: 100% +} + +@media (min-width: 768px) { + .chart-area { + height:20rem + } +} + +.chart-bar { + position: relative; + height: 10rem; + width: 100% +} + +@media (min-width: 768px) { + .chart-bar { + height:20rem + } +} + +.chart-pie { + position: relative; + height: 15rem; + width: 100% +} + +@media (min-width: 768px) { + .chart-pie { + height:calc(20rem - 43px)!important + } +} + +.bg-login-image { + background: url(https://source.unsplash.com/K4mSJ7kc0As/600x800); + background-position: center; + background-size: cover +} + +.bg-register-image { + background: url(https://source.unsplash.com/Mv9hjnEUHR4/600x800); + background-position: center; + background-size: cover +} + +.bg-password-image { + background: url(https://source.unsplash.com/oWTW-jNGl9I/600x800); + background-position: center; + background-size: cover +} + +form.user .custom-checkbox.small label { + line-height: 1.5rem +} + +form.user .form-control-user { + font-size: .9rem; + border-radius: 10rem; + padding: 1.5rem 1rem +} + +form.user .btn-user { + font-size: .8rem; + border-radius: 10rem; + padding: .75rem 1rem +} + +.btn-google { + color: #fff; + background-color: #ea4335; + border-color: #fff +} + +.btn-google:hover { + color: #fff; + background-color: #e12717; + border-color: #e6e6e6 +} + +.btn-google.focus,.btn-google:focus { + color: #fff; + background-color: #e12717; + border-color: #e6e6e6; + box-shadow: 0 0 0 .2rem rgba(255,255,255,.5) +} + +.btn-google.disabled,.btn-google:disabled { + color: #fff; + background-color: #ea4335; + border-color: #fff +} + +.btn-google:not(:disabled):not(.disabled).active,.btn-google:not(:disabled):not(.disabled):active,.show>.btn-google.dropdown-toggle { + color: #fff; + background-color: #d62516; + border-color: #dfdfdf +} + +.btn-google:not(:disabled):not(.disabled).active:focus,.btn-google:not(:disabled):not(.disabled):active:focus,.show>.btn-google.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(255,255,255,.5) +} + +.btn-facebook { + color: #fff; + background-color: #3b5998; + border-color: #fff +} + +.btn-facebook:hover { + color: #fff; + background-color: #30497c; + border-color: #e6e6e6 +} + +.btn-facebook.focus,.btn-facebook:focus { + color: #fff; + background-color: #30497c; + border-color: #e6e6e6; + box-shadow: 0 0 0 .2rem rgba(255,255,255,.5) +} + +.btn-facebook.disabled,.btn-facebook:disabled { + color: #fff; + background-color: #3b5998; + border-color: #fff +} + +.btn-facebook:not(:disabled):not(.disabled).active,.btn-facebook:not(:disabled):not(.disabled):active,.show>.btn-facebook.dropdown-toggle { + color: #fff; + background-color: #2d4373; + border-color: #dfdfdf +} + +.btn-facebook:not(:disabled):not(.disabled).active:focus,.btn-facebook:not(:disabled):not(.disabled):active:focus,.show>.btn-facebook.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(255,255,255,.5) +} + +.error { + color: #5a5c69; + font-size: 7rem; + position: relative; + line-height: 1; + width: 12.5rem +} + +@-webkit-keyframes noise-anim { + 0% { + clip: rect(49px,9999px,40px,0) + } + + 5% { + clip: rect(75px,9999px,72px,0) + } + + 10% { + clip: rect(97px,9999px,93px,0) + } + + 15% { + clip: rect(15px,9999px,9px,0) + } + + 20% { + clip: rect(14px,9999px,92px,0) + } + + 25% { + clip: rect(18px,9999px,94px,0) + } + + 30% { + clip: rect(17px,9999px,20px,0) + } + + 35% { + clip: rect(71px,9999px,59px,0) + } + + 40% { + clip: rect(42px,9999px,84px,0) + } + + 45% { + clip: rect(56px,9999px,25px,0) + } + + 50% { + clip: rect(46px,9999px,14px,0) + } + + 55% { + clip: rect(47px,9999px,1px,0) + } + + 60% { + clip: rect(64px,9999px,58px,0) + } + + 65% { + clip: rect(89px,9999px,92px,0) + } + + 70% { + clip: rect(56px,9999px,39px,0) + } + + 75% { + clip: rect(80px,9999px,71px,0) + } + + 80% { + clip: rect(8px,9999px,13px,0) + } + + 85% { + clip: rect(66px,9999px,68px,0) + } + + 90% { + clip: rect(68px,9999px,4px,0) + } + + 95% { + clip: rect(56px,9999px,14px,0) + } + + 100% { + clip: rect(28px,9999px,53px,0) + } +} + +@keyframes noise-anim { + 0% { + clip: rect(49px,9999px,40px,0) + } + + 5% { + clip: rect(75px,9999px,72px,0) + } + + 10% { + clip: rect(97px,9999px,93px,0) + } + + 15% { + clip: rect(15px,9999px,9px,0) + } + + 20% { + clip: rect(14px,9999px,92px,0) + } + + 25% { + clip: rect(18px,9999px,94px,0) + } + + 30% { + clip: rect(17px,9999px,20px,0) + } + + 35% { + clip: rect(71px,9999px,59px,0) + } + + 40% { + clip: rect(42px,9999px,84px,0) + } + + 45% { + clip: rect(56px,9999px,25px,0) + } + + 50% { + clip: rect(46px,9999px,14px,0) + } + + 55% { + clip: rect(47px,9999px,1px,0) + } + + 60% { + clip: rect(64px,9999px,58px,0) + } + + 65% { + clip: rect(89px,9999px,92px,0) + } + + 70% { + clip: rect(56px,9999px,39px,0) + } + + 75% { + clip: rect(80px,9999px,71px,0) + } + + 80% { + clip: rect(8px,9999px,13px,0) + } + + 85% { + clip: rect(66px,9999px,68px,0) + } + + 90% { + clip: rect(68px,9999px,4px,0) + } + + 95% { + clip: rect(56px,9999px,14px,0) + } + + 100% { + clip: rect(28px,9999px,53px,0) + } +} + +.error:after { + content: attr(data-text); + position: absolute; + left: 2px; + text-shadow: -1px 0 #e74a3b; + top: 0; + color: #5a5c69; + background: #f8f9fc; + overflow: hidden; + clip: rect(0,900px,0,0); + animation: noise-anim 2s infinite linear alternate-reverse +} + +@-webkit-keyframes noise-anim-2 { + 0% { + clip: rect(16px,9999px,10px,0) + } + + 5% { + clip: rect(22px,9999px,29px,0) + } + + 10% { + clip: rect(6px,9999px,68px,0) + } + + 15% { + clip: rect(85px,9999px,95px,0) + } + + 20% { + clip: rect(65px,9999px,91px,0) + } + + 25% { + clip: rect(93px,9999px,68px,0) + } + + 30% { + clip: rect(10px,9999px,27px,0) + } + + 35% { + clip: rect(37px,9999px,25px,0) + } + + 40% { + clip: rect(12px,9999px,23px,0) + } + + 45% { + clip: rect(40px,9999px,18px,0) + } + + 50% { + clip: rect(19px,9999px,71px,0) + } + + 55% { + clip: rect(2px,9999px,35px,0) + } + + 60% { + clip: rect(16px,9999px,69px,0) + } + + 65% { + clip: rect(8px,9999px,65px,0) + } + + 70% { + clip: rect(30px,9999px,57px,0) + } + + 75% { + clip: rect(14px,9999px,4px,0) + } + + 80% { + clip: rect(39px,9999px,30px,0) + } + + 85% { + clip: rect(22px,9999px,35px,0) + } + + 90% { + clip: rect(58px,9999px,71px,0) + } + + 95% { + clip: rect(34px,9999px,90px,0) + } + + 100% { + clip: rect(67px,9999px,68px,0) + } +} + +@keyframes noise-anim-2 { + 0% { + clip: rect(16px,9999px,10px,0) + } + + 5% { + clip: rect(22px,9999px,29px,0) + } + + 10% { + clip: rect(6px,9999px,68px,0) + } + + 15% { + clip: rect(85px,9999px,95px,0) + } + + 20% { + clip: rect(65px,9999px,91px,0) + } + + 25% { + clip: rect(93px,9999px,68px,0) + } + + 30% { + clip: rect(10px,9999px,27px,0) + } + + 35% { + clip: rect(37px,9999px,25px,0) + } + + 40% { + clip: rect(12px,9999px,23px,0) + } + + 45% { + clip: rect(40px,9999px,18px,0) + } + + 50% { + clip: rect(19px,9999px,71px,0) + } + + 55% { + clip: rect(2px,9999px,35px,0) + } + + 60% { + clip: rect(16px,9999px,69px,0) + } + + 65% { + clip: rect(8px,9999px,65px,0) + } + + 70% { + clip: rect(30px,9999px,57px,0) + } + + 75% { + clip: rect(14px,9999px,4px,0) + } + + 80% { + clip: rect(39px,9999px,30px,0) + } + + 85% { + clip: rect(22px,9999px,35px,0) + } + + 90% { + clip: rect(58px,9999px,71px,0) + } + + 95% { + clip: rect(34px,9999px,90px,0) + } + + 100% { + clip: rect(67px,9999px,68px,0) + } +} + +.error:before { + content: attr(data-text); + position: absolute; + left: -2px; + text-shadow: 1px 0 #4e73df; + top: 0; + color: #5a5c69; + background: #f8f9fc; + overflow: hidden; + clip: rect(0,900px,0,0); + animation: noise-anim-2 3s infinite linear alternate-reverse +} + +footer.sticky-footer { + padding: 2rem 0; + flex-shrink: 0 +} + +footer.sticky-footer .copyright { + line-height: 1; + font-size: .8rem +} + +body.sidebar-toggled footer.sticky-footer { + width: 100% +} From edde250ae56658c0c9a74725864bda17f5ddaff6 Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Mon, 27 Feb 2023 23:12:32 -0500 Subject: [PATCH 08/41] Update index.html --- HiFiViews/index.html | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/HiFiViews/index.html b/HiFiViews/index.html index e4d5475..dbf3f7b 100644 --- a/HiFiViews/index.html +++ b/HiFiViews/index.html @@ -33,30 +33,30 @@
@@ -79,17 +81,29 @@
-
-

Design Lab 2.0!

+
+

Design Lab 2.0!

+

+ Welcome to the Design Lab Website!
+ You can schedule a print, look over the print schedule, look into the Hall of Fame, or send + a SVG off to General Rose. +

+
+ Log in here to get Access + +
+
+ + +
  • + +
    Hall of Fame
    +
    +
  • + + +
    +
    + Admined By General Rose +
    + + + +
    +
    +
    +
    +

    Print Submission!

    +
    + +

    Please remember the rules for creating a print +

    +
      +
    • Slice With Prusa + Slicer --- Make Sure you are slicing for the right printer. It should be the third + option on the right
    • +
    • Save your project + (3MF/STL) to Google Drive
    • +
    • Reserve the right + amount of time
    • +
    • + You cannot print after school if you are not going to be there -- It is a Fire Hazard + and the print will be stopped.
    • +
    +
    + If you don't + remember how to slice your + file visit the Guide for a refresher! +
    + +
    + +
    + +
    +

    Please make sure to put your 3mf/STL file on + Google Drive with + PUBLIC access to anyone with the link.

    + +
    + + +
    + + +
    + +
    + + +
    + + + + +
    + +
    + + +

    + +
    + +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    + + +
    + + +
    + +
    +
    +
    +
    + + + \ No newline at end of file From 37cc23b2936cfcc7544e8885a902582376d87cc1 Mon Sep 17 00:00:00 2001 From: ikopke23 Date: Tue, 28 Feb 2023 11:29:36 -0800 Subject: [PATCH 10/41] Update addPrint.html --- HiFiViews/addPrint.html | 146 ++++++++++++++++++++++++---------------- 1 file changed, 87 insertions(+), 59 deletions(-) diff --git a/HiFiViews/addPrint.html b/HiFiViews/addPrint.html index a5c94f7..5b29467 100644 --- a/HiFiViews/addPrint.html +++ b/HiFiViews/addPrint.html @@ -105,6 +105,93 @@
    Hall of Fame
    file visit the Guide for a refresher! + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + + +
    + +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    + + +
    + + + +
    +
    + + + + +

    +

    @@ -158,65 +245,6 @@
    Hall of Fame


    - -
    -
    -
    -
    - - -
    -
    - - -
    -
    -
    - - -
    -
    - - -
    -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    -
    -
    - - -
    -
    - -
    - - -
    - - -
    - -
    From 031e3bb38eb5d3d8745a2e4e4ca8b9778681c26b Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Wed, 1 Mar 2023 09:37:32 -0500 Subject: [PATCH 11/41] Changing the Hi-Fi --- HiFiViews/addPrint.html | 75 ++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/HiFiViews/addPrint.html b/HiFiViews/addPrint.html index 5b29467..176e8ea 100644 --- a/HiFiViews/addPrint.html +++ b/HiFiViews/addPrint.html @@ -123,12 +123,14 @@
    Hall of Fame
    - +
    - +
    @@ -147,47 +149,60 @@
    Hall of Fame
    - +
    - +
    - - -
    -
    - - -
    -
    - - -
    -
    -
    -
    - - + + +
    +
    + + + +
    +
    + +
    -
    - - + + +
    +
    + + +
    +
    + + +
    -
    + + + -
    + --> + + - + \ No newline at end of file From cf483dac2269403c61063b0ed5f7ce5e21895ab6 Mon Sep 17 00:00:00 2001 From: ikopke23 Date: Thu, 2 Mar 2023 10:36:43 -0800 Subject: [PATCH 12/41] Class --- HiFiViews/addPrint.html | 8 +- HiFiViews/index.html | 4 +- config/keys.json | 5 + controllers/auth.js | 84 +++++++ controllers/hofprints_controller.js | 5 +- controllers/index.js | 10 + controllers/printers_controller.js | 10 +- controllers/prints_controller.js | 6 +- package-lock.json | 373 ++++++++++++++++++++++++++-- package.json | 8 +- server.js | 5 + views/login.ejs | 12 + 12 files changed, 498 insertions(+), 32 deletions(-) create mode 100644 config/keys.json create mode 100644 controllers/auth.js create mode 100644 views/login.ejs diff --git a/HiFiViews/addPrint.html b/HiFiViews/addPrint.html index 176e8ea..af13215 100644 --- a/HiFiViews/addPrint.html +++ b/HiFiViews/addPrint.html @@ -69,11 +69,13 @@
    Hall of Fame
    - +
    +

    Email

    +

    -
    +
    Admined By General Rose + style="margin-bottom:15px;" xlink>Admined By General Rose
    diff --git a/HiFiViews/index.html b/HiFiViews/index.html index dbf3f7b..f6fdb8a 100644 --- a/HiFiViews/index.html +++ b/HiFiViews/index.html @@ -69,7 +69,9 @@
    Hall of Fame
    - +
    +

    Email

    +

    { + request.logout(); + let playerID = request.user._json.email; + Player.createPlayer(playerID, playerID.split('.')[0]);//only creates if not in players.json + response.redirect('/'); +}); + +module.exports = router; + + + + + +export function loggedIn(request, response, next) { + if (request.user) { + next(); + } else { + response.redirect('/login'); + } + } + \ No newline at end of file diff --git a/controllers/hofprints_controller.js b/controllers/hofprints_controller.js index 6ac12b1..abd7536 100644 --- a/controllers/hofprints_controller.js +++ b/controllers/hofprints_controller.js @@ -1,8 +1,11 @@ +import loggedIn from './auth.js' + const express = require('express'), router = express.Router(); const fs = require('fs'); + router.get('/hofprints', function(request, response){ response.status(200); response.setHeader('Content-Type', 'text/html') @@ -17,7 +20,7 @@ router.get('/hofprints', function(request, response){ response.render("hofprints/hofSubmit") }); - router.post('/hofprints', function(request, response){ + router.post('/hofprints', loggedIn, function(request, response){ let hofPrints = JSON.parse(fs.readFileSync('data/hofprints.json')); let printName = request.body.printName; let desc = request.body.description; diff --git a/controllers/index.js b/controllers/index.js index 66250e4..6ce5378 100644 --- a/controllers/index.js +++ b/controllers/index.js @@ -1,3 +1,5 @@ +import loggedIn from './auth.js' + const express = require('express'), router = express.Router(); @@ -44,6 +46,14 @@ const fs = require('fs'); response.setHeader('Content-Type', 'text/html') response.render("status") }); + + router.get('/login', function(request, response) { + response.status(200); + response.setHeader('Content-Type', 'text/html') + response.render("login", { + user: request.user + }); + }); router.get('/error', function(request, response) { const errorCode = request.query.code; diff --git a/controllers/printers_controller.js b/controllers/printers_controller.js index 672d3a3..222fdff 100644 --- a/controllers/printers_controller.js +++ b/controllers/printers_controller.js @@ -1,10 +1,12 @@ +import loggedIn from './auth.js' + const express = require('express'), router = express.Router(); const fs = require('fs'); //used to be printers/allPrinters -router.get('/printer', function(request, response){ +router.get('/printer', loggedIn, function(request, response){ let printerList = JSON.parse(fs.readFileSync('data/printers.json')) response.status(200); response.setHeader('Content-Type', 'text/html') @@ -14,7 +16,7 @@ router.get('/printer', function(request, response){ }); //Used to be /report -router.get('/printer/allprints/report', function(request, response){ +router.get('/printer/allprints/report', loggedIn, function(request, response){ printerList = JSON.parse(fs.readFileSync('data/printers.json')) response.status(200); response.setHeader('Content-Type', 'text/html') @@ -43,7 +45,7 @@ router.post('/printer/allprints', function(request, response){ response.redirect("/printer/"+noSpaceName) }); //used to be /printer/addPrinter -router.get('/printer/new', function(request, response){ +router.get('/printer/new', loggedIn, function(request, response){ response.status(200); response.setHeader('Content-Type', 'text/html') response.render("printers/addPrinter") @@ -84,7 +86,7 @@ router.post('/printer', function(request, response){ } }); //used to be printer/printerName -router.get('/printer/:id', function(request, response){ +router.get('/printer/:id', loggedIn, function(request, response){ let printers = JSON.parse(fs.readFileSync("data/printers.json")) console.log("/printer/:id") let printerName = request.params.id; diff --git a/controllers/prints_controller.js b/controllers/prints_controller.js index 961edbe..53293c9 100644 --- a/controllers/prints_controller.js +++ b/controllers/prints_controller.js @@ -1,3 +1,5 @@ +import loggedIn from './auth.js' + const express = require('express'), router = express.Router(); const fs = require('fs'); @@ -12,14 +14,14 @@ router.get('/prints', function(request, response){ }); //used to be prints/printcreate - router.get('/print/new', function(request, response){ + router.get('/print/new', loggedIn, function(request, response){ response.status(200); response.setHeader('Content-Type', 'text/html') response.render("prints/printCreate") }); //used to be prints/:printname - router.get('/prints/:id', function(request, response){ + router.get('/prints/:id', loggedIn, function(request, response){ let prints = JSON.parse(fs.readFileSync("data/prints.JSON")) console.log("/prints/:printName") let printName = request.params.printName; diff --git a/package-lock.json b/package-lock.json index ac5bf9e..5f77c4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,21 @@ { - "name": "express-servers-GET", - "version": "1.0.0", + "name": "design Lab 2.0", + "version": "2.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "express-servers-GET", - "version": "1.0.0", + "name": "design Lab 2.0", + "version": "2.0.0", "license": "ISC", "dependencies": { "ejs": "^3.1.6", - "express": "^4.17.1", - "moment": "^2.29.4" + "express": "^4.18.2", + "express-session": "^1.17.2", + "method-override": "^3.0.0", + "passport": "^0.5.2", + "passport-google-oauth": "^2.0.0", + "uuid": "^8.3.2" } }, "node_modules/accepts": { @@ -55,6 +59,14 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -281,6 +293,32 @@ "node": ">= 0.10.0" } }, + "node_modules/express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "dependencies": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -458,6 +496,28 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "node_modules/method-override": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", + "dependencies": { + "debug": "3.1.0", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/method-override/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -507,14 +567,6 @@ "node": "*" } }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "engines": { - "node": "*" - } - }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -528,6 +580,11 @@ "node": ">= 0.6" } }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -547,6 +604,14 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -555,11 +620,107 @@ "node": ">= 0.8" } }, + "node_modules/passport": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.5.3.tgz", + "integrity": "sha512-gGc+70h4gGdBWNsR3FuV3byLDY6KBTJAIExGFXTpQaYfbbcHCBlRRKx7RBQSpqEqc5Hh2qVzRs7ssvSfOpkUEA==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-google-oauth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth/-/passport-google-oauth-2.0.0.tgz", + "integrity": "sha512-JKxZpBx6wBQXX1/a1s7VmdBgwOugohH+IxCy84aPTZNq/iIPX6u7Mqov1zY7MKRz3niFPol0KJz8zPLBoHKtYA==", + "dependencies": { + "passport-google-oauth1": "1.x.x", + "passport-google-oauth20": "2.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-google-oauth1": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth1/-/passport-google-oauth1-1.0.0.tgz", + "integrity": "sha512-qpCEhuflJgYrdg5zZIpAq/K3gTqa1CtHjbubsEsidIdpBPLkEVq6tB1I8kBNcH89RdSiYbnKpCBXAZXX/dtx1Q==", + "dependencies": { + "passport-oauth1": "1.x.x" + } + }, + "node_modules/passport-google-oauth20": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz", + "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==", + "dependencies": { + "passport-oauth2": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-oauth1": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.3.0.tgz", + "integrity": "sha512-8T/nX4gwKTw0PjxP1xfD0QhrydQNakzeOpZ6M5Uqdgz9/a/Ag62RmJxnZQ4LkbdXGrRehQHIAHNAu11rCP46Sw==", + "dependencies": { + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "utils-merge": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-oauth2": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.6.1.tgz", + "integrity": "sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ==", + "dependencies": { + "base64url": "3.x.x", + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -586,6 +747,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -731,6 +900,22 @@ "node": ">= 0.6" } }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -747,6 +932,14 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -789,6 +982,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, "body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -965,6 +1163,28 @@ "vary": "~1.1.2" } }, + "express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "requires": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + } + } + }, "filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -1099,6 +1319,27 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "method-override": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", + "requires": { + "debug": "3.1.0", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -1130,11 +1371,6 @@ "brace-expansion": "^1.1.7" } }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1145,6 +1381,11 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, "object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -1158,16 +1399,87 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "passport": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.5.3.tgz", + "integrity": "sha512-gGc+70h4gGdBWNsR3FuV3byLDY6KBTJAIExGFXTpQaYfbbcHCBlRRKx7RBQSpqEqc5Hh2qVzRs7ssvSfOpkUEA==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-google-oauth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth/-/passport-google-oauth-2.0.0.tgz", + "integrity": "sha512-JKxZpBx6wBQXX1/a1s7VmdBgwOugohH+IxCy84aPTZNq/iIPX6u7Mqov1zY7MKRz3niFPol0KJz8zPLBoHKtYA==", + "requires": { + "passport-google-oauth1": "1.x.x", + "passport-google-oauth20": "2.x.x" + } + }, + "passport-google-oauth1": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth1/-/passport-google-oauth1-1.0.0.tgz", + "integrity": "sha512-qpCEhuflJgYrdg5zZIpAq/K3gTqa1CtHjbubsEsidIdpBPLkEVq6tB1I8kBNcH89RdSiYbnKpCBXAZXX/dtx1Q==", + "requires": { + "passport-oauth1": "1.x.x" + } + }, + "passport-google-oauth20": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz", + "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==", + "requires": { + "passport-oauth2": "1.x.x" + } + }, + "passport-oauth1": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.3.0.tgz", + "integrity": "sha512-8T/nX4gwKTw0PjxP1xfD0QhrydQNakzeOpZ6M5Uqdgz9/a/Ag62RmJxnZQ4LkbdXGrRehQHIAHNAu11rCP46Sw==", + "requires": { + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "utils-merge": "1.x.x" + } + }, + "passport-oauth2": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.6.1.tgz", + "integrity": "sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ==", + "requires": { + "base64url": "3.x.x", + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==" + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1185,6 +1497,11 @@ "side-channel": "^1.0.4" } }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==" + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -1291,6 +1608,19 @@ "mime-types": "~2.1.24" } }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, + "uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -1301,6 +1631,11 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index 86fb679..efb02f3 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,11 @@ "license": "ISC", "dependencies": { "ejs": "^3.1.6", - "express": "^4.17.1", - "moment": "^2.29.4" + "express": "^4.18.2", + "express-session": "^1.17.2", + "method-override": "^3.0.0", + "passport": "^0.5.2", + "passport-google-oauth": "^2.0.0", + "uuid": "^8.3.2" } } diff --git a/server.js b/server.js index 9ad28bd..83c11b0 100644 --- a/server.js +++ b/server.js @@ -1,6 +1,7 @@ //..............Include Express..................................// const express = require('express'); const ejs = require('ejs'); +const methodOverride = require('method-override'); //..............Create an Express server object..................// const app = express(); @@ -8,10 +9,14 @@ const app = express(); //..............Apply Express middleware to the server object....// app.use(express.json()); //Used to parse JSON bodies (needed for POST requests) app.use(express.urlencoded()); + +app.use(methodOverride('_method'));//middleware for CRUD:UPDATE and DELETE + app.use(express.static('public')); //specify location of static assests app.set('views', __dirname + '/views'); //specify location of templates app.set('view engine', 'ejs'); //specify templating library +app.use(require('./controllers/auth')); app.use(require('./controllers/index')); app.use(require('./controllers/prints_controller')); app.use(require('./controllers/printers_controller')); diff --git a/views/login.ejs b/views/login.ejs new file mode 100644 index 0000000..e9d344d --- /dev/null +++ b/views/login.ejs @@ -0,0 +1,12 @@ +<%- include('partials/header', {title:"Design Lab Login"}) -%> + +
    +
    +

    Login to Enter the PRS: Tournament of Champions!

    +

    Login with: + Google +

    +
    +
    + +<%- include('partials/footer') -%> \ No newline at end of file From d2d79ae6b8e4e294f09fad7abef96ba53c234ef7 Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Thu, 2 Mar 2023 13:46:31 -0500 Subject: [PATCH 13/41] adding some stugg --- HiFiViews/Schedule.html | 32 ++++++++++++++++++++++++++++++++ HiFiViews/addPrint.html | 2 ++ HiFiViews/index.html | 31 ++++++++----------------------- 3 files changed, 42 insertions(+), 23 deletions(-) create mode 100644 HiFiViews/Schedule.html diff --git a/HiFiViews/Schedule.html b/HiFiViews/Schedule.html new file mode 100644 index 0000000..82c0478 --- /dev/null +++ b/HiFiViews/Schedule.html @@ -0,0 +1,32 @@ + + + + + Design Lab + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/HiFiViews/addPrint.html b/HiFiViews/addPrint.html index 176e8ea..ead4aec 100644 --- a/HiFiViews/addPrint.html +++ b/HiFiViews/addPrint.html @@ -265,4 +265,6 @@
    Hall of Fame
    + + \ No newline at end of file diff --git a/HiFiViews/index.html b/HiFiViews/index.html index dbf3f7b..b5e2f02 100644 --- a/HiFiViews/index.html +++ b/HiFiViews/index.html @@ -61,8 +61,8 @@ + + -->
  • Hall of Fame
    @@ -82,32 +82,17 @@
    Hall of Fame
    - + - - - \ No newline at end of file From e423ce01ba6c6f61d1e06ad7302725400582f230 Mon Sep 17 00:00:00 2001 From: ikopke23 Date: Fri, 3 Mar 2023 08:48:40 -0800 Subject: [PATCH 14/41] removing export --- controllers/auth.js | 12 ------------ controllers/hofprints_controller.js | 10 ++++++++-- controllers/index.js | 10 ++++++++-- controllers/printers_controller.js | 10 ++++++++-- controllers/prints_controller.js | 12 +++++++++--- 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/controllers/auth.js b/controllers/auth.js index 76c192a..eff3f7a 100644 --- a/controllers/auth.js +++ b/controllers/auth.js @@ -69,16 +69,4 @@ router.get("/auth/logout", (request, response) => { }); module.exports = router; - - - - - -export function loggedIn(request, response, next) { - if (request.user) { - next(); - } else { - response.redirect('/login'); - } - } \ No newline at end of file diff --git a/controllers/hofprints_controller.js b/controllers/hofprints_controller.js index abd7536..ad8cdd6 100644 --- a/controllers/hofprints_controller.js +++ b/controllers/hofprints_controller.js @@ -1,10 +1,16 @@ -import loggedIn from './auth.js' - const express = require('express'), router = express.Router(); const fs = require('fs'); +function loggedIn(request, response, next) { + if (request.user) { + next(); + } else { + response.redirect('/login'); + } +} + router.get('/hofprints', function(request, response){ response.status(200); diff --git a/controllers/index.js b/controllers/index.js index 6ce5378..978a590 100644 --- a/controllers/index.js +++ b/controllers/index.js @@ -1,10 +1,16 @@ -import loggedIn from './auth.js' - const express = require('express'), router = express.Router(); const fs = require('fs'); +function loggedIn(request, response, next) { + if (request.user) { + next(); + } else { + response.redirect('/login'); + } +} + router.get('/', function(request, response) { let hofPrints = JSON.parse(fs.readFileSync('data/hofprints.json')); let keys = Object.keys(hofPrints) diff --git a/controllers/printers_controller.js b/controllers/printers_controller.js index 222fdff..1648d2f 100644 --- a/controllers/printers_controller.js +++ b/controllers/printers_controller.js @@ -1,9 +1,15 @@ -import loggedIn from './auth.js' - const express = require('express'), router = express.Router(); const fs = require('fs'); +function loggedIn(request, response, next) { + if (request.user) { + next(); + } else { + response.redirect('/login'); + } +} + //used to be printers/allPrinters router.get('/printer', loggedIn, function(request, response){ diff --git a/controllers/prints_controller.js b/controllers/prints_controller.js index 53293c9..69a5bb3 100644 --- a/controllers/prints_controller.js +++ b/controllers/prints_controller.js @@ -1,10 +1,16 @@ -import loggedIn from './auth.js' - const express = require('express'), router = express.Router(); const fs = require('fs'); -//used to be prints/allprints +function loggedIn(request, response, next) { + if (request.user) { + next(); + } else { + response.redirect('/login'); + } +} + + //used to be prints/allprints router.get('/prints', function(request, response){ response.status(200); response.setHeader('Content-Type', 'text/html') From 11a1a6c8549c92701434a92285dea5235754d5cc Mon Sep 17 00:00:00 2001 From: ikopke23 Date: Wed, 8 Mar 2023 07:27:29 -0800 Subject: [PATCH 15/41] adding Users --- HiFiViews/Schedule.html | 80 +++++++++++++++++++++++++++++++--- HiFiViews/index.html | 23 +++++++++- controllers/auth.js | 8 ++-- controllers/user_controller.js | 74 +++++++++++++++++++++++++++++++ data/users.json | 0 5 files changed, 173 insertions(+), 12 deletions(-) create mode 100644 controllers/user_controller.js create mode 100644 data/users.json diff --git a/HiFiViews/Schedule.html b/HiFiViews/Schedule.html index 82c0478..61f0e67 100644 --- a/HiFiViews/Schedule.html +++ b/HiFiViews/Schedule.html @@ -22,11 +22,79 @@ +
    +
    + + + + + Design Lab + +
    + +
    +

    Email

    +
    +
    +
    + Admined By General Rose +
    +
    - + +
    +
    +
    +
    +

    Printer Schedule

    +
    + + + + +
    +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/HiFiViews/index.html b/HiFiViews/index.html index 61f0e67..f655ecd 100644 --- a/HiFiViews/index.html +++ b/HiFiViews/index.html @@ -84,11 +84,22 @@

    Email

    -

    Printer Schedule

    +

    Design Lab 2.0!

    +
    +

    + Welcome to the Design Lab Website!
    + You can schedule a print, look over the print schedule, look into the Hall of Fame, or send + a SVG off to General Rose. +

    +
    + Log in here to get Access + +
    +
    @@ -97,4 +108,12 @@

    Email

    - \ No newline at end of file + + + + \ No newline at end of file diff --git a/controllers/auth.js b/controllers/auth.js index eff3f7a..342483a 100644 --- a/controllers/auth.js +++ b/controllers/auth.js @@ -9,7 +9,7 @@ const KEYS = require('../config/keys.json'); console.log(KEYS); let userProfile; //only used if you want to see user info beyond username -const Player = require('../models/player_model'); +const User = require('../models/player_model'); router.use(session({ resave: false, @@ -46,7 +46,7 @@ passport.deserializeUser(function(obj, cb) { */ router.get('/auth/google', passport.authenticate('google', { - scope: ['email'] + scope: ['email', 'profile'] })); /* @@ -63,8 +63,8 @@ router.get('/auth/google/callback', router.get("/auth/logout", (request, response) => { request.logout(); - let playerID = request.user._json.email; - Player.createPlayer(playerID, playerID.split('.')[0]);//only creates if not in players.json + let User = request.user._json.email; + User.createPlayer(playerID, playerID.split('.')[0]);//only creates if not in players.json response.redirect('/'); }); diff --git a/controllers/user_controller.js b/controllers/user_controller.js new file mode 100644 index 0000000..2e78dc3 --- /dev/null +++ b/controllers/user_controller.js @@ -0,0 +1,74 @@ +const fs = require('fs'); + +exports.getUsers = function(){ + let users = getUsers(); + return users; +} + +exports.isUser = function(userID){ + let users = getUsers(); + if(users[userID] && users[userID]["privileges"].indexOf("player")>=0) return true; + else return false; +} + +exports.makeAdmin = function(userID){ + let allUsers = getUsers(); + if(users[userID] && users[userID]["privileges"].indexOf("admin")<0) users[userID]["privileges"].push("admin"); + fs.writeFileSync(__dirname+'/../data/users.json', JSON.stringify(allUsers)); +} + +exports.isAdmin = function(userID){ + let users = getUsers(); + if(users[userID] && users[userID]["privileges"].indexOf("admin")>=0) return true; + else return false; +} + +exports.getUser = function(userID){ + let users = getUsers(); + + users[userID].win_percent = (users[userID].win/parseFloat(users[userID].win+users[userID].lose+users[userID].tie) * 100).toFixed(2); + if(users[userID].win_percent=="NaN") users[userID].win_percent=0; + + return users[userID]; +} + +exports.createUser = function (userID, playerDisplayName){ + let allUsers = getUsers(); + if(!allUsers[userID]){ + let newPlayer={ + "displayName": playerDisplayName, + "privileges": ["player"], + "games": [], + "dateJoined": new Date() + } + allUsers[userID] = newPlayer; + fs.writeFileSync(__dirname+'/../data/players.json', JSON.stringify(allUsers)); + } +} + +exports.updateUser = function (playerName, results){ + let allUsers = getUsers(); + +/* if(outcome=="player") allUsers[playerName]["win"]++; + else if(outcome=="player") allUsers[playerName]["lose"]++; + else allUsers[playerName]["tie"]++; +*/ + + fs.writeFileSync(__dirname+'/../data/players.json', JSON.stringify(allUsers)); +} + +exports.removeUser = function(userID){ + let allUsers = getUsers(); + if(allUsers[userID]) delete allUsers[userID]; + fs.writeFileSync(__dirname+'/../data/players.json', JSON.stringify(allUsers)); +} + +exports.addPrint = function(userID, printID){ + let allUsers = getUsers(); + if(allUsers[userID]){ + let prints = allUsers[userID].prints; + prints.push[printID]; + + } + fs.writeFileSync(__dirname+'/../data/players.json', JSON.stringify(allUsers)); +} \ No newline at end of file diff --git a/data/users.json b/data/users.json new file mode 100644 index 0000000..e69de29 From b65091b46bbbf836671b687cdc24b520c1780716 Mon Sep 17 00:00:00 2001 From: ikopke23 Date: Wed, 8 Mar 2023 07:46:21 -0800 Subject: [PATCH 16/41] Update user_controller.js --- controllers/user_controller.js | 116 ++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 52 deletions(-) diff --git a/controllers/user_controller.js b/controllers/user_controller.js index 2e78dc3..120cfa4 100644 --- a/controllers/user_controller.js +++ b/controllers/user_controller.js @@ -1,74 +1,86 @@ const fs = require('fs'); -exports.getUsers = function(){ - let users = getUsers(); - return users; +exports.getUsers = function () { + let users = getUsers(); + return users; } -exports.isUser = function(userID){ - let users = getUsers(); - if(users[userID] && users[userID]["privileges"].indexOf("player")>=0) return true; - else return false; +exports.isUser = function (userID) { + let users = getUsers(); + if (users[userID] && users[userID]["privileges"].indexOf("user") >= 0) return true; + else return false; } -exports.makeAdmin = function(userID){ - let allUsers = getUsers(); - if(users[userID] && users[userID]["privileges"].indexOf("admin")<0) users[userID]["privileges"].push("admin"); - fs.writeFileSync(__dirname+'/../data/users.json', JSON.stringify(allUsers)); +exports.makeAdmin = function (userID) { + let allUsers = getUsers(); + if (users[userID] && users[userID]["privileges"].indexOf("admin") < 0) users[userID]["privileges"].push("admin"); + fs.writeFileSync(__dirname + '/../data/users.json', JSON.stringify(allUsers)); } -exports.isAdmin = function(userID){ - let users = getUsers(); - if(users[userID] && users[userID]["privileges"].indexOf("admin")>=0) return true; - else return false; +exports.isAdmin = function (userID) { + let users = getUsers(); + if (users[userID] && users[userID]["privileges"].indexOf("admin") >= 0) return true; + else return false; } -exports.getUser = function(userID){ - let users = getUsers(); - - users[userID].win_percent = (users[userID].win/parseFloat(users[userID].win+users[userID].lose+users[userID].tie) * 100).toFixed(2); - if(users[userID].win_percent=="NaN") users[userID].win_percent=0; - - return users[userID]; +exports.getUser = function (userID) { + let users = getUsers(); + let prints = users[userID]["prints"]; + let printHours = 0; + for (let i = 0; i, users[userID]["prints"].length; i++) { + printHours += prints.printTime(users[userID]["prints"][i]); + } + users[userID]["printTime"] = printHours; + return users[userID]; } -exports.createUser = function (userID, playerDisplayName){ - let allUsers = getUsers(); - if(!allUsers[userID]){ - let newPlayer={ - "displayName": playerDisplayName, - "privileges": ["player"], - "games": [], - "dateJoined": new Date() +exports.createUser = function (userID, playerDisplayName) { + let allUsers = getUsers(); + if (!allUsers[userID]) { + let newPlayer = { + "displayName": playerDisplayName, + "privileges": ["user"], + "prints": [], + "SVGs": [], + "printHours": 0, + "dateJoined": new Date() + } + allUsers[userID] = newPlayer; + fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); } - allUsers[userID] = newPlayer; - fs.writeFileSync(__dirname+'/../data/players.json', JSON.stringify(allUsers)); - } } -exports.updateUser = function (playerName, results){ - let allUsers = getUsers(); +exports.updateUser = function (playerName, results) { + let allUsers = getUsers(); -/* if(outcome=="player") allUsers[playerName]["win"]++; - else if(outcome=="player") allUsers[playerName]["lose"]++; - else allUsers[playerName]["tie"]++; -*/ + /* if(outcome=="player") allUsers[playerName]["win"]++; + else if(outcome=="player") allUsers[playerName]["lose"]++; + else allUsers[playerName]["tie"]++; + */ - fs.writeFileSync(__dirname+'/../data/players.json', JSON.stringify(allUsers)); + fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); } -exports.removeUser = function(userID){ - let allUsers = getUsers(); - if(allUsers[userID]) delete allUsers[userID]; - fs.writeFileSync(__dirname+'/../data/players.json', JSON.stringify(allUsers)); +exports.removeUser = function (userID) { + let allUsers = getUsers(); + if (allUsers[userID]) delete allUsers[userID]; + fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); } -exports.addPrint = function(userID, printID){ - let allUsers = getUsers(); - if(allUsers[userID]){ - let prints = allUsers[userID].prints; - prints.push[printID]; - - } - fs.writeFileSync(__dirname+'/../data/players.json', JSON.stringify(allUsers)); +exports.addPrint = function (userID, printID) { + let allUsers = getUsers(); + if (allUsers[userID]) { + let prints = allUsers[userID].prints; + prints.push[printID]; + } + fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); +} + +exports.addSVG = function (userID, printID) { + let allUsers = getUsers(); + if (allUsers[userID]) { + let prints = allUsers[userID].prints; + prints.push[printID]; + } + fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); } \ No newline at end of file From cafbb3cf4177ad5311f160b81b9c4d205d564ccc Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Wed, 8 Mar 2023 14:25:46 -0500 Subject: [PATCH 17/41] changing some things around --- HiFiViews/Schedule.html | 6 ++- controllers/auth.js | 2 +- controllers/user_controller.js | 86 ---------------------------------- models/user_model | 86 ++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 88 deletions(-) create mode 100644 models/user_model diff --git a/HiFiViews/Schedule.html b/HiFiViews/Schedule.html index 61f0e67..ee35dd1 100644 --- a/HiFiViews/Schedule.html +++ b/HiFiViews/Schedule.html @@ -37,7 +37,7 @@ data-bs-toggle="collapse" data-bs-target="#home-collapse" aria-expanded="false"> 3d Printing Signups -
    +
    +
    diff --git a/controllers/auth.js b/controllers/auth.js index 342483a..df7144f 100644 --- a/controllers/auth.js +++ b/controllers/auth.js @@ -9,7 +9,7 @@ const KEYS = require('../config/keys.json'); console.log(KEYS); let userProfile; //only used if you want to see user info beyond username -const User = require('../models/player_model'); +const User = require('../models/user_model'); router.use(session({ resave: false, diff --git a/controllers/user_controller.js b/controllers/user_controller.js index 120cfa4..e69de29 100644 --- a/controllers/user_controller.js +++ b/controllers/user_controller.js @@ -1,86 +0,0 @@ -const fs = require('fs'); - -exports.getUsers = function () { - let users = getUsers(); - return users; -} - -exports.isUser = function (userID) { - let users = getUsers(); - if (users[userID] && users[userID]["privileges"].indexOf("user") >= 0) return true; - else return false; -} - -exports.makeAdmin = function (userID) { - let allUsers = getUsers(); - if (users[userID] && users[userID]["privileges"].indexOf("admin") < 0) users[userID]["privileges"].push("admin"); - fs.writeFileSync(__dirname + '/../data/users.json', JSON.stringify(allUsers)); -} - -exports.isAdmin = function (userID) { - let users = getUsers(); - if (users[userID] && users[userID]["privileges"].indexOf("admin") >= 0) return true; - else return false; -} - -exports.getUser = function (userID) { - let users = getUsers(); - let prints = users[userID]["prints"]; - let printHours = 0; - for (let i = 0; i, users[userID]["prints"].length; i++) { - printHours += prints.printTime(users[userID]["prints"][i]); - } - users[userID]["printTime"] = printHours; - return users[userID]; -} - -exports.createUser = function (userID, playerDisplayName) { - let allUsers = getUsers(); - if (!allUsers[userID]) { - let newPlayer = { - "displayName": playerDisplayName, - "privileges": ["user"], - "prints": [], - "SVGs": [], - "printHours": 0, - "dateJoined": new Date() - } - allUsers[userID] = newPlayer; - fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); - } -} - -exports.updateUser = function (playerName, results) { - let allUsers = getUsers(); - - /* if(outcome=="player") allUsers[playerName]["win"]++; - else if(outcome=="player") allUsers[playerName]["lose"]++; - else allUsers[playerName]["tie"]++; - */ - - fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); -} - -exports.removeUser = function (userID) { - let allUsers = getUsers(); - if (allUsers[userID]) delete allUsers[userID]; - fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); -} - -exports.addPrint = function (userID, printID) { - let allUsers = getUsers(); - if (allUsers[userID]) { - let prints = allUsers[userID].prints; - prints.push[printID]; - } - fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); -} - -exports.addSVG = function (userID, printID) { - let allUsers = getUsers(); - if (allUsers[userID]) { - let prints = allUsers[userID].prints; - prints.push[printID]; - } - fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); -} \ No newline at end of file diff --git a/models/user_model b/models/user_model new file mode 100644 index 0000000..120cfa4 --- /dev/null +++ b/models/user_model @@ -0,0 +1,86 @@ +const fs = require('fs'); + +exports.getUsers = function () { + let users = getUsers(); + return users; +} + +exports.isUser = function (userID) { + let users = getUsers(); + if (users[userID] && users[userID]["privileges"].indexOf("user") >= 0) return true; + else return false; +} + +exports.makeAdmin = function (userID) { + let allUsers = getUsers(); + if (users[userID] && users[userID]["privileges"].indexOf("admin") < 0) users[userID]["privileges"].push("admin"); + fs.writeFileSync(__dirname + '/../data/users.json', JSON.stringify(allUsers)); +} + +exports.isAdmin = function (userID) { + let users = getUsers(); + if (users[userID] && users[userID]["privileges"].indexOf("admin") >= 0) return true; + else return false; +} + +exports.getUser = function (userID) { + let users = getUsers(); + let prints = users[userID]["prints"]; + let printHours = 0; + for (let i = 0; i, users[userID]["prints"].length; i++) { + printHours += prints.printTime(users[userID]["prints"][i]); + } + users[userID]["printTime"] = printHours; + return users[userID]; +} + +exports.createUser = function (userID, playerDisplayName) { + let allUsers = getUsers(); + if (!allUsers[userID]) { + let newPlayer = { + "displayName": playerDisplayName, + "privileges": ["user"], + "prints": [], + "SVGs": [], + "printHours": 0, + "dateJoined": new Date() + } + allUsers[userID] = newPlayer; + fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); + } +} + +exports.updateUser = function (playerName, results) { + let allUsers = getUsers(); + + /* if(outcome=="player") allUsers[playerName]["win"]++; + else if(outcome=="player") allUsers[playerName]["lose"]++; + else allUsers[playerName]["tie"]++; + */ + + fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); +} + +exports.removeUser = function (userID) { + let allUsers = getUsers(); + if (allUsers[userID]) delete allUsers[userID]; + fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); +} + +exports.addPrint = function (userID, printID) { + let allUsers = getUsers(); + if (allUsers[userID]) { + let prints = allUsers[userID].prints; + prints.push[printID]; + } + fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); +} + +exports.addSVG = function (userID, printID) { + let allUsers = getUsers(); + if (allUsers[userID]) { + let prints = allUsers[userID].prints; + prints.push[printID]; + } + fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); +} \ No newline at end of file From 71da43537d3590be2f36274af475e22ee10fb3b4 Mon Sep 17 00:00:00 2001 From: ikopke23 Date: Thu, 9 Mar 2023 11:14:38 -0800 Subject: [PATCH 18/41] User works --- controllers/auth.js | 23 +++++++++++------------ data/users.json | 1 + models/user_model | 21 ++++++++++++++------- views/login.ejs | 16 ++++++++-------- 4 files changed, 34 insertions(+), 27 deletions(-) diff --git a/controllers/auth.js b/controllers/auth.js index df7144f..e0fe461 100644 --- a/controllers/auth.js +++ b/controllers/auth.js @@ -23,21 +23,21 @@ router.use(passport.initialize()); router.use(passport.session()); passport.use(new GoogleStrategy({ - clientID: KEYS["google-client-id"], - clientSecret: KEYS["google-client-secret"], - callbackURL: "http://localhost:3000/auth/google/callback" - //todo: port==process.env.PORT? : - }, - function(accessToken, refreshToken, profile, done) { + clientID: KEYS["google-client-id"], + clientSecret: KEYS["google-client-secret"], + callbackURL: "http://localhost:3000/auth/google/callback" + //todo: port==process.env.PORT? : +}, + function (accessToken, refreshToken, profile, done) { userProfile = profile; //so we can see & use details form the profile return done(null, userProfile); } )); -passport.serializeUser(function(user, cb) { +passport.serializeUser(function (user, cb) { cb(null, user); }); -passport.deserializeUser(function(obj, cb) { +passport.deserializeUser(function (obj, cb) { cb(null, obj); }); @@ -56,17 +56,16 @@ router.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '/error?code=401' }), - function(request, response) { + function (request, response) { console.log(userProfile); + let user = request.user._json.email; + User.createUser(user, user.split('.')[0]);//only creates if not in players.json response.redirect('/'); }); router.get("/auth/logout", (request, response) => { request.logout(); - let User = request.user._json.email; - User.createPlayer(playerID, playerID.split('.')[0]);//only creates if not in players.json response.redirect('/'); }); module.exports = router; - \ No newline at end of file diff --git a/data/users.json b/data/users.json index e69de29..743a5de 100644 --- a/data/users.json +++ b/data/users.json @@ -0,0 +1 @@ +{"testUser":{"email":"test.user@trinityschoolnyc.org"},"ian.kopke23@trinityschoolnyc.org":{"displayName":"ian","privileges":["user"],"prints":[],"SVGs":[],"printHours":0,"dateJoined":"2023-03-09T19:11:45.885Z"}} \ No newline at end of file diff --git a/models/user_model b/models/user_model index 120cfa4..538dafa 100644 --- a/models/user_model +++ b/models/user_model @@ -1,7 +1,12 @@ const fs = require('fs'); exports.getUsers = function () { - let users = getUsers(); + let users = JSON.parse(fs.readFileSync(__dirname + '/../data/users.json')); + return users; +} + +getlocalUsers = function () { + let users = JSON.parse(fs.readFileSync(__dirname + '/../data/users.json')); return users; } @@ -35,7 +40,9 @@ exports.getUser = function (userID) { } exports.createUser = function (userID, playerDisplayName) { - let allUsers = getUsers(); + let allUsers = getlocalUsers(); + console.log(getlocalUsers()); + console.log("createUser function Called"); if (!allUsers[userID]) { let newPlayer = { "displayName": playerDisplayName, @@ -46,7 +53,7 @@ exports.createUser = function (userID, playerDisplayName) { "dateJoined": new Date() } allUsers[userID] = newPlayer; - fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); + fs.writeFileSync(__dirname + '/../data/users.json', JSON.stringify(allUsers)); } } @@ -58,13 +65,13 @@ exports.updateUser = function (playerName, results) { else allUsers[playerName]["tie"]++; */ - fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); + fs.writeFileSync(__dirname + '/../data/users.json', JSON.stringify(allUsers)); } exports.removeUser = function (userID) { let allUsers = getUsers(); if (allUsers[userID]) delete allUsers[userID]; - fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); + fs.writeFileSync(__dirname + '/../data/users.json', JSON.stringify(allUsers)); } exports.addPrint = function (userID, printID) { @@ -73,7 +80,7 @@ exports.addPrint = function (userID, printID) { let prints = allUsers[userID].prints; prints.push[printID]; } - fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); + fs.writeFileSync(__dirname + '/../data/users.json', JSON.stringify(allUsers)); } exports.addSVG = function (userID, printID) { @@ -82,5 +89,5 @@ exports.addSVG = function (userID, printID) { let prints = allUsers[userID].prints; prints.push[printID]; } - fs.writeFileSync(__dirname + '/../data/players.json', JSON.stringify(allUsers)); + fs.writeFileSync(__dirname + '/../data/users.json', JSON.stringify(allUsers)); } \ No newline at end of file diff --git a/views/login.ejs b/views/login.ejs index e9d344d..608e8e3 100644 --- a/views/login.ejs +++ b/views/login.ejs @@ -1,12 +1,12 @@ <%- include('partials/header', {title:"Design Lab Login"}) -%> -
    -
    -

    Login to Enter the PRS: Tournament of Champions!

    -

    Login with: - Google -

    +
    +
    +

    Login to Enter the Design Lab!

    +

    Login with: + Google +

    +
    -
    -<%- include('partials/footer') -%> \ No newline at end of file + <%- include('partials/footer') -%> \ No newline at end of file From 2ed233977b49b09ac1d46ccf41f44accf475a9a5 Mon Sep 17 00:00:00 2001 From: ikopke23 Date: Thu, 9 Mar 2023 11:31:00 -0800 Subject: [PATCH 19/41] moving some stuff --- HiFiViews/heroes.css | 12 -- public/css/heroes.css | 13 ++ {HiFiViews => public/css}/offcanvas.css | 0 {HiFiViews => public/css}/sb-admin-2.min.css | 0 {HiFiViews => public/css}/sidebar.css | 0 public/css/style.css | 132 ++---------------- views/index.ejs | 137 ++++++++----------- views/indexOld.ejs | 90 ++++++++++++ views/partials/sidebar.ejs | 55 ++++++++ 9 files changed, 231 insertions(+), 208 deletions(-) delete mode 100644 HiFiViews/heroes.css create mode 100644 public/css/heroes.css rename {HiFiViews => public/css}/offcanvas.css (100%) rename {HiFiViews => public/css}/sb-admin-2.min.css (100%) rename {HiFiViews => public/css}/sidebar.css (100%) create mode 100644 views/indexOld.ejs create mode 100644 views/partials/sidebar.ejs diff --git a/HiFiViews/heroes.css b/HiFiViews/heroes.css deleted file mode 100644 index b5e3926..0000000 --- a/HiFiViews/heroes.css +++ /dev/null @@ -1,12 +0,0 @@ -.b-example-divider { - height: 3rem; - background-color: rgba(0, 0, 0, .1); - border: solid rgba(0, 0, 0, .15); - border-width: 1px 0; - box-shadow: inset 0 .5em 1.5em rgba(0, 0, 0, .1), inset 0 .125em .5em rgba(0, 0, 0, .15); - } - - @media (min-width: 992px) { - .rounded-lg-3 { border-radius: .3rem; } - } - \ No newline at end of file diff --git a/public/css/heroes.css b/public/css/heroes.css new file mode 100644 index 0000000..30666bb --- /dev/null +++ b/public/css/heroes.css @@ -0,0 +1,13 @@ +.b-example-divider { + height: 3rem; + background-color: rgba(0, 0, 0, .1); + border: solid rgba(0, 0, 0, .15); + border-width: 1px 0; + box-shadow: inset 0 .5em 1.5em rgba(0, 0, 0, .1), inset 0 .125em .5em rgba(0, 0, 0, .15); +} + +@media (min-width: 992px) { + .rounded-lg-3 { + border-radius: .3rem; + } +} \ No newline at end of file diff --git a/HiFiViews/offcanvas.css b/public/css/offcanvas.css similarity index 100% rename from HiFiViews/offcanvas.css rename to public/css/offcanvas.css diff --git a/HiFiViews/sb-admin-2.min.css b/public/css/sb-admin-2.min.css similarity index 100% rename from HiFiViews/sb-admin-2.min.css rename to public/css/sb-admin-2.min.css diff --git a/HiFiViews/sidebar.css b/public/css/sidebar.css similarity index 100% rename from HiFiViews/sidebar.css rename to public/css/sidebar.css diff --git a/public/css/style.css b/public/css/style.css index 4f30be0..234c5bd 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1,108 +1,6 @@ -body { - background-color: #aaaaaa; - font-size: 18px; - color: #3db49c; - /* color: #bd1010; */ - font-family: 'Raleway', sans-serif; -} - -h1 { - /* background-color: #00ffdd; */ - font-size: 40px; - text-align: center; -} - -div:not(.hero) { - border-radius: 25px; - /* margin-top: 50px; */ - /* margin-bottom: 50px; */ - margin-right: 50px; - margin-left: 50px; - background-color: #192841; - overflow: auto; - padding: 10px; -} - -.hero{ - border-radius: 25px; - background-color:#192841 ; - /* margin-right: 50px; */ -} -.hero-background{ - margin-right: 50px; - margin-left: 50px; -} - -nav { - border-radius: 25px; - /* margin-top: 50px; */ - margin-bottom: 50px; - margin-right: 50px; - margin-left: 50px; - /* background-color: #5880c6; */ - overflow: visible; - padding: 10px; -} -.fs-1{ - background-color: #154d79; -} - -button { - background-color: #00ffdd; - font-size: 12px; - border-radius: 6px; - border: 2px solid #00cccc; - padding: 7px 12px; -} - -button:hover { - box-shadow: 0 12px 16px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19); -} - -button:focus { - outline: none; -} - -table { - border-collapse: collapse; - background-color: #4dffe7; - margin: auto; - width: 50%; -} - -table, th, td { - border: 1px solid black; - padding: 3px; - text-align: center; -} - -tr:hover { - background-color: #ccfff8; -} - -a { - color: #000080; -} - -a:hover { - color: #00ccb1; -} - -img { - display: block; - margin-left: auto; - margin-right: auto; -} - -footer { - font-size: 50%; - text-align: center; -} - - h3 { - text-align:center; - color:#272221 + text-align: center; + color: #272221 } h4 { @@ -111,11 +9,11 @@ h4 { } label { - color:#3716c9; + color: #3716c9; } -.linkRule{ - color:#3716c9; +.linkRule { + color: #3716c9; } .printertable { @@ -123,30 +21,30 @@ label { } .b-example-divider { - visibility:hidden; + visibility: hidden; } .headerText { - color:#ffffff; + color: #ffffff; } -.headerText .hover{ - color:#ffffff; +.headerText .hover { + color: #ffffff; } .hof { - color:#000000; + color: #000000; text-align: center; } -.pPrint{ +.pPrint { color: #3716c9; } -.reportMessage{ - color:#000000 +.reportMessage { + color: #000000 } -.footer{ - color:#000080 +.footer { + color: #000080 } \ No newline at end of file diff --git a/views/index.ejs b/views/index.ejs index 3e3e4d1..ef59d86 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -1,90 +1,69 @@ -<%- include('partials/header', {title:"3D Printing Signups!"})-%> -

    3D Printing Signups!

    + + -

    Don't know how to 3dPrint? Head over to our beginner guide for a quick an easy Guide!

    -

    Printer Availability

    - - - - - - - - - - - - - - - - - - - - - -
    MK3 FamilyMinis
    MK3 AFreeMini 1 Free
    MK3 BFreeMini 2Free
    + + Design Lab + + + + + + + + + + + - + +
    + <%-include("partials/sidebar") %> + +
    +
    +
    +
    +

    Design Lab 2.0!

    +
    -
    + +
    +

    + Welcome to the Design Lab Website!
    + You can schedule a print, look over the print schedule, look into the Hall of Fame, + or + send + a SVG off to General Rose. +

    +
    + Log in here + to + get + Access -
    -
    -
    - Technical Difficulties -
    -
    -

    <%=hofPrint["name"]%>

    -

    <%=hofPrint["description"]%>

    -

    Printed on <%=hofPrint["printer"]%> by <%=hofPrint["student"]%>

    -
    - More Info -
    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    -
    -
    -
    -
    -
    - Bootstrap Themes -
    -
    -

    BENCHY

    -

    This is our current collection of Benchies. Benchies are an old Test print that does not actually test that much. However, it has become a meme, so Ian printed a dry dock for them.

    - -
    -
    +
    +
    -
    + - - - - <%- include('partials/footer') -%> + \ No newline at end of file diff --git a/views/indexOld.ejs b/views/indexOld.ejs new file mode 100644 index 0000000..3e3e4d1 --- /dev/null +++ b/views/indexOld.ejs @@ -0,0 +1,90 @@ +<%- include('partials/header', {title:"3D Printing Signups!"})-%> +

    3D Printing Signups!

    + +

    Don't know how to 3dPrint? Head over to our beginner guide for a quick an easy Guide!

    +

    Printer Availability

    + + + + + + + + + + + + + + + + + + + + + +
    MK3 FamilyMinis
    MK3 AFreeMini 1 Free
    MK3 BFreeMini 2Free
    + + + + +
    + +
    +
    +
    + Technical Difficulties +
    +
    +

    <%=hofPrint["name"]%>

    +

    <%=hofPrint["description"]%>

    +

    Printed on <%=hofPrint["printer"]%> by <%=hofPrint["student"]%>

    +
    + More Info +
    +
    +
    +
    +
    +
    + + + +
    +
    +
    +
    +
    + Bootstrap Themes +
    +
    +

    BENCHY

    +

    This is our current collection of Benchies. Benchies are an old Test print that does not actually test that much. However, it has become a meme, so Ian printed a dry dock for them.

    + +
    +
    +
    +
    + + + + + + <%- include('partials/footer') -%> diff --git a/views/partials/sidebar.ejs b/views/partials/sidebar.ejs new file mode 100644 index 0000000..3e3c50c --- /dev/null +++ b/views/partials/sidebar.ejs @@ -0,0 +1,55 @@ +
    + + + + + Design Lab + +
    + +
    +

    Email

    +
    +
    +
    + Admined By General Rose +
    +
    \ No newline at end of file From 38d7315f69bb64637c88bbad909779d0e7edf064 Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Fri, 10 Mar 2023 09:22:25 -0500 Subject: [PATCH 20/41] Starting to change some routes --- package-lock.json | 6 +++--- package.json | 6 +++--- views/partials/sidebar.ejs | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5f77c4e..4108758 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { - "name": "design Lab 2.0", + "name": "Design Lab 2.0", "version": "2.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "design Lab 2.0", + "name": "Design Lab 2.0", "version": "2.0.0", "license": "ISC", "dependencies": { "ejs": "^3.1.6", - "express": "^4.18.2", + "express": "^4.17.1", "express-session": "^1.17.2", "method-override": "^3.0.0", "passport": "^0.5.2", diff --git a/package.json b/package.json index efb02f3..1e16d14 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "design Lab 2.0", + "name": "Design Lab 2.0", "version": "2.0.0", - "description": "Organization system for the Trinity School's Design lab", + "description": "A website for the organization of Trinity School's design lab", "main": "server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", @@ -11,7 +11,7 @@ "license": "ISC", "dependencies": { "ejs": "^3.1.6", - "express": "^4.18.2", + "express": "^4.17.1", "express-session": "^1.17.2", "method-override": "^3.0.0", "passport": "^0.5.2", diff --git a/views/partials/sidebar.ejs b/views/partials/sidebar.ejs index 3e3c50c..834abb4 100644 --- a/views/partials/sidebar.ejs +++ b/views/partials/sidebar.ejs @@ -15,9 +15,9 @@
  • @@ -29,9 +29,9 @@ From 91501254e02b6d3e82996656dd4bbbda168c6171 Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Fri, 10 Mar 2023 09:31:46 -0500 Subject: [PATCH 21/41] changing some more routes --- controllers/prints_controller.js | 11 ++++--- views/prints/allPrints.ejs | 55 ++++++++++++++++++-------------- 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/controllers/prints_controller.js b/controllers/prints_controller.js index 69a5bb3..9290a48 100644 --- a/controllers/prints_controller.js +++ b/controllers/prints_controller.js @@ -14,8 +14,9 @@ function loggedIn(request, response, next) { router.get('/prints', function(request, response){ response.status(200); response.setHeader('Content-Type', 'text/html') + console.log(__dirname+"../data/prints.json"); response.render("prints/allPrints", { - prints : JSON.parse(fs.readFileSync("data/prints.json")) + prints : JSON.parse(fs.readFileSync("../data/prints.json")) }) }); @@ -28,7 +29,7 @@ router.get('/prints', function(request, response){ //used to be prints/:printname router.get('/prints/:id', loggedIn, function(request, response){ - let prints = JSON.parse(fs.readFileSync("data/prints.JSON")) + let prints = JSON.parse(fs.readFileSync("/../data/prints.json")) console.log("/prints/:printName") let printName = request.params.printName; // console.log("printName = "+printName) @@ -55,7 +56,7 @@ router.get('/prints', function(request, response){ }); //used to be prints/printcreate router.post('/print', function(request,response){ - let prints = JSON.parse(fs.readFileSync("data/prints.json")); + let prints = JSON.parse(fs.readFileSync("../data/prints.json")); let printName = request.body.printName; // console.log(prints); @@ -77,8 +78,8 @@ router.get('/prints', function(request, response){ console.log("newPrint = "); console.log(newPrint) prints[printName] = newPrint; - fs.writeFileSync("data/prints.json", JSON.stringify(prints)) - console.log(JSON.parse(fs.readFileSync('data/prints.json'))) + fs.writeFileSync("../data/prints.json", JSON.stringify(prints)) + console.log(JSON.parse(fs.readFileSync('../data/prints.json'))) response.status(200); response.setHeader('Content-Type', 'text/html') diff --git a/views/prints/allPrints.ejs b/views/prints/allPrints.ejs index 5596e02..d8a02fb 100644 --- a/views/prints/allPrints.ejs +++ b/views/prints/allPrints.ejs @@ -1,31 +1,38 @@ <%- include('../partials/header', {title:"3D Printing Signups!"})-%> -

    Every Print is stored Here!

    +

    Every Print is stored Here!

    -<%for(print in prints){%> -
    -
    -
    -
    - <% if(prints[print]["photo"].length > 20){ %> - " class="d-block mx-lg-auto img-fluid" alt="Technical Difficulties" width="700" height="500" loading="lazy"> - <%} else{ %> - Technical Difficulties"> - <%}%> -
    -
    -
    -

    <%=prints[print]["name"]%>

    -

    <%=prints[print]["description"]%>

    -

    Printed on <%=prints[print]["printer"]%> by <%=prints[print]["student"]%>

    -
    - " type="button" class="btn btn-secondary btn-lg px-4 me-md-2"> More Info + <%for(print in prints){%> +
    +
    +
    +
    + <% if(prints[print]["photo"].length> 20){ %> + " class="d-block mx-lg-auto img-fluid" alt="Technical + Difficulties" width="700" height="500" loading="lazy"> + <%} else{ %> + Technical Difficulties"> + <%}%> +
    +
    +
    +

    + <%=prints[print]["name"]%> +

    +

    + <%=prints[print]["description"]%> +

    +

    Printed on <%=prints[print]["printer"]%> by <%=prints[print]["student"]%> +

    +
    -
    -
    -<%}%> - +
    + <%}%> -<%- include('../partials/footer') -%> + <%- include('../partials/footer') -%> \ No newline at end of file From 38ea986df075a452299482f71c3f8a57b4a116b4 Mon Sep 17 00:00:00 2001 From: ikopke23 Date: Mon, 13 Mar 2023 10:25:50 -0700 Subject: [PATCH 22/41] changing the ejs stuff --- views/prints/printCreate.ejs | 280 +++++++++++++++++++++++++------- views/prints/printCreateold.ejs | 63 +++++++ views/schedule.ejs | 61 +++++-- views/scheduleOld.ejs | 15 ++ 4 files changed, 342 insertions(+), 77 deletions(-) create mode 100644 views/prints/printCreateold.ejs create mode 100644 views/scheduleOld.ejs diff --git a/views/prints/printCreate.ejs b/views/prints/printCreate.ejs index 6579b8c..99f6d42 100644 --- a/views/prints/printCreate.ejs +++ b/views/prints/printCreate.ejs @@ -1,63 +1,217 @@ -<%- include('../partials/header', {title:"Add Prints"}) -%> -

    Create New Print!

    -

    Please remember the rules for creating a print

    -
      -
    • Slice With Prusa Slicer --- Make Sure you are slicing for the right printer. It should be the third option on the right
    • -
    • Save your project (3MF/STL) to Google Drive
    • -
    • Reserve the right amount of time
    • -
    • You cannot print after school if you are not going to be there -- It is a Fire Hazard and the print will be stopped.
    • -
    - -If you don't remember how to slice your file visit the Guide for a refresher! - -
    - -
    - -
    -

    Please make sure to put your 3mf/STL file on Google Drive with PUBLIC access to anyone with the link.

    - -
    - - - -
    - -
    - - -
    - - - - -
    - -
    - - -

    - -
    - -<%- include('../partials/footer') -%> + + + + + Add Print + + + + + + + + + + + + + + +
    + <%-include("../partials/sidebar") %> + +
    +
    +
    +
    +

    Print Submission!

    +
    + +

    Please remember the rules for creating a print +

    +
      +
    • Slice With Prusa + Slicer --- Make Sure you are slicing for the right printer. It should be the third + option on the right
    • +
    • Save your project + (3MF/STL) to Google Drive
    • +
    • Reserve the right + amount of time
    • +
    • + You cannot print after school if you are not going to be there -- It is a Fire Hazard + and the print will be stopped.
    • +
    + + + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + + +
    + +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    + + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + + + +
    +
    + +
    +
    +
    + \ No newline at end of file diff --git a/views/prints/printCreateold.ejs b/views/prints/printCreateold.ejs new file mode 100644 index 0000000..6579b8c --- /dev/null +++ b/views/prints/printCreateold.ejs @@ -0,0 +1,63 @@ +<%- include('../partials/header', {title:"Add Prints"}) -%> +

    Create New Print!

    +

    Please remember the rules for creating a print

    +
      +
    • Slice With Prusa Slicer --- Make Sure you are slicing for the right printer. It should be the third option on the right
    • +
    • Save your project (3MF/STL) to Google Drive
    • +
    • Reserve the right amount of time
    • +
    • You cannot print after school if you are not going to be there -- It is a Fire Hazard and the print will be stopped.
    • +
    + +If you don't remember how to slice your file visit the Guide for a refresher! + +
    + +
    + +
    +

    Please make sure to put your 3mf/STL file on Google Drive with PUBLIC access to anyone with the link.

    + +
    + + + +
    + +
    + + +
    + + + + +
    + +
    + + +

    + +
    + +<%- include('../partials/footer') -%> diff --git a/views/schedule.ejs b/views/schedule.ejs index 9019a60..6382ae3 100644 --- a/views/schedule.ejs +++ b/views/schedule.ejs @@ -1,15 +1,48 @@ - -<%- include('partials/header', {title:"Schedule"}) -%> -

    Welcome to the Schedules Page!

    - - - Schedule - - -

    This Calendar includes all the Printers -- go to the arrow on the top right to remove visibility.

    - - - - - \ No newline at end of file + + + + Design Lab + + + + + + + + + + + + + +
    + <%-include("partials/sidebar") %> + +
    +
    +
    +
    +

    Printer Schedule

    +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    + \ No newline at end of file diff --git a/views/scheduleOld.ejs b/views/scheduleOld.ejs new file mode 100644 index 0000000..9019a60 --- /dev/null +++ b/views/scheduleOld.ejs @@ -0,0 +1,15 @@ + + +<%- include('partials/header', {title:"Schedule"}) -%> +

    Welcome to the Schedules Page!

    + + + Schedule + + +

    This Calendar includes all the Printers -- go to the arrow on the top right to remove visibility.

    + + + + + \ No newline at end of file From 909c838b4e9dad1770b51a9a8b75b86784d70059 Mon Sep 17 00:00:00 2001 From: ikopke23 Date: Mon, 13 Mar 2023 10:34:49 -0700 Subject: [PATCH 23/41] stuff --- controllers/prints_controller.js | 8 +++++--- views/prints/printCreate.ejs | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/controllers/prints_controller.js b/controllers/prints_controller.js index 9290a48..bb107b9 100644 --- a/controllers/prints_controller.js +++ b/controllers/prints_controller.js @@ -1,6 +1,7 @@ const express = require('express'), router = express.Router(); const fs = require('fs'); + const UUID = require('uuidv4') function loggedIn(request, response, next) { if (request.user) { @@ -57,14 +58,15 @@ router.get('/prints', function(request, response){ //used to be prints/printcreate router.post('/print', function(request,response){ let prints = JSON.parse(fs.readFileSync("../data/prints.json")); - let printName = request.body.printName; - + let printName = new UUID() + console.log(printName); + // console.log(prints); // console.log("PrintName = "+ printName); // console.log(request.body.width) if(request.body.printName && request.body.description && request.body.link && request.body.infill && request.body.width && request.body.time && request.body.printer && request.body.photo){ let newPrint = { - "name":printName, + "name":request.body.printName, "description":request.body.description, "link":request.body.link, "time":request.body.time, diff --git a/views/prints/printCreate.ejs b/views/prints/printCreate.ejs index 99f6d42..aa1a1b1 100644 --- a/views/prints/printCreate.ejs +++ b/views/prints/printCreate.ejs @@ -64,7 +64,7 @@
    -
    From 7b11b7501d20848eeddd4a7a152013a38ae1a506 Mon Sep 17 00:00:00 2001 From: ikopke23 Date: Tue, 14 Mar 2023 09:05:52 -0700 Subject: [PATCH 24/41] SASS????????????????/ --- controllers/prints_controller.js | 2 +- scss/custom.scss | 24 ++++++++++++++++++++++++ views/index.ejs | 2 +- views/prints/printCreate.ejs | 2 +- 4 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 scss/custom.scss diff --git a/controllers/prints_controller.js b/controllers/prints_controller.js index bb107b9..323d64f 100644 --- a/controllers/prints_controller.js +++ b/controllers/prints_controller.js @@ -1,7 +1,7 @@ const express = require('express'), router = express.Router(); const fs = require('fs'); - const UUID = require('uuidv4') + const UUID = require('uuid') function loggedIn(request, response, next) { if (request.user) { diff --git a/scss/custom.scss b/scss/custom.scss new file mode 100644 index 0000000..bb9b2fe --- /dev/null +++ b/scss/custom.scss @@ -0,0 +1,24 @@ +// Custom.scss +// Option B: Include parts of Bootstrap + +// 1. Include functions first (so you can manipulate colors, SVGs, calc, etc) +@import "../node_modules/bootstrap/scss/functions"; + +// 2. Include any default variable overrides here + +// 3. Include remainder of required Bootstrap stylesheets +@import "../node_modules/bootstrap/scss/variables"; +@import "../node_modules/bootstrap/scss/mixins"; + +// 4. Include any optional Bootstrap components as you like +@import "../node_modules/bootstrap/scss/root"; +@import "../node_modules/bootstrap/scss/reboot"; +@import "../node_modules/bootstrap/scss/type"; +@import "../node_modules/bootstrap/scss/images"; +@import "../node_modules/bootstrap/scss/containers"; +@import "../node_modules/bootstrap/scss/grid"; + +// 5. Add additional custom code here + + +$bg-gradient-info:( ) \ No newline at end of file diff --git a/views/index.ejs b/views/index.ejs index ef59d86..7182834 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -28,7 +28,7 @@
    -
    +

    Design Lab 2.0!

    diff --git a/views/prints/printCreate.ejs b/views/prints/printCreate.ejs index aa1a1b1..276eff4 100644 --- a/views/prints/printCreate.ejs +++ b/views/prints/printCreate.ejs @@ -55,7 +55,7 @@
    -
    +
    From 73941a3abc7e2a94972315179c4a7734017457a2 Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Fri, 17 Mar 2023 14:49:33 -0400 Subject: [PATCH 25/41] Adding SVGs --- controllers/printers_controller.js | 4 ++-- controllers/prints_controller.js | 2 +- controllers/svg._controller.js | 0 data/svgs.json | 0 models/svg_model.js | 0 server.js | 1 + 6 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 controllers/svg._controller.js create mode 100644 data/svgs.json create mode 100644 models/svg_model.js diff --git a/controllers/printers_controller.js b/controllers/printers_controller.js index 1648d2f..e1b107c 100644 --- a/controllers/printers_controller.js +++ b/controllers/printers_controller.js @@ -22,7 +22,7 @@ router.get('/printer', loggedIn, function(request, response){ }); //Used to be /report -router.get('/printer/allprints/report', loggedIn, function(request, response){ +router.get('/printer/report', loggedIn, function(request, response){ printerList = JSON.parse(fs.readFileSync('data/printers.json')) response.status(200); response.setHeader('Content-Type', 'text/html') @@ -32,7 +32,7 @@ router.get('/printer/allprints/report', loggedIn, function(request, response){ }); //used to be /report -router.post('/printer/allprints', function(request, response){ +router.post('/printer/report', function(request, response){ printerList = JSON.parse(fs.readFileSync('data/printers.json')) let name = request.body.printer; console.log("name = " + name); diff --git a/controllers/prints_controller.js b/controllers/prints_controller.js index 323d64f..03c9d41 100644 --- a/controllers/prints_controller.js +++ b/controllers/prints_controller.js @@ -12,7 +12,7 @@ function loggedIn(request, response, next) { } //used to be prints/allprints -router.get('/prints', function(request, response){ +router.get('/print', function(request, response){ response.status(200); response.setHeader('Content-Type', 'text/html') console.log(__dirname+"../data/prints.json"); diff --git a/controllers/svg._controller.js b/controllers/svg._controller.js new file mode 100644 index 0000000..e69de29 diff --git a/data/svgs.json b/data/svgs.json new file mode 100644 index 0000000..e69de29 diff --git a/models/svg_model.js b/models/svg_model.js new file mode 100644 index 0000000..e69de29 diff --git a/server.js b/server.js index 83c11b0..1a4cbef 100644 --- a/server.js +++ b/server.js @@ -20,6 +20,7 @@ app.use(require('./controllers/auth')); app.use(require('./controllers/index')); app.use(require('./controllers/prints_controller')); app.use(require('./controllers/printers_controller')); +app.use(require('./controllers/svg_controller')); app.use(require('./controllers/hofprints_controller')); app.use("", function(request, response) { From 40d209b3c1214484b3195a707f82a58ca47b0e93 Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Fri, 31 Mar 2023 11:30:17 -0400 Subject: [PATCH 26/41] adding some stuff --- controllers/index.js | 2 +- controllers/svg._controller.js | 0 server.js | 4 ++- views/guide.ejs | 2 +- views/index.ejs | 46 ++++---------------------------- views/partials/body.ejs | 6 +++++ views/partials/header.ejs | 48 ++++++++++++++++++++++------------ views/partials/sidebar.ejs | 2 +- views/schedule.ejs | 27 ++----------------- 9 files changed, 51 insertions(+), 86 deletions(-) delete mode 100644 controllers/svg._controller.js create mode 100644 views/partials/body.ejs diff --git a/controllers/index.js b/controllers/index.js index 978a590..d5c73ff 100644 --- a/controllers/index.js +++ b/controllers/index.js @@ -16,7 +16,7 @@ function loggedIn(request, response, next) { let keys = Object.keys(hofPrints) let randomKey = Math.floor(Math.random()*keys.length); let print = hofPrints[keys[randomKey]] - console.log(print) + // console.log(print) const date = new Date(); console.log(date) diff --git a/controllers/svg._controller.js b/controllers/svg._controller.js deleted file mode 100644 index e69de29..0000000 diff --git a/server.js b/server.js index 1a4cbef..f5a0a1e 100644 --- a/server.js +++ b/server.js @@ -20,13 +20,15 @@ app.use(require('./controllers/auth')); app.use(require('./controllers/index')); app.use(require('./controllers/prints_controller')); app.use(require('./controllers/printers_controller')); -app.use(require('./controllers/svg_controller')); +// app.use(require('./controllers/svg_controller')); app.use(require('./controllers/hofprints_controller')); app.use("", function(request, response) { response.redirect('/error?code=400'); }); + + //..............Start the server...............................// const port = process.env.PORT || 3000; app.listen(port, function() { diff --git a/views/guide.ejs b/views/guide.ejs index 49c1675..ac698b5 100644 --- a/views/guide.ejs +++ b/views/guide.ejs @@ -1,5 +1,5 @@ -<%- include('partials/header', {title:"Lean how to Print"}) -%> +<%- include('partials/header', {title:"Guide"}) -%> Hello World Adv Tips diff --git a/views/index.ejs b/views/index.ejs index 7182834..37f408e 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -1,36 +1,5 @@ - - +<%- include('partials/header', {title:"Design Lab 2.0"})-%> - - Design Lab - - - - - - - - - - - - - - -
    - <%-include("partials/sidebar") %> - -
    -
    -
    -
    -

    Design Lab 2.0!

    -
    @@ -50,17 +19,12 @@
    -
    +
    -
    - -
    -
    -
    - - - + +<%- include('partials/body')%> +<%- include('partials/footer')%> +
    +
    +
    + diff --git a/views/partials/header.ejs b/views/partials/header.ejs index fa3c07b..48a2db4 100644 --- a/views/partials/header.ejs +++ b/views/partials/header.ejs @@ -1,17 +1,33 @@ - - - - <%=title%> - - - - - - - - - - - - <%- include('navbar') -%> + + + + <%=title%> + + + + + + + + + + + + + + +
    + <%-include("sidebar") %> + +
    +
    +
    +
    +

    <%-title%>>

    +
    \ No newline at end of file diff --git a/views/partials/sidebar.ejs b/views/partials/sidebar.ejs index 834abb4..fa07f32 100644 --- a/views/partials/sidebar.ejs +++ b/views/partials/sidebar.ejs @@ -17,7 +17,7 @@
  • Home
  • Add Print
  • Schedule
  • -
  • Guide
  • +
  • Guide
  • diff --git a/views/schedule.ejs b/views/schedule.ejs index 6382ae3..61403d2 100644 --- a/views/schedule.ejs +++ b/views/schedule.ejs @@ -1,28 +1,5 @@ - - +<%- include('partials/header', {title:"Schedule"})-%> - - Design Lab - - - - - - - - - - - - - -
    - <%-include("partials/sidebar") %>
    @@ -41,7 +18,7 @@
    - +
    From 441b98e88b27c3ae4d205c65cba3c9ab82a1c60f Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Mon, 3 Apr 2023 02:24:19 -0400 Subject: [PATCH 27/41] adding SVG stuff --- views/index.ejs | 12 ++-- views/partials/header.ejs | 4 +- views/partials/sidebar.ejs | 3 +- views/partials/userHeader.ejs | 33 ++++++++++ views/partials/userSidebar | 57 ++++++++++++++++++ views/prints/printCreate.ejs | 109 +--------------------------------- views/prints/printDetails.ejs | 1 + views/svgs/allSvgs.ejs | 0 views/svgs/svgDetails.ejs | 42 +++++++++++++ views/svgs/svgEdit.ejs | 10 ++++ views/svgs/svgNew.ejs | 10 ++++ 11 files changed, 166 insertions(+), 115 deletions(-) create mode 100644 views/partials/userHeader.ejs create mode 100644 views/partials/userSidebar create mode 100644 views/svgs/allSvgs.ejs create mode 100644 views/svgs/svgDetails.ejs create mode 100644 views/svgs/svgEdit.ejs create mode 100644 views/svgs/svgNew.ejs diff --git a/views/index.ejs b/views/index.ejs index 37f408e..b6b14e6 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -1,6 +1,8 @@ -<%- include('partials/header', {title:"Design Lab 2.0"})-%> - - +<%if(user == null){%> + <%- include('partials/header', {title:"Design Lab 2.0"})-%> +<%}else {%> + <%- include('partials/userHeader', {title:"Design Lab 2.0"})-%> +<%}%>

    @@ -23,8 +25,8 @@

    -<%- include('partials/body')%> -<%- include('partials/footer')%> +<%- include('partials/body')-%> +
    -

    <%-title%>>

    +

    <%-title%>

    \ No newline at end of file diff --git a/views/partials/sidebar.ejs b/views/partials/sidebar.ejs index fa07f32..04ee887 100644 --- a/views/partials/sidebar.ejs +++ b/views/partials/sidebar.ejs @@ -15,9 +15,10 @@ diff --git a/views/partials/userHeader.ejs b/views/partials/userHeader.ejs new file mode 100644 index 0000000..5a5bbce --- /dev/null +++ b/views/partials/userHeader.ejs @@ -0,0 +1,33 @@ + + + + + <%=title%> + + + + + + + + + + + + + + +
    + <%-include("userSidebar")-%> + +
    +
    +
    +
    +

    <%-title%>

    +
    \ No newline at end of file diff --git a/views/partials/userSidebar b/views/partials/userSidebar new file mode 100644 index 0000000..2ee1307 --- /dev/null +++ b/views/partials/userSidebar @@ -0,0 +1,57 @@ +
    + + + + + Design Lab + +
    + +
    +

    Email

    +
    +
    +
    + Admined By General Rose +
    +
    \ No newline at end of file diff --git a/views/prints/printCreate.ejs b/views/prints/printCreate.ejs index 276eff4..ad438d2 100644 --- a/views/prints/printCreate.ejs +++ b/views/prints/printCreate.ejs @@ -1,36 +1,5 @@ - - +<%- include('partials/header', {title:"<%=svg[name]%>"})-%> - - Add Print - - - - - - - - - - - - - - -
    - <%-include("../partials/sidebar") %> - -
    -
    -
    -
    -

    Print Submission!

    -

    Please remember the rules for creating a print

    @@ -139,79 +108,5 @@
    - - - - -
    -
    -
    -
    -
    - \ No newline at end of file +<%- include('partials/body')-%> \ No newline at end of file diff --git a/views/prints/printDetails.ejs b/views/prints/printDetails.ejs index c95b3f7..61504c0 100644 --- a/views/prints/printDetails.ejs +++ b/views/prints/printDetails.ejs @@ -51,3 +51,4 @@ +<%- include('partials/body')-%> \ No newline at end of file diff --git a/views/svgs/allSvgs.ejs b/views/svgs/allSvgs.ejs new file mode 100644 index 0000000..e69de29 diff --git a/views/svgs/svgDetails.ejs b/views/svgs/svgDetails.ejs new file mode 100644 index 0000000..06fbd83 --- /dev/null +++ b/views/svgs/svgDetails.ejs @@ -0,0 +1,42 @@ +<%- include('partials/header', {title:"<%=svg[name]%>"})-%> + + +
    + "> +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    <%=svg["name"]%>
    Description:<%=svg["description"]%>
    Material:<%=svg["material"]%>
    Date<%= svg{"date"]%>
    Laser width<%=svg['width"]%>
    " target="_blank">Link
    /edit">Edit
    + +
    + + +<%- include('partials/body')-%> \ No newline at end of file diff --git a/views/svgs/svgEdit.ejs b/views/svgs/svgEdit.ejs new file mode 100644 index 0000000..39a8e8b --- /dev/null +++ b/views/svgs/svgEdit.ejs @@ -0,0 +1,10 @@ +<%- include('partials/userHeader', {title:"<%=svg[name]%>"})-%> + + + +
    + +
    + + +<%- include('partials/body')-%> \ No newline at end of file diff --git a/views/svgs/svgNew.ejs b/views/svgs/svgNew.ejs new file mode 100644 index 0000000..39a8e8b --- /dev/null +++ b/views/svgs/svgNew.ejs @@ -0,0 +1,10 @@ +<%- include('partials/userHeader', {title:"<%=svg[name]%>"})-%> + + + +
    + +
    + + +<%- include('partials/body')-%> \ No newline at end of file From 251b2e747112c615aa7524c550f1d609a19a457c Mon Sep 17 00:00:00 2001 From: ikopke23 <90466377+ikopke23@users.noreply.github.com> Date: Mon, 3 Apr 2023 03:43:40 -0400 Subject: [PATCH 28/41] bruh --- controllers/auth.js | 2 +- controllers/index.js | 9 ++++- controllers/prints_controller.js | 7 ++-- public/css/sb-admin-2.min.css | 4 +- .../partials/{userSidebar => userSidebar.ejs} | 6 ++- views/prints/allPrints.ejs | 39 ++++++++++--------- views/schedule.ejs | 6 --- 7 files changed, 38 insertions(+), 35 deletions(-) rename views/partials/{userSidebar => userSidebar.ejs} (89%) diff --git a/controllers/auth.js b/controllers/auth.js index e0fe461..9636026 100644 --- a/controllers/auth.js +++ b/controllers/auth.js @@ -6,7 +6,7 @@ const GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; const KEYS = require('../config/keys.json'); //keeping our secrets out of our main application is a security best practice //we can add /config/keys.json to our .gitignore file so that we keep it local/private -console.log(KEYS); +// console.log(KEYS); let userProfile; //only used if you want to see user info beyond username const User = require('../models/user_model'); diff --git a/controllers/index.js b/controllers/index.js index d5c73ff..fca05db 100644 --- a/controllers/index.js +++ b/controllers/index.js @@ -19,11 +19,16 @@ function loggedIn(request, response, next) { // console.log(print) const date = new Date(); console.log(date) - + let userTest + if (request.user) { + let userTest = request.user["displayName"] + } + console.log("userTest = "+ userTest+ ", request,user = " + request.user); response.status(200); response.setHeader('Content-Type', 'text/html'); response.render("index", { - hofPrint :print, + user: userTest, + hofPrint: print, printers: JSON.parse(fs.readFileSync('data/printers.json')) }) diff --git a/controllers/prints_controller.js b/controllers/prints_controller.js index 03c9d41..f045e97 100644 --- a/controllers/prints_controller.js +++ b/controllers/prints_controller.js @@ -15,9 +15,10 @@ function loggedIn(request, response, next) { router.get('/print', function(request, response){ response.status(200); response.setHeader('Content-Type', 'text/html') - console.log(__dirname+"../data/prints.json"); + console.log(__dirname+"/../data/prints.json"); + let printsJSON = JSON.parse(fs.readFileSync(__dirname+"/../data/prints.json")) response.render("prints/allPrints", { - prints : JSON.parse(fs.readFileSync("../data/prints.json")) + prints : printsJSON }) }); @@ -30,7 +31,7 @@ router.get('/print', function(request, response){ //used to be prints/:printname router.get('/prints/:id', loggedIn, function(request, response){ - let prints = JSON.parse(fs.readFileSync("/../data/prints.json")) + let prints = JSON.parse(fs.readFileSync("../data/prints.json")) console.log("/prints/:printName") let printName = request.params.printName; // console.log("printName = "+printName) diff --git a/public/css/sb-admin-2.min.css b/public/css/sb-admin-2.min.css index ecd25c9..657c3a9 100644 --- a/public/css/sb-admin-2.min.css +++ b/public/css/sb-admin-2.min.css @@ -61,7 +61,7 @@ body { font-size: 1rem; font-weight: 400; line-height: 1.5; - color: #858796; + /* color: #858796; */ text-align: left; background-color: #fff } @@ -387,7 +387,7 @@ template { line-height: 1.2 } -hr { +hr :not(.divid) { margin-top: 1rem; margin-bottom: 1rem; border: 0; diff --git a/views/partials/userSidebar b/views/partials/userSidebar.ejs similarity index 89% rename from views/partials/userSidebar rename to views/partials/userSidebar.ejs index 2ee1307..5125f05 100644 --- a/views/partials/userSidebar +++ b/views/partials/userSidebar.ejs @@ -14,10 +14,12 @@
    @@ -30,7 +32,7 @@